- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 8 von 8

Thema: stack initialisieren Attiny 12?

  1. #1
    Benutzer Stammmitglied Avatar von Tob
    Registriert seit
    11.01.2005
    Beiträge
    58

    stack initialisieren Attiny 12?

    Anzeige

    Praxistest und DIY Projekte
    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

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Da gibt es nichts zu initialisieren, weil der Tiny12 kein RAM hat.
    Der 3-Stufen-Hardware-Stack initialisiert sich selbst.
    MfG
    Stefan

  3. #3
    Benutzer Stammmitglied Avatar von Tob
    Registriert seit
    11.01.2005
    Beiträge
    58
    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:

    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
    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!

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hallo,
    das Problem liegt hier :

    Code:
    loop:
       in temp2, PINB         ;Taster betätigt?
       cpi temp2, 0b00001000
       breq rechts <--------------- Falsch
    
       rjmp loop
    Hier wird hingesprungen
    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.
    Software is like s e x: its better when its free.
    Linus Torvald

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    69
    Beiträge
    622
    Hi Tob,

    ich habe Dein Programm mal gewaltig zusammengestrichen, um Dir den Strukturfehler zu zeigen:
    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?
    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
    Only entropy comes easy. - Anton Checkhov

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hallo Fred,

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

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

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    69
    Beiträge
    622
    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
    Only entropy comes easy. - Anton Checkhov

  8. #8
    Benutzer Stammmitglied Avatar von Tob
    Registriert seit
    11.01.2005
    Beiträge
    58
    Da hab ich wohl vor lauter Bäumen den Wald nicht gesehen!

    Danke für eure Hilfe jetzt funktionierts^^

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress