PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : stack initialisieren Attiny 12?



Tob
25.07.2008, 20:45
Hallo zusammen,

ich bin gerade dabi ein Programm für einen Attiny12 zu schreiben in dem ich mit dem Befehl "reti"
wieder aus einer Interrupterroutine herausspringen möchte.

Da in der Include-Datei des AVR-Studios zum Attiny12 das Register "SPL" nicht definiert ist,
weis ich nicht wie ich den Stack initialisieren kann.

Wäre echt nett, wenn ihr mir sagen könntet wie man beim Attiny12 den Stack initialisiert.

MfG Elko ](*,)

sternst
25.07.2008, 21:02
Da gibt es nichts zu initialisieren, weil der Tiny12 kein RAM hat.
Der 3-Stufen-Hardware-Stack initialisiert sich selbst.

Tob
26.07.2008, 10:27
Achso,

ich hab halt das Problem, dass mein Programm nach dem "reti" Befehl im Unterprogramm "rechts" wieder zum Programmstart zurückspring,
also nach "0x0000" und nicht da weiter macht wo es beim IRQ aufgehört hat,
sprich in der loop-Schleife.

Und da dachte ich, dass dem Programm beim zurückspringen die Rücksprungadresse fehlt, weil der Stack nicht initialisiert ist.

An was kann das noch liegen dass mein Programm nach dem "reti" Befehl immer wieder von vorne beginnt? :-k

Hier ist mal mein Programm:



include "tn12def.inc"

.def temp = r16
.def temp2 = r17
.def k = r18
.def i = r19

.org 0x0000
rjmp main

.org OVF0addr
rjmp sprungziel

main:

ldi temp, 0b00000110 ;Portb.1 u. 2 als Eingang /
out DDRB, temp ;Portb.1 u. 3-5 als Ausgang

ldi temp, 0b00000000 ;Portb initialisieren
out PORTB, temp

ldi temp, 0b00000000 ;Timer0 Stop
out TCCR0, temp

ldi temp, 0b00000010 ;Timeroverflow Interrupt Ein
out TIMSK, temp

ldi i,0 ;Register auf 0 setzen

sei

loop:
in temp2, PINB ;Taster betätigt?
cpi temp2, 0b00001000
breq rechts

rjmp loop

sprungziel: ;sprungziel ermitteln
cpi i, 3
breq ende
cpi k, 1
breq rechts1
cpi k, 2
breq rechts2


rechts:
ldi temp, 0b00000001 ;Timer 0 Start
out TCCR0, temp
ldi k, 1
reti

rechts1:
ldi temp, 0b00000100 ;Blinker Ein
out PORTB, temp
ldi k,2
reti

rechts2:
ldi temp, 0b00000000 ;Blinker Aus
out PORTB, temp
ldi k,1
inc i
reti

ende:
ldi temp, 0b00000000 ;Timer0 Aus (Ende Blinkzyklus)
out TCCR0, temp
rjmp loop


Das Programm ist dazu da, um den Blinker beim Auto dreimal aufleuchten zu lassen, wenn man den Blinkhebel antippt.

Wäre euch dankbar wenn ihr mir weiterhelfen köntet! O:)

izaseba
26.07.2008, 10:51
Hallo,
das Problem liegt hier :



loop:
in temp2, PINB ;Taster betätigt?
cpi temp2, 0b00001000
breq rechts <--------------- Falsch

rjmp loop



Hier wird hingesprungen


rechts:
ldi temp, 0b00000001 ;Timer 0 Start
out TCCR0, temp
ldi k, 1
reti <------------- Hopla



Du darfst nich mit einem breq irgendwo hin springen und dann mit ret oder reti zurückspringen.
Das zerlegt Dir den Stack.
Ich würde das Programm nochmal überdenken.

fhs
26.07.2008, 11:06
Hi Tob,

ich habe Dein Programm mal gewaltig zusammengestrichen, um Dir den Strukturfehler zu zeigen:
.org 0x0000
rjmp main

.org OVF0addr
reti

main:
;....
ldi temp, 0b00000010 ;Timeroverflow Interrupt Ein
out TIMSK, temp
sei

loop:
in temp2, PINB ;Taster betätigt?
;....
breq rechts ; dieser Sprung führt zu einem Problem.... (s.u.)
rjmp loop

rechts:
;...
reti ; ...denn wie soll der PC hier wieder korrekt gesetzt werden?

Siehtst Du, was hier passiert? Aus "loop" kann nach "rechts" gesprungen werden. Am Ende von "rechts" steht "reti". Da aber kein Interrupt vorliegt, liegt auf dem (Hardware-)Stack keine geeignete Rücksprungadresse! Du musst da noch einiges korrigieren, aber jetzt kennst Du erst einmal das Hauptproblem.

Gruß

Fred

izaseba
26.07.2008, 11:09
Hallo Fred,

ähm, genau das hab ich ja schon vor 15 Minuten gesagt...

Gruß Sebastian

fhs
26.07.2008, 13:02
Hallo Sebastian,

... genau das hab ich ja schon vor 15 Minuten gesagt...
OT, aber ich muss es einfach loswerden: Kannst Du Dir vorstellen, dass ich mit meinem Posting vermutlich etwa zur gleichen Zeit wie Du angefangen und vor dem Absenden noch 2 Anrufe bekommen habe, so dass ich erst jetzt Dein Posting und Deinen Kommentar sehe? Ist Dir das Dir etwa noch nie passiert?

MfG

Fred

Tob
26.07.2008, 20:13
Da hab ich wohl vor lauter Bäumen den Wald nicht gesehen! :-b

Danke für eure Hilfe jetzt funktionierts^^