Hallo, möchte den Timer1 eines ATmega32 als 10Bit PWM nutzen. Als Takt habe ich 16MHz/1024 = 15.625kHz. Gleichzeitig soll der Timer als Uhr benutzt werden. Wenn ich den Timer mit 0xc2F7 lade, sollte ich normalerweise jede Sekunde nen Interrupt haben. Ist die Rechnung richtig? Mfg Sascha
Schreib das nächste mal statt 0xc2F7 einfach -15625, dann weiß jeder gleich, was damit gemeint ist und für den Compiler ist beides dasselbe. Im Prinzip kann man im PWM-Modus auch den Overflowinterrupt benutzen, um eine Zeitbasis zu zählen. Bloß der Endwert ist natürlich durch die PWM (10Bit = 1024) fest vorgegeben. Du hast also einen Interrupt von 16MHz/1024 und darin kannst Du nun eine Variable bis auf eine Sekunde runterzählen. Peter
@peter dannegger Darin liegt das Problem.Hier mal der betreffende Ausschnitt des Codes // Timer 1 overflow interrupt service routine SIGNAL (SIG_OVERFLOW1) { TIMER0_COUNT++; if(TIMER0_COUNT==15625) { TIMER0_COUNT=0; if(CH_SEKUNDEN < 59) { CH_SEKUNDEN++; } else { CH_SEKUNDEN=0; if(CH_MINUTEN < 59) { CH_MINUTEN++; } else { CH_MINUTEN=0; if(CH_STUNDEN <= 99) { CH_STUNDEN++; } else { CH_STUNDEN=0; } } } } } int main(void) { PORTD=0x00; //PD4 und PD5 als Ausgang (PWM) DDRD=0x30; TCCR1A=0xA3; // FAST-PWM 10Bit 15.625kHz TCCR1B=0x0D; TCNT1=0x00; ICR1=0x00; OCR1A=0x00; OCR1B=0x00; TIMSK=0x04; // T1 Overflow sei(); Nach der Rechnung 16MHz/1024 sollte ja 15.625kHz rauskommen und dem entsprechend die Interruptfrequenz. Zähle ich die Variable TIMER0_COUNT im Interrupt hoch, dauert es ewig bis der Zählstand 15625 erreicht ist. Mfg Sascha
Hallo, mit dem Timer0 als eigenständiger Zeitgeber gehts. Nur der obige Code geht nicht. Hat jemand mal nen Tip? Wenn ich mir die Variable TIMER0_COUNT auf einem LCD-Display anzeigen lasse, sieht man wie langsam er zählen tut. Schätzungsweiße 10-15 mal pro sec. Mfg Sascha
Keiner mal einen Tip für mich? So langsam verzweifel ich...... Mfg Sascha
Hallo Sascha, dein C-Compiler generiert doch bestimmt auch ein Assembler-File. Den würde ich ins AVR Studio kopieren. Dort kannst du dir prima alle Register nach jedem Prozessorzyklus anschauen. Dann siehst du bestimmt woran was das Problem ist. Du kannst auch direkt in die Register schreiben. Das hat mir mehr geholfen wie das ganze Datenblatt. Grüße Jürgen
Hallo hab jetzt nochmals das Datenblatt durchforstet. Kann es sein, das der vorgegebene Takt durch die PWM-Auflösung nochmals geteilt wird?
1 | TCCR1A=0xA3; //Takt 16MHz |
2 | TCCR1B=0x09; //10Bit FAST-PWM |
3 | TCNT1=0; |
4 | ICR1=0; |
5 | OCR1A=0x1ff; // Ausgänge auf 50& stellen |
6 | OCR1B=0x1ff; |
7 | TIMSK=0x04; |
Mit diesen Einstellungen läuft die Uhr endlich und an PD4 und PD5 messe ich jetzt auch 15.625kHz. Mfg Sascha
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.