diff --git a/module01/ex01/main.c b/module01/ex01/main.c index 22b351c..26dc663 100644 --- a/module01/ex01/main.c +++ b/module01/ex01/main.c @@ -5,6 +5,7 @@ #include "timer.h" #define PERIOD 500 +#define PRESCALE_VALUE 1024 // can be 1, 8, 64, 256, 1024 // led turns on and off every PERIOD ms using CTC timer int main() { @@ -14,7 +15,7 @@ int main() { TCCR1A |= (1 << COM1A0); // 14.3.1 : set Compare Output with COM1A0, it toggles OC1A on compare match (Table 16-1), OC1A is alternate function for PORTB1 (Table 14-3) - OCR1A = TIME_MS(PERIOD); // Table 16-4 : set CTC compare value on channel A, the counter is cleared to zero when the counter value (TCNT1) matches the OCR1A register + OCR1A = TIME_MS(PERIOD, PRESCALE_VALUE); // Table 16-4 : set CTC compare value on channel A, the counter is cleared to zero when the counter value (TCNT1) matches the OCR1A register TCCR1B |= (PRESCALE_SET(PRESCALE_VALUE)); diff --git a/module01/ex01/timer.h b/module01/ex01/timer.h index 3cb618e..c9d5f0e 100644 --- a/module01/ex01/timer.h +++ b/module01/ex01/timer.h @@ -1,7 +1,6 @@ #ifndef TIMER_H #define TIMER_H -#define PRESCALE_VALUE 1024 // can be 1, 8, 64, 256, 1024 // table 16-5 : prescale sets #define PRESCALE_SET(value) \ ((value) == 1 ? (0< OC1A (alternate function of PORTB1, aka LED2) is cleared when TCNT1 (the counter value) equals OCR1A + OCR1A = TIME_MS(PERCENT(DUTY_CYCLE, PERIOD), PRESCALE_VALUE); // 16.9.3 : set the duty cycle to DUTY_CYCLE% of the time on channel A -> OC1A (alternate function of PORTB1, aka LED2) is cleared when TCNT1 (the counter value) equals OCR1A - TCCR1B |= (PRESCALE_SET(PRESCALE_VALUE)); // start the timer with the prescaler + TCCR1B |= (PRESCALE_SET(PRESCALE_VALUE)); // start the timer with the prescaler while(1); } \ No newline at end of file diff --git a/module01/ex02/timer.h b/module01/ex02/timer.h index 3cb618e..c9d5f0e 100644 --- a/module01/ex02/timer.h +++ b/module01/ex02/timer.h @@ -1,7 +1,6 @@ #ifndef TIMER_H #define TIMER_H -#define PRESCALE_VALUE 1024 // can be 1, 8, 64, 256, 1024 // table 16-5 : prescale sets #define PRESCALE_SET(value) \ ((value) == 1 ? (0<duty_cycle < params->max) { params->duty_cycle += 10; } - OCR1A = TIME_MS(PERCENT(params->duty_cycle, PERIOD)); + OCR1A = TIME_MS(PERCENT(params->duty_cycle, PERIOD), PRESCALE_VALUE); } void decrement_duty_cycle(void *param) { @@ -39,7 +40,7 @@ void decrement_duty_cycle(void *param) { if(params->duty_cycle > params->min) { params->duty_cycle -= 10; } - OCR1A = TIME_MS(PERCENT(params->duty_cycle, PERIOD)); + OCR1A = TIME_MS(PERCENT(params->duty_cycle, PERIOD), PRESCALE_VALUE); } void on_press(int bit, void (*action)(void*), void *params) { @@ -62,16 +63,16 @@ int main() { MODE_OUTPUT(LED2); - TCCR1A |= FAST_PWM_TOP_ICR1_IN_TCCR1A; // Table 16-4 : set timer in Fast PWM (Pulse With Modulation) mode with TOP = ICR1 (Mode 14) + TCCR1A |= FAST_PWM_TOP_ICR1_IN_TCCR1A; // Table 16-4 : set timer in Fast PWM (Pulse With Modulation) mode with TOP = ICR1 (Mode 14) TCCR1B |= FAST_PWM_TOP_ICR1_IN_TCCR1B; - SET(TCCR1A, COM1A1); // 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); // 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) - ICR1 = TIME_MS(PERIOD); // Table 16-4 : set the period (compare TOP value) + ICR1 = TIME_MS(PERIOD, PRESCALE_VALUE); // Table 16-4 : set the period (compare TOP value) - OCR1A = TIME_MS(PERCENT(DUTY_CYCLE, PERIOD)); // 16.9.3 : set the duty cycle to DUTY_CYCLE% of the time in channel A -> OC1A (alternate function of PORTB1, aka LED2) is cleared when TCNT1 (the counter value) equals OCR1A + OCR1A = TIME_MS(PERCENT(DUTY_CYCLE, PERIOD), PRESCALE_VALUE); // 16.9.3 : set the duty cycle to DUTY_CYCLE% of the time in channel A -> OC1A (alternate function of PORTB1, aka LED2) is cleared when TCNT1 (the counter value) equals OCR1A - TCCR1B |= (PRESCALE_SET(PRESCALE_VALUE)); // start the timer with the prescaler + TCCR1B |= (PRESCALE_SET(PRESCALE_VALUE)); // start the timer with the prescaler while(1) { on_press(SW1, increment_duty_cycle, ¶ms); diff --git a/module01/ex03/timer.h b/module01/ex03/timer.h index 3cb618e..c9d5f0e 100644 --- a/module01/ex03/timer.h +++ b/module01/ex03/timer.h @@ -1,7 +1,6 @@ #ifndef TIMER_H #define TIMER_H -#define PRESCALE_VALUE 1024 // can be 1, 8, 64, 256, 1024 // table 16-5 : prescale sets #define PRESCALE_SET(value) \ ((value) == 1 ? (0<