www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt in AVR Studio Simulieren


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.