Hallo zusammen,
bin programmiertechnisch noch Anfänger und habe ein (vermutlich) kleines
Problem, komme aber einfach nicht auf die Lösung. Hoffe es hilft mir
jemand.
Habe 8 IR-LEDs an meinen ATMEGA 644 (20MHz) angeschlossen und möchte
jeweils 4 im Gegentakt zu den anderen Toggeln lassen.
Jedoch schaffe ich es nur, dass 4 Toggeln, die anderen bleiben dauerhaft
aus.
Prinzipiell versuch ichs mit CTC Timer und Compare Match Interrupt:
(nachfolgend nur Auszug aus dem Programm; Bib-Einbindung, u.ä ist
natürlich erfolgt...)
1 | TCCR0A = (1<<WGM01); // CTC
|
2 | TCCR0B = (1<<CS02) | (1<<CS00); // Prescaler 1024
|
3 | OCR0A = 194; //20MHz/1024/194 ~ 100Hz
|
4 | TIMSK0 = (1<<OCIE0A);
|
5 | sei();
|
6 |
|
7 | uinit8_t ir_zaehler;
|
8 |
|
9 | ISR (TIMER0_COMPA_vect)
|
10 | {
|
11 | if (ir_zaehler) ir_zaehler--;
|
12 | }
|
Und aus der Main-Programm rufe ich dann folgende Funktion auf:(hier nur
mit 2 verschiedenen LEDs am PORTC)
1 | void ir_blink (void)
|
2 | {
|
3 | if (ir_zaehler == 0)
|
4 | {
|
5 | PORTC ^= (1<<PC0) | (0<<PC1);
|
6 | ir_zaehler = 1;
|
7 | }
|
8 |
|
9 | }
|
Nunja... LED1 am PC0 toggelt wunderbar vor sich hin. LED2 am PC1 bleibt
jedoch dunkel.
Hätte jemand bitte ne Erklärung dafür und evtl. noch nen
Lösungsvorschlag?
Ach und nebenbei: Aus irgendeinem Grund stimmt die Zeit auch nicht. D.h.
laut den Berechnungen wird der Timer alle 10ms aufgerufen. Das heißt
aufgrund dessen dass der ir_zaehler nur auf 1 gesetzt wird, müssten die
LEDs im 10ms Rhythmus blinken...jedoch sind es schon eher 0,5s (250ms
aus/ 250ms an). Wenn mir auch hierbei jemand helfen könnte wär ich sehr
dankbar...