- Labornetzteil AliExpress         
Ergebnis 1 bis 6 von 6

Thema: Global Interrupt Flag wird zurückgesetzt?!

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    03.02.2007
    Beiträge
    5

    Global Interrupt Flag wird zurückgesetzt?!

    Anzeige

    Praxistest und DIY Projekte
    Code:
    ; Programmname: entprell
    ; Version: 0.1
    ; Datum: 27.02.2007
    ; Autor: Manuel Behrens
    ; Programmfunktion: 
    
    
    
    .include "m8def.inc"
    
    .def temp = R16					; Temporärer Speicher zum Beispiel zur Initialisierung
    .def anschlaege = R17			; Speichert die Anschläge des Tasters 0 an Port D
    .def eingang = R18				; Port D wird in eingang geschrieben um vergleichen zu können
    .def zaehler = R19				; zaehler wird durch Timer0 Overflow hochgezaehlt
    
    
    .org 0x000
    	rjmp init
    .org 0x009
    	rjmp timer0_overflow
    
    
    
    
    
    
    ; Initialisierungsphase
    init:
    	;Stackpointer wird initalisiert
    ldi	temp, LOW(RAMEND)		
    out	SPL, temp
    ldi temp, HIGH(RAMEND)
    out SPL, temp
    	;Timer initalisiern
    ldi temp, 0b00000001
    out TCCR0, temp						; Takteiler auf 1
    ldi temp, 0b00000001
    out TIMSK, temp						; Aktiviert Interrupt bei Overflow
    	;Taster 0 am Port D init.
    ldi temp, 0x00
    out DDRB, temp
    
    
    ; Programmablauf (Schleife wartet auf Taster 0 am Port D)
    main:
    in eingang, PIND					; Port D wird in eingang geschrieben
    ldi temp, 0x00
    cp eingang, temp					; eingang wird mit Null verglichen
    breq main							; wenn gleich springe main
    inc anschlaege						; anschlaege plus 1
    ldi zaehler, 0xFF					; zaehler auf Zählanfang
    sei									; aktiviert Interrupts
    count:
    cp temp, zaehler					; Null wird mit zaehler verglichen
    brge count							; wenn größer oder gleich springe count
    nop							
    cli									; deaktiviere Interrupts							
    rjmp main							; Rücksprung nach main
    
    
    
    
    ; Handler: Timer0 Overflow
    timer0_overflow:
    dec zaehler							; zaehler minus 1
    rjmp count							; Sprung nach count
    Moin,

    wer oder was setzt mein Globales Interrupt Flag wieder auf Null. AVR Studio gibt beim simulieren

    Loaded plugin Atmel AVR Assembler
    Loaded partfile: C:\Programme\Atmel\AVR Tools\PartDescriptionFiles\ATmega8.xml
    AVR Simulator: Please wait while configuring simulator...
    AVR Simulator: ATmega8 Configured OK
    Loaded objectfile: d:\C - Programme\atmel-projekte\entprell\entprell.obj
    AVR Simulator: Uninitialized stack pointer used at 0x001c
    AVR Simulator: Excessive stack overflow, stop sim

    aus!

    Danke schon mal!

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Also erstmal steht der Start deines Programmes im Interruptbereich und zwar direkt nach der Adresse 0x0009.
    Ich würd vor der Adresse 0 auch noch .cseg einfügen, damit sicher gestellt ist wo der Code landet.

    Zum Zweiten fehlt bei deiner Timer Interrupt routine das RETI mit dem der Controller weiß, das der Interrupt hier beendet werden muß.

    Das hat folgenden Effekt:
    Ein Interrupt tritt auf, das Enable Interrupt Flag (I) wird dadurch gelöscht.
    Da der Programm Counter auf dem Stack gesichert wird läuft der bei jedem neuen Interrupt weiter zu.

    Mit einem RETI würde das I Flag wieder gesetzt, der Programm Counter vom Stack geholt und dein Controller könnte sorglos weiter laufen.

    Merz mal die beiden Fehler aus - ich denk dann sollte dein Prog laufen.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    10.02.2005
    Ort
    eastside, L.E.
    Alter
    53
    Beiträge
    104
    Bei der Initialisierung des Stacks hat sich auch noch ein Fehler eingeschlichen, Du schreibst zweimal auf den SPL

    out SPL, temp

    greetz Rajko

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    In der ISR wird SREG nicht gesichert, und tue Dir ein gefallen und springe niemals mit rjmp aus einer ISR raus, das ist wohl das letzte, was Du machen kannst

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Du solltest die Routine COUNT nur als subroutine aufrufen also

    COUNT:
    ....dein CODE
    RET

    In deiner ISR schaut das dann so aus:
    PUSH temp
    IN temp,SREG
    PUSH temp
    PUSH zaehler
    ....dein CODE
    RCALL COUNT
    POP zaehler
    POP temp
    OUT SREG,temp
    POP temp
    RETI

    Natürlich müssen alle verwendeten Register gesichert werden, mit ausnahme derer von denen Werte in das Hauptprogramm übergeben werden sollen, was z.B. bei "zaehler" möglich wäre.
    Dadurch muss auch die Main Routine umgebaut werden:

    MAIN:
    ....dein CODE
    RCALL COUNT
    RJMP MAIN

    Ich hab den kompletten Code noch nicht auf Funktionsfähigkeit gecheckt, das kannst Du ja mit dem Simulator vom AVR Studio noch machen.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    03.02.2007
    Beiträge
    5

    Fehler behoben!

    Vielen Dank, mein Prog läuft.

Berechtigungen

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

Solar Speicher und Akkus Tests