diff --git a/module01/ex02/main.c b/module01/ex02/main.c index e60fb16..91ce870 100644 --- a/module01/ex02/main.c +++ b/module01/ex02/main.c @@ -1,75 +1,114 @@ +// #include + +// // #define FIRST_LETTER_IMPL(x) #x[0] +// // #define FIRST_LETTER(x) FIRST_LETTER_IMPL(x) +// // #define PORT_LETTER(PIN) FIRST_LETTER(PIN) + +// // global registers +// #define SET(register, bit) register |= 1 << bit +// #define CLEAR(register, bit) register &= ~(1 << bit) +// #define TEST(register, bit) register & 1 << bit +// #define TOGGLE(register, bit) register ^= 1 << bit + +// // actions on ports +// #define TEST_PIN(port, bit) TEST(PIN ## port, bit) +// #define TOGGLE_PIN(port, bit) SET(PIN ## port, bit) +// #define MODE_INPUT(port, bit) CLEAR(DDR ## port, bit) +// #define MODE_OUTPUT(port, bit) SET(DDR ## port, bit) +// #define IS_PIN_SET(port, bit) (TEST_PIN(port, bit)) == 0 +// #define IS_PIN_CLEAR(port, bit) (TEST_PIN(port, bit)) == 1 +// #define TURN_ON(_PORT, BIT) SET(PORT ## _PORT, BIT) +// #define TURN_OFF(_PORT, BIT) CLEAR(PORT ## _PORT, BIT) + +// // LEDs +// #define TURN_ON_LED(bit) SET(PORTB, bit) +// #define TURN_OFF_LED(bit) CLEAR(PORTB, bit) +// #define TOGGLE_LED(led) TOGGLE_PIN(B, led) + +// // ELEMENTS +// #define D1 0 +// #define D2 1 +// #define D3 2 +// #define D4 4 +// #define SW1 2 +// #define SW2 4 + +// // TIME +// #define PRESCALE_VALUE 1024 +// #if (PRESCALE_VALUE == 1) +// #define PRESCALE_SET (1 << CS10) +// #elif (PRESCALE_VALUE == 8) +// #define PRESCALE_SET (1 << CS11) +// #elif (PRESCALE_VALUE == 64) +// #define PRESCALE_SET (1 << CS10) | (1 << CS11) +// #elif (PRESCALE_VALUE == 256) +// #define PRESCALE_SET (1 << CS12) +// #elif (PRESCALE_VALUE == 1024) +// #define PRESCALE_SET (1 << CS10) | (1 << CS12) +// #endif +// #define TIME_MS(ms) (((F_CPU / PRESCALE_VALUE) * ms) / 1000) + +// int main() { +// MODE_OUTPUT(B, D2); +// TURN_ON(B, D2); +// } + +////////////////////////////////////////////// + +#include #include -// #define FIRST_LETTER_IMPL(x) #x[0] -// #define FIRST_LETTER(x) FIRST_LETTER_IMPL(x) -// #define PORT_LETTER(PIN) FIRST_LETTER(PIN) +// stringify +#define STRINGIFY_HELPER(x) #x +#define STRINGIFY(x) STRINGIFY_HELPER(x) -// global registers +// concatenate +#define CONCAT_HELPER(x, y) x ## y +#define CONCAT(x, y) CONCAT_HELPER(x, y) + +// get argument +#define ARG_1(v1, v2) v1 +#define ARG_2(v1, v2) v2 +#define GET_PORT(args) ARG_1 args +#define GET_BIT(args) ARG_2 args + +// actions on registers #define SET(register, bit) register |= 1 << bit #define CLEAR(register, bit) register &= ~(1 << bit) #define TEST(register, bit) register & 1 << bit #define TOGGLE(register, bit) register ^= 1 << bit -// actions on ports -#define TEST_PIN(port, bit) TEST(PIN ## port, bit) -#define TOGGLE_PIN(port, bit) SET(PIN ## port, bit) -#define MODE_INPUT(port, bit) CLEAR(DDR ## port, bit) -#define MODE_OUTPUT(port, bit) SET(DDR ## port, bit) -#define IS_PIN_SET(port, bit) (TEST_PIN(port, bit)) == 0 -#define IS_PIN_CLEAR(port, bit) (TEST_PIN(port, bit)) == 1 -#define TURN_ON(_PORT, BIT) SET(PORT ## _PORT, BIT) -#define TURN_OFF(_PORT, BIT) CLEAR(PORT ## _PORT, BIT) - -// LEDs -#define TURN_ON_LED(bit) SET(PORTB, bit) -#define TURN_OFF_LED(bit) CLEAR(PORTB, bit) -#define TOGGLE_LED(led) TOGGLE_PIN(B, led) - -// ELEMENTS -#define D1 0 -#define D2 1 -#define D3 2 -#define D4 4 -#define SW1 2 -#define SW2 4 - -// TIME -#define PRESCALE_VALUE 1024 -#if (PRESCALE_VALUE == 1) - #define PRESCALE_SET (1 << CS10) -#elif (PRESCALE_VALUE == 8) - #define PRESCALE_SET (1 << CS11) -#elif (PRESCALE_VALUE == 64) - #define PRESCALE_SET (1 << CS10) | (1 << CS11) -#elif (PRESCALE_VALUE == 256) - #define PRESCALE_SET (1 << CS12) -#elif (PRESCALE_VALUE == 1024) - #define PRESCALE_SET (1 << CS10) | (1 << CS12) -#endif -#define TIME_MS(ms) (((F_CPU / PRESCALE_VALUE) * ms) / 1000) - -int main() { - MODE_OUTPUT(B, D2); - - TCCR1B |= (1 << WGM12); // set timer in CTC (Clear Time on Compare) mode - // -> Table 16-4 : use bit WGM12 to set mode ctc - // -> 16.11.2 : bit WGM12 is located in register TCCR1B - - TCCR1A |= (1 << COM1A0 ) ; // Enable timer 1 Compare Output channel A in toggle mode - // -> Table 14-3 : alternate functions for PORTB1 is OC1A (Timer/Counter1 Output Compare Match A Output) - // -> 14.3.1 : OC1A/PCINT1 – Port B, Bit 1 - - OCR1A = TIME_MS(500); // set CTC compare value - // -> Table 16-4 : the value to reset the timer is the Output Compare Registers OCR1A - - TCCR1B |= (PRESCALE_SET); - - while(1) { - continue; - } -} +// actions on elements +#define SET_ELEM(elem) SET(CONCAT(PORT, GET_PORT(elem)), GET_BIT(elem)) +#define CLEAR_ELEM(elem) CLEAR(CONCAT(PORT, GET_PORT(elem)), GET_BIT(elem)) +#define TEST_ELEM(elem) TEST(CONCAT(PORT, GET_PORT(elem)), GET_BIT(elem)) +#define TOGGLE_ELEM(elem) TOGGLE(CONCAT(PORT, GET_PORT(elem)), GET_BIT(elem)) +#define MODE_OUTPUT(elem) SET(CONCAT(DDR, GET_PORT(elem)), GET_BIT(elem)) +#define MODE_INPUT(elem) CLEAR(CONCAT(DDR, GET_PORT(elem)), GET_BIT(elem)) +#define TOGGLE_PIN(elem) SET(CONCAT(PIN, GET_PORT(elem)), GET_BIT(elem)) +#define TEST_PIN(elem) (TEST(CONCAT(PIN, GET_PORT(elem)), GET_BIT(elem))) +// bits +#define D1 0 +#define D2 1 +#define D3 2 +#define D4 4 +#define SW1 2 +#define SW2 4 +// elements (port, bit) +#define LED1 (B, D1) +#define LED2 (B, D2) +#define LED3 (B, D3) +#define LED4 (B, D4) +#define BUTTON1 (D, SW1) +#define BUTTON2 (D, SW2) +int main() +{ + MODE_OUTPUT(LED1); + SET_ELEM(LED1); + return 0; +} \ No newline at end of file