PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Global Interrupt Flag wird zurückgesetzt?!



bigbehrens
28.02.2007, 19:26
; 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!

wkrug
28.02.2007, 19:48
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.

bax
28.02.2007, 19:59
Bei der Initialisierung des Stacks hat sich auch noch ein Fehler eingeschlichen, Du schreibst zweimal auf den SPL

out SPL, temp

greetz Rajko

izaseba
28.02.2007, 20:30
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 #-o

Gruß Sebastian

wkrug
01.03.2007, 08:17
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.

bigbehrens
01.03.2007, 16:31
Vielen Dank, mein Prog läuft.