- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 10 von 10

Thema: Programm springt immer wieder in Init

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    Kann nur aus meiner Erfahrung heraus antworten und diese lautet, ISR vergessen -> Dauerreset. Was auch recht lustig ist, wenn man durch die uneinheitlichen Bezeichnungen den falschen Interruptvektor nimmt, da man das Programm von einem µC auf einen anderen portiert hat.

    Das mit dem reti beruhte auf Halbwissen und habe ich mir aus der Vorstellung eines ASM-Listing zusammengereimt. Was ohne den __default_interrupt__ auch stimmt.
    Grüße,
    Daniel

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von ePyx Beitrag anzeigen
    aus der Vorstellung eines ASM-Listing zusammengereimt. Was ohne den __default_interrupt__ auch stimmt.
    Nein, ohne Einbinden eines eigenen Default-Vektors sieht's aus wie unten dargestellt.
    Die undefinierten Interruptvektoren gehen standardmäßig auf einen Punkt zusammen, an diesem Punkt würde bei selbst definiertem Bad-Interrupthandler der Weitersprung darauf erfolgen, ansonsten geht's (wie im Listing) auf den Resetvektor. Mit RETI hat das nix zu tun.
    Code:
    L0000:
        jmp    __start    ; L002A
         jmp    L0047
         jmp    L0047
         jmp    L0047
         jmp    L0047
         jmp    L0047
         jmp    L0047
         jmp    L0047
         jmp    L0047
         jmp    L0047
         jmp    L0047
         jmp    L0047
         jmp    L0047
         jmp    L0047
         jmp    L0047
         jmp    L0047
         jmp    L0047
         jmp    L0047
         jmp    L0047
         jmp    L0047
         jmp    L0047
    ; L002A:
    ; ... startup code
        call L0049
        jmp L03C5
     L0047:
        jmp    L0000
    ; main    
     L0049:
    ; ...
    L03C5:
        cli
    L03C6:
        rjmp    L03C6

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    Zitat Zitat von MagicWSmoke Beitrag anzeigen
    Ansonsten geht's (wie im Listing) auf den Resetvektor.
    Hab nichts anderes geschrieben.

    Zitat Zitat von ePyx Beitrag anzeigen
    Ist die nicht vorhanden läuft das Programm ab der Sprungadresse des IRQ weiter und geht ohne reti ( das macht unter anderem der ISR-Block) nicht zurück sondern läuft weiter. Etwas weiter oben im Speicher liegt deine Init und wird ausgeführt.

    Durch das Einfügen einer rjmp Marke, wird der unter der Marke Code für die ISR abgearbeitet. Zum Schluss wird mit reti doch, zurück an die Stelle PCs die vor dem IRQ bearbeitet wurde, gesprungen. Letztendlich muss der C-Compiler doch Ähnliches erzeugen, denn es muss bzgl. der Funktionalität das Gleiche herauskommen.

    Sprich, für mich definiert der ISR-Block den Interrupt-Einsprung und folglich auch den Rücksprung.
    Grüße,
    Daniel

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von ePyx Beitrag anzeigen
    Hab nichts anderes geschrieben.
    Konnte (kann) ich so nicht verstehen.
    Letztendlich muss der C-Compiler doch Ähnliches erzeugen, denn es muss bzgl. der Funktionalität das Gleiche herauskommen.
    Nein, er muss nichts funktional Ähnliches erzeugen, denn bei einem Fehlen der ISR muss er nicht mehr unbedingt in den unterbrochenen Code zurückkehren. Dann kann direkt (die Bad-Vektor Marke mal ausgeklammert) vom jeweilig Interruptvektor auf den Reset-Vektor gesprungen werden. Das normalerweise ausgeführte RETI der ISR poppt die Rücksprungadresse in den Programmzähler und würde damit den Stack wieder in Ordnung bringen. Wenn's aber per JMP oder RJMP auf den Resetvektor geht, dann wird der Stack in Folge sowieso neu initialisiert und damit muss man darauf nicht mehr darauf achten.
    Weis jetzt nicht, ob wir da aneinander vorbeireden...
    Sprich, für mich definiert der ISR-Block den Interrupt-Einsprung und folglich auch den Rücksprung.
    Bezeichnest Du mit ISR-Block die Interruptvektortabelle oder die ISR selbst ?
    Ein Interrupt geht von der Interruptvektortabelle aus, aber er kehrt dorthin nicht mehr zurück, das ist der Unterschied zwischen einem Interruptaufruf und einem CALL/RCALL, bei dem der Rücksprung unmittelbar nach die Caller-Adresse erfolgt.

  5. #5
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    Mit ISR-Block meinte ich eigentlich nur das Makro ISR ( ).
    Grüße,
    Daniel

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.242
    Dee Watchdog ist nicht mit den Fuses auf "ENABLE" geschaltet?

Ähnliche Themen

  1. switch-Anweisung springt immer zum selben case X Befehl
    Von HF SHOOTER im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 05.11.2007, 19:06
  2. immer wieder pwm tiny45
    Von meldano im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 23.04.2007, 02:23
  3. Immer wieder - Labornetzteil...
    Von Vaterssohn im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 15.11.2006, 21:47
  4. Immer wieder....I2C Bus
    Von JensB im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 16.09.2004, 16:26
  5. [ERLEDIGT] Immer wieder LCD Probleme
    Von Bruce im Forum Robby CCRP5
    Antworten: 7
    Letzter Beitrag: 03.08.2004, 12:26

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress