Archiv verlassen und diese Seite im Standarddesign anzeigen : stack initialisieren Attiny 12?
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 ](*,)
Da gibt es nichts zu initialisieren, weil der Tiny12 kein RAM hat.
Der 3-Stufen-Hardware-Stack initialisiert sich selbst.
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:)
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.
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
Hallo Fred,
ähm, genau das hab ich ja schon vor 15 Minuten gesagt...
Gruß Sebastian
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
Da hab ich wohl vor lauter Bäumen den Wald nicht gesehen! :-b
Danke für eure Hilfe jetzt funktionierts^^
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.