Hallo, ich habe seit ein paar Wochen ein STK500 und bis jetzt auch schon "recht erfolgreich" rumprogrammiert. (Ein Lauflicht, das die auf dem Board verbauten LEDs benutzt zum leuchten gebracht hat.) Der µC war ein ATMEGA8515. Leider musste ich jetzt festellen dass mein Controller wohl den Geist augegeben hat, weil er nach dem neu beschreiben nichtmehr funktioniert (also die LEDs leuchten nichtmehr und das beschreiben hat extrem lange gedauert... Normal waren so 1-2sekunden, beim letzten mal waren es bestimmt 20sek) Da ich aber keinen baugleichen ersatz hier habe wollte ich es jetzt nochmal mit einem ATTINY2313 versuchen. Jetzt bin ich mir aber nicht 100% sicher ob ich alles richtig gemacht habe. Die ISP-, die PORTB-LEDs bzw PORTD-SWITCHES Kabel habe ich nicht verändert. Den µC habe ich in den Roten sockel mit der Beschriftung SCKT3300D3 gesteckt. Zum Testen habe ich das folgende Programm benutzt: .include "tn2313def.inc" ldi r16, 0xFF out DDRB, r16 Main: ldi r16, 0b11111110 out PORTB, r16 rjmp loop ldi r16, 0b11111101 out PORTB, r16 rcall loop rjmp Main loop: ldi r17, 255 loop1:ldi r18, 255 loop2:dec r18 brne loop2 dec r17 brne loop1 ret ende: rjmp ende Jetzt sollten ja nach dem beschreiben des FLASH durch ISP die ersten zwei LEDs auf dem Board blinken. Tun sie aber nicht.... Es leuchtet nur LED0. Habe das Programm jetzt mal langsam durchlaufen lassen und er spring mit dem Befehl "ret" vom unterprogramm loop nicht zurück in die MAIN sondern an den Programmanfang (Erste zeile nach .include) Hat wer eine Idee was ich falsch gemacht habe? Schonmal vielen Dank für die Hilfe! :)
Weil keine Adresse im stackpointer ist, zu der er springen soll, also springt er an den anfang. wenn du loop mit rcall aufrufst, wir dire rücksprungadresse in den stackpointer geladen und beim return geht er zurück nach main:
Ich habs grad mal mit call ausprobiert, aber mein AVRStudio sagt mir dass der Attiny den Befehl nicht unterstützt... Und bei rcall bekomme ich eine Meldung Uninitialized stack pointer used at 0x0004 OK der stack ist für die Rücksprungadresse zuständig, aber wie soll ich den den denn Initialisieren? Ist dafür nicht meine .include am Anfang zuständig?
Ich hab mein Problem gelöst! Hier der neue CODE: .include "tn2313def.inc" LDI r16,LOW(RAMEND) ;Initiate Stackpointer OUT SPL,r16 ldi r16, 0xFF out DDRB, r16 Main: ldi r16, 0b11111110 out PORTB, r16 rcall loop ldi r16, 0b11111101 out PORTB, r16 rcall loop rjmp Main loop: ldi r16,255 LOOP1: ldi r17,255 LOOP2: ldi r18,5 LOOP3: dec r18 brne LOOP3 dec r17 brne LOOP2 dec r16 brne LOOP1 ret ende: rjmp ende VIELEN DANK FÜR DIE HILFE! =)
Hi
>Ist dafür nicht meine .include am Anfang zuständig?
Nein.
Normalerweise wird der Stack so initialisiert (ATTiny2313):
ldi r16,RAMEND
out SPL,r16
Allerdings wird beim ATTiny2313 der Stack beim Reset automatisch
initialisiert. Nur scheint das der Simulator(1) nicht zu wissen. Wenn du
den Simulator2 nimmst, kommt die Meldung nicht.
MfG Spess
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.