Hallo im Atmega Datenblatt steht folgende Formel für die Timer-Interrupteinstellung: fOCnA=fCLK/(2*N*(1+OCRnA) ich habe nach meinem Aufbau folgendes eingestellt: fOCnA=14745600/(2*256*(1+55))=514 wenn ich diese Werte nun programmiere, erhalte ich aber ca. alle ms einen Interrupt (1000 pro Sekunde, statt wie berechnet 514. Was sehe ich hier falsch? Bzw. wie muss ich den Interrupt richtig einstellen, damit ich genau alle ms eine Interruptmeldung erhalte? DANKE!
:
Verschoben durch Moderator
Moin, Frank schrieb: > Was sehe ich hier falsch? was Du siehst wissen wir nicht, wir sehen Garnichts, bemühe die SuFu dieses Forums oder poste deinen Quelltext/Projekt. MfG
Sorry, es handelt sich um einen Atmega1280 und einem externen Clock von 14,745600MHz // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 57,600 kHz // Mode: CTC top=OCR0A // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=0x02; TCCR0B=0x04; TCNT0=0x00; OCR0A = 0x37; //Interrupt je msec OCR0B=0x00; Danke!
1 | TCCR0A=0x02; |
2 | TCCR0B=0x04; |
3 | TCNT0=0x00; |
4 | OCR0A = 0x37; //Interrupt je msec |
5 | OCR0B=0x00; |
Benutze bitte die Konstanten aus den include files. Sie stimmen im wesentlichen mit denen aus dem Datenblatt überein. Verlangst Du ernsthaft, das wir an Deiner Stelle aus den Hex-Werten wieder die Bits zusammensuchen?
Die Überschrift dieser Forumrubrik lautet: Forum: Codesammlung Wenn ihr eigene Programme oder Anleitungen geschrieben habt könnt ihr sie hier posten. Fragen werden gelöscht! Was ist daran unklar? Peter
Sorry, ich bin aus Versehen in die falsche Rubrik gerutscht! Kann man den Betrag verschieben? Ich habe den Code aus dem Wizard und übersetze ihn mal mit dem Datenblatt: TCCR0A|= (1<<WGM01); TCCR0B|= (1<<CS02); TCNT0=0x00; OCR0A = 0x37; //Interrupt je msec OCR0B=0x00; Kann mir nur wer helfen?!
Frank schrieb: > wenn ich diese Werte nun programmiere, erhalte ich aber ca. alle ms > einen Interrupt (1000 pro Sekunde, statt wie berechnet 514. Vielleicht interne 8MHz gefust, statt externer HF-Quarz? Ich bin zu faul, den Reloadwert selber auszurechnen. Hier mal ein Beispiel, wie ich nen Timer initialisiere:
1 | #define F_CPU 14.7456e6
|
2 | |
3 | TCCR0A = 1<<WGM01; // T0 Mode 2: CTC |
4 | TCCR0B = 1<<CS02^1<<CS00; // divide by 1024 |
5 | OCR0A = F_CPU / 1024.0 * 10e-3 - .5; // 10ms |
6 | TIMSK0 = 1<<OCIE0A; // enable T0 interrupt |
Peter
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.