- LiFePO4 Speicher Test         
Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 34 von 34

Thema: AT90S2313 - Timer

  1. #31
    Benutzer Stammmitglied
    Registriert seit
    17.07.2004
    Alter
    37
    Beiträge
    81
    Anzeige

    E-Bike
    Du springst am besten von der Reset in die Loop-Routine (Oder jede andere, von wo aus der Code weiterlaufen soll). Dort wird dann dein ganzer Code ausgeführt.

    Das Problem bei deinem Code ist ja(obwohl es auch eigentlich kein Problem ist), dass du in der Reset-Routine den Stack neu initalisierst und deine ganzen Einstellungen zurücksetzt (Was bei einem Hardware-Reset ja auch durchaus gewünscht ist), allerdings den "normalen" Programmfluss durcheinander bringt, falls per Software ausgeführt.

    Das reti-Statement ist deswegen absolut fehl am Platze.

  2. #32
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.05.2004
    Ort
    Wilhelmshaven
    Alter
    46
    Beiträge
    324
    wenn aber die Stackinitialisierung übersprungen wird, wie soll dann der Stack initialisiert werden? Dann läuft das Programm ständig in der "test" Schleife und der Stack und der DDR wurde nicht eingerichtet.
    Poste mal bitte ein funktionierendes Beispiel. Das würde mir sehr helfen. Kann der uC vielleicht kaputt sein? Kann mir nicht vorstellen das alle Tutorials falsch sind und wenn ihr keinen Fehler findet, dann..... Weiss einfach nicht mehr weiter. Es raubt einem echt den Spaß.

  3. #33
    Benutzer Stammmitglied
    Registriert seit
    17.07.2004
    Alter
    37
    Beiträge
    81
    Code:
    .include "m8def.inc" 
    .def temp = r16 
    
    rjmp reset ; Reset Handler 
    ;rjmp interrupt0 ; IRQ0 Handler 
    ;andere Interrupt-Vektoren 
    ;reti
    
    ;----------Interruptprozedur-------------- 
    interrupt0: 
       com r17 
       out PORTC, r17 
    reti 
    ;---------------------------------------- 
    
    reset: 
       ldi temp, LOW(RAMEND) ;LOW-Byte der obersten RAM-Adresse 
       out SPL, temp 
       ldi temp, HIGH(RAMEND) ;HIGH-Byte der obersten RAM-Adresse 
       out SPH, temp 
    
       ldi r16, 0xFF 
       out DDRC, r16 ; Port C output 
       ldi r17, 0x00 
       out PORTC, r17 ; Port C LEDs an 
    
    ;-----------externer Interrupt enablen-------------- 
       ldi r16, 1<<int0 
       out GICR, r16 
        
       ldi r16, 1<<ISC01 
       out MCUCR, r16 
    
       sei         ;global interrupt enable 
       rjmp main ;<----
    ;---------------------------------------------------- 
    main: 
       loop: 
          rjmp loop
    Also erstmal ein wenig zu der RJMP-Instruction. Der ganze Befehl verbraucht 2 Byte Speicher. 1Byte für den Befehl, 1 Byte für den Parameter k also die Addresse die angesprungen werden soll. Deswegen solltest du die Interrupt-Vektoren mit einem RJMP-Statement auf ein Label festsetzen, welches unmittelbar unter der Vektoren-Tabelle steht. (Das hat eigentlich nur Geschwindigkeitsrelevante Gründe - der JMP-Befehl nimmt ein Wort als Parameter) Deswegen hab ich die Routine für den externen Interrupt mal direkt unter die Tabelle geschrieben.

    Das einzige, was ich sonst noch geändert habe, ist das Einfügen eines RJMP-Befehls auf das Main-Label.

    So hier mal eine Erklärung zum Thema Interrupts:
    Der Reset-Handler wird immer dann ausgeführt, wenn ein Hardware-Reset am Controller selbst bzw. am Reset-Pin durchgeführt wird. Das gilt quasi als Reset des Controllers, was durch einen Abfall der Spannungsversorgung passiert sein könnte, oder eben durch das gewollte betätigen eines Schalters. Über den Interrupt-Vektor wird die Reset-Routine aufgerufen, der Stack und und der Port initialisiert. Anschließend wir dann via rjmp main, die Main-Routine aufgerufen, dort fängt dein Programmfluss an.

    Der Mikrocontroller kann eingentlich nicht kaputt sein. Versuchs mal so wie oben. Es kann daran liegen, das es nicht funktioniert hat, dass direkt nach dem Reset in die interrupt0-Routine weitergeganen wurde, wo dann per reti der saubere Ablauf zerhackt wurde.
    ;andere Interrupt-Vektoren
    Hier müssen noch die anderen Interrupt-Vektoren eingefügt werden, die habe ich vorhin entfernt.

    Falls es nicht klappt, dann machs nocheinmal so wie vorher ohne das interrupt0 label.

  4. #34
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.05.2004
    Ort
    Wilhelmshaven
    Alter
    46
    Beiträge
    324
    danke für deine Mühe. Habs verstanden

Seite 4 von 4 ErsteErste ... 234

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress