Hi,
da Du in TIMSK kein Bit gesetzt hast, kommt es nie zu einem Timer-Overflow-Interrupt.
"Die genaue Sekunde".
Gruß
Fred
Hi
ich beschäftige mich mit dem Timer des Tiny2313.
In meinem code versuche ich genau jede sekunde die Ausgänge des Port B auf high und in der nächsten wieder auf low zu setzten.
Ich will das mit dem Timer (soll auch möglichst genau sein) machen (nicht sleep oder so). Der code compiliert fehlerfrei, allerdings bleibt er nach dem 1 durchgang beim Debuggen stehen.
Habe ich was übersehen oder was ist los?
Benutze ich den Timer überhaupt richtig? (habe mir das nur im tutorial auf mikrocontroller.net angesehen und extra bei keinem anderen projekt abgeschaut)
Vielleicht sehe ich auch den wald vor bäumen einfach nichtCode:#define F_CPU 4096000 #include <avr/io.h> #include <avr/interrupt.h> #include <inttypes.h> #include <stdint.h> int16_t timer=0; int8_t status=0; void initTimer(void) { TCCR0B |= (1<<CS00)|(1<<CS02); } void initInterrupts(void) { sei(); } ISR(TIMER1_OVF_vect) { timer=timer+1; } int main (void) { initTimer(); initInterrupts(); DDRB = 0xff; while(1) { if(timer>=4000) //hier bleibt der Debugger erst beim 2ten durchgang der schleife stehen { timer=0; if(status==0) { PORTB = 0xff; status=1; } else { PORTB = 0x00; status=0; } } } return 0; }
wäre nett, wenn sich das jemand anschaut
danke
Hi,
da Du in TIMSK kein Bit gesetzt hast, kommt es nie zu einem Timer-Overflow-Interrupt.
"Die genaue Sekunde".
Gruß
Fred
Only entropy comes easy. - Anton Checkhov
Hallo,
Welchen Timer benutzt du nochmal?Code:TCCR0B |= (1<<CS00)|(1<<CS02); ... ISR(TIMER1_OVF_vect)
Gruß
Jens
hi
danke erstmal
beide fehler behoben
neuer code:
leider läuft der debugger nun die ganze zeit durch die interrupt funktion und setzt auch nicht den port bei einem timer größer als 4000 um (arbeitet die if funktion nicht ab).Code:#define F_CPU 4096000 #include <avr/io.h> #include <avr/interrupt.h> #include <inttypes.h> #include <stdint.h> int16_t timer=0; int8_t status=0; void initTimer(void) { TCCR0B |= (1<<CS00)|(1<<CS02); TCNT0 = 0; TIMSK |= (1<<TOIE0); } void initInterrupts(void) { sei(); } ISR(TIMER0_OVF_vect) { timer=timer+1; } int main (void) { initTimer(); initInterrupts(); DDRB = 0xff; while(1) { if(timer>=4000) { timer=0; if(status==0) { PORTB = 0xff; status=1; } else { PORTB = 0x00; status=0; } } } return 0; }
brauche also nochmal hilfe
Hi,
<pre>volatile int16_t timer=0; </pre>
MfG
Fred
Only entropy comes easy. - Anton Checkhov
stimmt
allerdings bleibt er bei der if abfrage hängen
if(timer>=4000)
ich habe auch den wert 4000 mal tiefer angesetzt, daran liegt es aber auch nicht
Hi,
"timer" ist immer noch nicht "volatile"!
Gruß
Fred
Only entropy comes easy. - Anton Checkhov
verstehe ich jetzt nicht
Code:#define F_CPU 4096000 #include <avr/io.h> #include <avr/interrupt.h> #include <inttypes.h> #include <stdint.h> volatile int16_t timer=0; volatile int8_t status=0; void initTimer(void) { TCCR0B |= (1<<CS00)|(1<<CS02); TCNT0 = 0; TIMSK |= (1<<TOIE0); } void initInterrupts(void) { sei(); } ISR(TIMER0_OVF_vect) { timer=timer+1; } int main (void) { initTimer(); initInterrupts(); DDRB = 0xff; while(1) { if(timer>=4) { timer=0; if(status==0) { PORTB = 0xff; status=1; } else { PORTB = 0x00; status=0; } } } return 0; }
Hallo,
Deine jetzige Version läuft bei mir im Simulator problemlos. Wenn ich "timer" auf 3 und einen Breakpoint in der ISR setze, springt der Inhalt von "timer" beim nächsten Durchlauf wieder auf 0. Dein Code funktioniert also wie gewünscht! "status" muss nicht "volatile" sein.
Gruß
Fred
Only entropy comes easy. - Anton Checkhov
mhm
beii mir setzt er den auf PORTB = 0xff;
aber danach passiert nix mehr
welche simulationssoftware verwendest du?
Lesezeichen