Hallo, kann mir jemand sagen wie ich das programm schreiben muss, damit ich den timer 1 mit dem vorteiler 1024 laufen lasse? kennt jemand einen programmcode in assembler? Schon mal vielen DAnk im vorraus. Grüße Heiner
In Assemler (definiertes Temp-Register vorausgesetzt): ldi temp, 0x05 out TCCR1B, temp
Kurze Frage zu den Timern (geht bei mir um den ATMega2561 Timer1, CPU mit 14.7456MHz): In der main lade ich den Timer: TCCR1B = 0x05; //Prescaler = 1024 TCNT1=0x1ed7; //Interrupt every 4 seconds TIMSK1 = 1<< TOIE1; //Timer 1 Interrupt enable bit sei(); In der ISR folgt dann: void (TIMER1_OVF_vect) (void) //ISR Timer1 { TCCR1B = 0x05; //Prescaler = 1024 TCNT1=0x1ed7; //Interrupt every 4 seconds TIMSK1 = 1<< TOIE1; //Timer 1 Interrupt enable bit sei(); TimerCount++; if (TimerCount == 2) { Record_On=false; TimerCount=0; } } Die main wartet nach dem Timer-Start auf Record_on==false. Also ca. 12 Sekunde (3 Timerdurchläufe). Der Haken an der Sache ist das "sei();" in der ISR. Lasse ich das weg, startet der Timer nicht nochmal. Ich hab im main dann eine Endlosschleife. Sollten die Interrupts nicht eigentlich aktiviert bleiben wenn sei(); einmal in der main aufgerufen wird?
Poste bitte dein Programm so wie es ist (per Cut&Paste). Das von dir gepostetet strotzt nur so von Fehlern.
> void (TIMER1_OVF_vect) (void) //ISR Timer1 Von welchem Compiler ist denn die Syntax? Wenn das ein geschachtelter Interrupt beim WINAVR sein soll, dann lass mal die Klammern um den Vektornamen weg. Verwirrt nur. Und in dem Fall sollte eigentlich im Handler kein sei() erforderlich sein. Timer-Preload macht man beim AVR auch eigentlich nicht. Dafür gibts den CTC-Modus.
Die Programmteile sind per C&P hier reingewandert. CTC hab ich mir eben mal angeguckt, werd das Programm wohl mal umändern. Preload bin ich noch von 8051 gewohnt ;)
OK. Dann muss das wohl so sein, dass gewisse Codeteile auskommentiert sind. Zb das sei() in dem was ich mal für einen Auszug aus main() halte.
1 | TCCR1B = 0x05; //Prescaler = 1024 TCNT1=0x1ed7; |
2 | //Interrupt every 4 seconds
|
3 | TIMSK1 = 1<< TOIE1; //Timer 1 Interrupt enable bit sei(); |
Nur so Zwecks Neugier: Welcher Compiler ist das?
gcc kanns nicht sein, denn dort werden ISR anders vereinbart.
> Sollten die Interrupts nicht eigentlich aktiviert bleiben wenn sei();
Beim gcc ist das so. Ob dein Compiler das auch macht, kann man
ohne Kenntnis des Compilers nicht sagen.
@Karl Heinz: Naja, unterbrechbare ISRs werden im WINAVR schon so ähnlich vereinbart, nur sind dann die Klammern um den Vektornamen zu viel...
Nö, die auskommentierten Programmteile kommen natürlich durch C&P. Eigentlich stehen die jeweils eine Zeile weiter und nicht mehr im Kommentar.
Ingmar Rosenhagen wrote: > Nö, die auskommentierten Programmteile kommen natürlich durch C&P. > Eigentlich stehen die jeweils eine Zeile weiter und nicht mehr im > Kommentar. Genau das meine ich: Stell sicher, dass dein Programm hier genauso präsentiert wird, wie es auch compiliert wird. Ich such mir doch nicht einen Wolf um rauszufinden welche Programmteile jetzt gültig sind und welche du mit Absicht auskommentiert hast und welche zufällig durch Fehler bei der Übernahme ins Posting passiert sind.
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.