diff --git a/README.md b/README.md index 4029e34..3e3c766 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # RESSOURCES +- guide survie piscine embarquee : https://42chips.notion.site/survive - atmega328p : https://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf - Getting started with AVR programming : https://github.com/m3y54m/start-avr/tree/master - avrdude doc : https://avrdudes.github.io/avrdude/ diff --git a/module01/ex01/main.c b/module01/ex01/main.c index ca7bdea..7330abc 100644 --- a/module01/ex01/main.c +++ b/module01/ex01/main.c @@ -72,7 +72,7 @@ int main() { // -> 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 + 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 diff --git a/module01/ex02/main.c b/module01/ex02/main.c index c895060..2a60ece 100644 --- a/module01/ex02/main.c +++ b/module01/ex02/main.c @@ -48,12 +48,47 @@ #define BUTTON1 (D, SW1) #define BUTTON2 (D, SW2) +// 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) +#define PERIOD 1000 +#define DUTY_CYCLE 10 + // END MACROS -int main() -{ - MODE_OUTPUT(LED1); - SET_ELEM(LED1); - return 0; +int main() { + MODE_OUTPUT(LED2); + + // Table 16-4 : set timer in Fast PWM (Pulse With Modulation) mode with TOP = ICR1 (Mode 14) + SET(TCCR1A, WGM11); + SET(TCCR1B, WGM12); + SET(TCCR1B, WGM13); + + // Table 16-2 : Non-inverting mode, the LED will be ON for DUTY_CYCLE% of the time (CLEAR OC1A on compare match, SET OC1A at BOTTOM) + SET(TCCR1A, COM1A1); + + // set the period (compare TOP value) + ICR1 = TIME_MS(PERIOD); + + // set the duty cycle to DUTY_CYCLE% of the time + OCR1A = TIME_MS(DUTY_CYCLE); + + // start the timer with the prescaler + TCCR1B |= (PRESCALE_SET); + + while(1) { + continue; + } } \ No newline at end of file