From fc77fb174904902ab18c41e0c75708dd7c96b0a3 Mon Sep 17 00:00:00 2001 From: hugo LAMY Date: Wed, 12 Mar 2025 10:01:52 +0100 Subject: [PATCH] mod04 ex01 ok but not accurate --- module04/ex01/main.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/module04/ex01/main.c b/module04/ex01/main.c index 8711ec1..886108e 100644 --- a/module04/ex01/main.c +++ b/module04/ex01/main.c @@ -25,7 +25,13 @@ // - 8 : (16000000 / 8) * 0.01 = 2000000 * 0.01 = 20000 "ticks" // - 64 : (16000000 / 64) * 0.01 = 250000 * 0.01 = 2500 "ticks" // - 256 : (16000000 / 256) * 0.01 = 62500 * 0.01 = 625 "ticks" -// - 1024 : (16000000 / 1024) * 0.01 = 15625 * 0.01 = 156,25 "ticks" +// - 1024 : (16000000 / 1024) * 0.01 = 15625 * 0.01 = 156.25 "ticks" +// - after how many "ticks" do i need to reset my clock, for a duration of 0.005s (*200/s), for every prescalers : +// - 1 : (16000000 / 1) * 0.005 = 16000000 * 0.005 = 80000 "ticks" +// - 8 : (16000000 / 8) * 0.005 = 2000000 * 0.005 = 10000 "ticks" +// - 64 : (16000000 / 64) * 0.005 = 250000 * 0.005 = 1250 "ticks" +// - 256 : (16000000 / 256) * 0.005 = 62500 * 0.005 = 312.5 "ticks" +// - 1024 : (16000000 / 1024) * 0.005 = 15625 * 0.005 = 78.125 "ticks" // alternatively, can use the default values : // - Fast PWM, 8-bit, TOP 0x00FF (255) @@ -50,13 +56,13 @@ // 16.9.3 : timer1 fast PWM // TIMER 1 -#define T1_PWM_PRESCALER 256 // can be 1, 8, 64, 256, 1024 +#define T1_PWM_PRESCALER 256 // can be 1, 8, 64, 256, 1024 #define T1_DUTY_CYCLE_PERCENT 9 // #define FREQUENCY_MS 1 #define T1_TOP_VALUE 1000 // TIMER 0 -#define T0_PWM_PRESCALER 256 // can be 1, 8, 64, 256, 1024 -#define T0_FREQUENCY_MS 20 +#define T0_PWM_PRESCALER 1024 // can be 1, 8, 64, 256, 1024 +#define T0_FREQUENCY_MS 5 typedef enum { DOWN, @@ -66,6 +72,7 @@ typedef enum { volatile uint8_t duty_cycle = T1_DUTY_CYCLE_PERCENT; volatile Slope slope = UP; +// using TIMER 1 void blink_led_1() { TCCR1A = (1 << WGM11); // Table 16-4 : set timer1 in fast PWM mode 14, with TOP ICR1, so we can use OCR1A for duty cycle and keep ICR1 for frequency TCCR1B = (1 << WGM13) | (1 << WGM12); // mode 15 with OCR1A TOP prevent using duty cycle trigger on OC1A (OCR1B is free but triggers OC1B -> PB2) @@ -80,14 +87,15 @@ void blink_led_1() { OCR1A = PERCENT(duty_cycle, ICR1); // 16.9.3 : duty cycle } +// using TIMER 0 void vary_duty() { - TCCR0A = (1 << WGM11); // Table 15-8 : set timer0 in CTC mode, with TOP OCRA (15.9.1 : WGM11 in register TCCR0A) + TCCR0A = (1 << WGM01); // Table 15-8 : set timer0 in CTC mode, with TOP OCRA (15.9.1 : WGM01 in register TCCR0A) OCR0A = TIME_MS(T0_FREQUENCY_MS, T0_PWM_PRESCALER); // 15.9.4 : compare value to trigger an Output Compare interrupt on register A TCCR0B |= T0_PRESCALE_SET(T0_PWM_PRESCALER); // 15.9.2 : set the appropriate prescale values for timer 0 - TIMSK0 = (1 << OCIE0A); // 15.9.6 : set OCIE0A in TIMSK0 to enable Compare Match A interrupt in Timer0 + TIMSK0 = (1 << OCIE0A); // 15.9.6 : enable interrupt in timer 0 } // use timers interruptions to varie led1 intensity using duty cycle, from 0% to 100% to 0% in 1 second @@ -113,16 +121,18 @@ int main() { ISR(TIMER0_COMPA_vect) { if (slope == UP) { if (duty_cycle >= 100) { + duty_cycle = 100; slope = DOWN; } else { - duty_cycle += 2; + duty_cycle += 1; } - } - if (slope == DOWN) { + } else if (slope == DOWN) { if (duty_cycle <= 0) { + duty_cycle = 0; slope = UP; } else { - duty_cycle -= 2; + duty_cycle -= 1; } } + OCR1A = PERCENT(duty_cycle, ICR1); } \ No newline at end of file