Guten Abend, schon seit Tagen versuche ich, einen 16 Bit Timer im CTC-Modus zum Laufen zu bringen, der einen Takt von 1s geben soll. Leider bin ich bei der Suche hier nicht wirklich fündig geworden bzw. sie hat mich noch mehr verwirrt. Das ist das Erste mal, dass ich einen 16-Bit Timer benötige, hab damit also noch keine Erfahrung. Naja, daraus ist dann folgender Code entstanden, der aber leider keinen Takt an den Ausgängen hervorbringt (Blinker). Was muss ich noch machen, damit ich endlich einen Sekundentakt habe? Vielen Dank! #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> SIGNAL (SIG_OUTPUT_COMPARE1A); int main(void) { DDRD = 0b01100000; TCCR1A = (1<<COM1A0) | (1<<COM1B0); TCCR1B = (1<<WGM12) | (1<<CS12); OCR1AH = 0x85; OCR1AL = 0x5E; TIMSK = (1<<OCIE1A); sei(); for(;;) {} } SIGNAL (SIG_OUTPUT_COMPARE1A) { if(PORTD == 0b01100000) { PORTD = 0b00000000; } else { PORTD = 0b01100000; } }
Keine Geduld gehabt? Beim Mega8 in 1MHz Standardeinstellung komme ich auf einen Interrupt alle 9 Sekunden. Tips: - SIGNAL ist veraltet, ISR verwenden. - OCR1A statt OCR1AH/L verwenden. - Rechnen kann der Compiler selber. Also OCR1A = F_CPU / ... hinschreiben.
Der µC ist mit 8 Mhz getaktet. Leider blinkt immer noch nichts. Wie meinst du das mit OCR1A statt OCR1AH/L verwenden und was muss ich bei "OCR1A = 8000000 / ..." hinschreiben? Sorry, für die dummen Fragen, aber ich hab diesen Timertyp echt noch nicht verstanden. Könntest du evtl. meinen Quellcode mal so verändern, dass er funktioniert (1s)? Wäre dir und allen Anderen wirklich sehr dankbar. Grüße Thomas
So, blinken tut er jetzt, das Problem lag an einem nicht gesetzten Jumper auf dem Pollin-Board. Leider ist der Takt zu langsam, genau alle 2 Sekunden. Das mit dem "OCR1A = 8000000 / ..." versteh ich noch nicht. Wenn ich OCR1A und OCR1B statt OCR1AH und OCR1AL verwende, leuchten die LED's am Ausgang nur dauerhaft. Was muss ich für "OCR1A = 8000000 / ..." einsetzen, um genau 1 Sekunde heraus zu bekommen? Vielen Dank! Grüße Thomas
@ Thomas (Gast) >Wenn ich OCR1A und OCR1B statt OCR1AH und OCR1AL verwende, leuchten die >LED's am Ausgang nur dauerhaft. ??? >Was muss ich für "OCR1A = 8000000 / ..." einsetzen, um genau 1 Sekunde >heraus zu bekommen? Was soll 1s sein? LED 1s an, 1s aus, oder LED 0,5s an, 0,5s aus = 1s? Lies nochmal das Kaptiel über den Timer und seine Vorteiler im Datenblatt. Der Timer wird vom Hauptoszillator getaktet. Entweder direkt (Vorteiler =1) oder eben mit durch 8/32/256/1024 geteilten Takt. Welchen Vorteiler hast du eingestellt (hab jetzt das Datenblatt nicht)? Ich nehem mal an 1024. Wieviel Takt braucht man dann für 1 Sekunde? allgemein OCR1A = F_CPU/(Vorteiler*Timerfrequenz)-1; hier also. OCR1A = F_CPU/(1024*2)-1;
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | int main(void) |
5 | {
|
6 | DDRD = 0b01100000; |
7 | |
8 | TCCR1A = (1<<COM1A0) | (1<<COM1B0); |
9 | TCCR1B = (1<<WGM12) | (1<<CS12); |
10 | |
11 | OCR1A = F_CPU /(1024*2); |
12 | |
13 | TIMSK = (1<<OCIE1A); |
14 | |
15 | sei(); |
16 | |
17 | for(;;) |
18 | {}
|
19 | |
20 | }
|
21 | |
22 | |
23 | ISR(hier noch den Vektor einsetzen) |
24 | {
|
25 | PORTD ^= 0b01100000; |
26 | }
|
MFG Falk
Ahh, danke. Du hast mir sehr geholfen. Nun wird mir einiges klar. Ja, PD5/6 soll jeweils 0,5 Sek Ein/Aus sein, also wie in deinem Beispiel. Grüße!
muss ich jetzt ausgraben!
>
1 | > TCCR1A = (1<<COM1A0) | (1<<COM1B0); |
2 | |
3 | >
|
hat das irgendeinen sinn? ich glaub in dem programm nicht, eher &= ~((1<<COM1A0)|(1<<COM1A1)| (1<<COM1B0)|(1<<COM1B1)) weil sonst würd ich einen Pin verlieren. mfg low
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.