Hi! Ich möchte mit dem Timer0 vom ATMega128 einen 10ms-Interrupt erzeugen (=100Hz). (Quarzfrequenz 11059200Hz) Hab den Vorteiler auf 1024 und den Reload-wert auf 148. Jedoch bekomme ich am Test-Ausgang (Pin PC6) anstatt der erwarteten Frequenz von 50Hz das 8fache, nämlich 400Hz! :-O F_CPU wird im Makefile definiert. Auch wenn ich T0_RELOAD fest mit 148 definiere, macht es keinen Unterschied... Hier der Code: =================== #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <stdlib.h> #include <string.h> #define T0_RELOAD (256-((F_CPU/1024)/100)) /* Test-Variablen definieren */ volatile unsigned char test=0; /* Funktionen deklarieren */ void INIT(void); /* Hauptfunktion */ int main(void) { INIT(); // Initialisierungsroutine aufrufen DDRC=0x40; // Testausgang PC6 while(1) { } return 0; } /* Interrupt-Routine Timer0-Überlauf => 10ms */ SIGNAL (SIG_OVERFLOW0) { TCNT0 = T0_RELOAD; // Timer0 vorbelegen if (test) { PORTC &= 0xbf; test=0; } else { PORTC |= 0x40; test=1; } } void INIT(void) { /* Timer0 als 10ms-Taktgeber per Interrupt definieren */ TCCR0 = (1<<CS00)|(1<<CS02); // Timer0 => F_CPU / 1024 TCNT0 = T0_RELOAD; // Timer0 vorbelegen TIMSK |= (1<<TOIE0); // Interrupt Overflow0 freigeben sei(); // Globale Interruptfreigabe return; } =================== Was kann hier noch faul sein? Fuse-Bits sollten auch alle passen: -M103C deaktiviert (andernfalls geht garnix) -JTAG, OCD, WDTON, BOOTRST deaktiviert -Takt: Ext XTAL, High frequency -Keine Lockbits (alle Mode 1) Wäre über Tipps was ich noch vergessen haben könnte echt dankbar! MfG Techniker
Beim Mega128 musst du für Teiler 1024 CS0, CS1 und CS2 setzen: TCCR0 = (1<<CS00)|(1<<CS01)|(1<<CS02); // Timer0 => F_CPU / 1024 Ist anders als bei den kleineren AVRs...
Ganz einfach, dein Prescaler hast du auf 128 statt 1024 eingestellt: TCCR0 = (1<<CS00)|(1<<CS02); // Timer0 => F_CPU / 1024 korrekterweise solltest du auch noch das Bit (1<<CS01) setzen.
megaschäm_und_unten_den_schreibtisch_kriech Danke! Wer lesen kann, ist hald klar im Vorteil... ;) (Seite 103 im Datenblatt)
Mmmhh das verstehe ich nicht. Muss man die Variablen nicht auch füllen? OCR1AL = 0x09; OCR1AH = 0x3d; TCNT1L = 0xf7; TCNT1H = 0xc2; Wenn nein, wozu sind denn die dann da?
Richard, diese Register sind nur fuer Timer 1 erheblich, oben wurde aber von Timer 0 gesprochen.
Zudem sind es keine Variablen sondern steuerungs Register.
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.