Hi Leute mal eine kurze Frage, wie simuliere ich ein Programm mit einer Interrupt Routine. Das Programm ist ganz einfach. #include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> volatile uint8_t led_an; ISR (TIMER1_OVF_vect) // <-- neu / gültig ;) { led_an=~led_an; } void ioinit(void) { TCCR1A=0; TCCR1B=(1<<CS11) | (1<<CS10); /* full/:8/:64 MCU clock */ TIMSK=(1<<TOIE1); sei(); /* enable interrupts */ } int main (void) { ioinit(); DDRD=0x02; /* use PortD1 for output (LED) */ PORTD=0x00; /* turn LED off */ for (;;) { PORTD=led_an; /* LED */ } } Irgendwie springt mein Programm nicht in die Interupt Routine. Gruß
Gast wrote: > Hi Leute mal eine kurze Frage, > > wie simuliere ich ein Programm mit einer Interrupt Routine. Das Programm > ist ganz einfach. > > #include <inttypes.h> > #include <avr/io.h> > #include <avr/interrupt.h> > > volatile uint8_t led_an; > > ISR (TIMER1_OVF_vect) // <-- neu / gültig ;) > { led_an=~led_an; > } > > void ioinit(void) > { TCCR1A=0; > TCCR1B=(1<<CS11) | (1<<CS10); /* full/:8/:64 MCU clock */ > TIMSK=(1<<TOIE1); > sei(); /* enable interrupts */ > } > > int main (void) > { > ioinit(); > DDRD=0x02; /* use PortD1 for output (LED) */ > PORTD=0x00; /* turn LED off */ > for (;;) > { PORTD=led_an; /* LED */ > } > } > > Irgendwie springt mein Programm nicht in die Interupt Routine. Wie lange hast du denn gewartet, bzw. wie oft bist du mit Einzelschritt durchgegangen? Dir ist schon klar, dass der Simulator 512 * 65536 = 33554432 Taktzyklen simulieren muss, bevor deine ISR das erste mal angesprungen wird. Wenn du in Einzelschritten mit F10 durchgehst, dürftest du da eine halbe Ewigkeit davor sitzen bevor du 33 Million mal auf F10 gedrückt hast (ob die Taste das wohl aushält). Aber selbst wenn du den Simulator mittels Run losschickst, dauert das zumindest eine Achtel Ewigkeit. Ein realer Mega mit 1Mhz Taktfrequenz braucht dazu immer noch ~33Sekunden, bevor sich am Ausgang was tut.
??? Die LED geht beim mir jede Sekunde an und aus. Gewertet habe ich schon ein wenig habe dann aber keine Lust gehabt weiter zu warten. Geht es überhaupt das was ich oben beschrieben habe?
Gast wrote: > ??? > > Die LED geht beim mir jede Sekunde an und aus. Ich hab ja nicht gesagt, dass dein Mega mit 1 Mhz läuft :-) > > Gewertet habe ich schon ein wenig habe dann aber keine Lust gehabt > weiter zu warten. > > Geht es überhaupt das was ich oben beschrieben habe? Sicher geht das. Mach im Simulator den I/O View auf und beobachte den Timer. Wenn du oft genug auf F10 drückst bzw. den Simulator immer wieder unterbrichst, müsstest du sehen wie der Timer langsam hochzählt. (Hinweis: Im Simulator ist es oft eine gute Idee keine derartig grossen Vorteiler zu nehmen. Man sitzt sonst eine Ewigkeit vor dem Simulator und dreht Däumchen)
@ Karl heinz Buchegger (kbuchegg) >(Hinweis: Im Simulator ist es oft eine gute Idee keine >derartig grossen Vorteiler zu nehmen. Man sitzt sonst >eine Ewigkeit vor dem Simulator und dreht Däumchen) Oder man setzt einfach einen Breakpoint und drückt einmal F5 ;-) MfG Falk
Falk Brunner wrote: > @ Karl heinz Buchegger (kbuchegg) > >>(Hinweis: Im Simulator ist es oft eine gute Idee keine >>derartig grossen Vorteiler zu nehmen. Man sitzt sonst >>eine Ewigkeit vor dem Simulator und dreht Däumchen) > > Oder man setzt einfach einen Breakpoint und drückt einmal F5 ;-) Dauert bei meinem Rechner immer noch sehr lange. Keine Ahnung ob das sympthomatisch ist oder nicht, aber weil ich es vorgestern getestet habe: Die Standard LCD Initialisierung mit den paar ms Warteschleifen beschäftigt meinen Rechner immerhin 7 Sekunden :-) Da kann man dann schon mal die Geduld verlieren und vorzeitig abbrechen.
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.