Da gibt es nichts zu initialisieren, weil der Tiny12 kein RAM hat.
Der 3-Stufen-Hardware-Stack initialisiert sich selbst.
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.
MfG
Stefan
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?
Hier ist mal mein Programm:
Das Programm ist dazu da, um den Blinker beim Auto dreimal aufleuchten zu lassen, wenn man den Blinkhebel antippt.Code: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
Wäre euch dankbar wenn ihr mir weiterhelfen köntet!
Hallo,
das Problem liegt hier :
Hier wird hingesprungenCode:loop: in temp2, PINB ;Taster betätigt? cpi temp2, 0b00001000 breq rechts <--------------- Falsch rjmp loop
Code: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.
Linus TorvaldSoftware is like s e x: its better when its free.
Hi Tob,
ich habe Dein Programm mal gewaltig zusammengestrichen, um Dir den Strukturfehler zu zeigen: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.Code:.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?
Gruß
Fred
Only entropy comes easy. - Anton Checkhov
Hallo Fred,
ähm, genau das hab ich ja schon vor 15 Minuten gesagt...
Gruß Sebastian
Linus TorvaldSoftware is like s e x: its better when its free.
Hallo Sebastian,
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?... genau das hab ich ja schon vor 15 Minuten gesagt...
MfG
Fred
Only entropy comes easy. - Anton Checkhov
Da hab ich wohl vor lauter Bäumen den Wald nicht gesehen!
Danke für eure Hilfe jetzt funktionierts^^
Lesezeichen