Hallo,
kann man mit den beiden 16-Bit Timern (Timer 1 und 3 beim mega162) 4
verschiedene CTC realisieren? Ich habe nämlich mal als Testprogramm
beide Timer auf CTC eingestellt mit verschiedenen Vorteilern, Timer 1
PRSC=1024 und Timer 3 PRSC=1. Um dann 4 CTC's zu realisieren, können
beide Kanäle (A und B) jeweils eines Timers mit verschiedenen
Compare-Match-Werten gealden werden. Somit wären 4 CTC's da, nämlich aus
Timer:
1A, Vorteiler = 1024, OCR1A = 7199, Interrupt alle 1 Sek.
1B, Vorteiler = 1024, OCR1B = 7, Int. alle 1 ms
3A, Vorteiler = 1, OCR3A = 737, Int. alle 100 µs
3B, Vorteiler = 1, OCR3B = 7680, Int. alle 1,04 ms
Um zu sehen, ob dem wirklich so ist, habe ich in jeder zugehörigen ISR
einen Port getoggled. Die ISR zum Timer 1A toggled Portpin PA0, Timer 1B
toggled Portpin PB0, Timer 3A Portpin PC0 und Timer 3B Portpin PD7.
Ergebnis: Port A und B (jewels nur eine LED an PA0 und PB0) machen einen
Wechselblinker im Sekundentakt, LED an PC0 "blinkt" im 100µs Takt (ok!)
und die LED an PD7 (PD0 ist serielle Schnitte & belegt) macht garnix.
Der Quarz hat übrigens ein 7,372800 MHz.
Das Proggi dazu, komplett
1 | #include <stdio.h>
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 |
|
5 | ISR(SIG_OUTPUT_COMPARE1A)
|
6 | { PORTA = ~PORTA; }
|
7 |
|
8 | ISR(SIG_OUTPUT_COMPARE1B)
|
9 | { PORTB = ~PORTB; }
|
10 |
|
11 | ISR(SIG_OUTPUT_COMPARE3A)
|
12 | { PORTC = ~PORTC; }
|
13 |
|
14 | ISR(SIG_OUTPUT_COMPARE3B)
|
15 | { PORTD = ~PORTD; }
|
16 |
|
17 | int main(void)
|
18 | {
|
19 | OCR1A = 7190;
|
20 | OCR1B = 7;
|
21 | TCCR1B = (1<<WGM12) | (1<<CS12) | (1<<CS10); // Prescaler = 1024, CTC Modus
|
22 |
|
23 | OCR3A = 737; // Compare Match Register Timer 3A, 0,1 ms @7.3728MHz
|
24 | OCR3B = 7680; // Compare Match Register Timer 3B, 1,0 ms @7.3728MHz
|
25 | TCCR3B = (1<<WGM32) | (1<<CS30); // Prescaler = 1, CTC Modus
|
26 |
|
27 | TIMSK = (1<<OCIE1A) | (1<<OCIE1B); // Int. freigeben
|
28 | ETIMSK = (1<<OCIE3A) | (1<<OCIE3B);
|
29 |
|
30 | DDRA = 0x0F; // Portpins auf Ausgang
|
31 | DDRB = 0x01;
|
32 | DDRC = 0xFF;
|
33 | DDRD = 0xF0;
|
34 | PORTA = 0;
|
35 | PORTB = 0;
|
36 | PORTC = 0;
|
37 | PORTD = 0;
|
38 |
|
39 | sei();
|
40 |
|
41 | while(1)
|
42 | ;
|
43 | return 0;
|
44 | }
|
Warum verhält nur der Portpin PA0 und PC0 richtig? Warum blinkt PB0 mit
PA0 mit, aber invertiert? Warum mach PD7 nix?