Forum: Mikrocontroller und Digitale Elektronik Interrupt in AVR Studio Simulieren


von Gast (Gast)


Lesenswert?

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ß

von Karl H. (kbuchegg)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

???

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?

von Karl H. (kbuchegg)


Lesenswert?

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)

von Falk B. (falk)


Lesenswert?

@  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

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.