Forum: Mikrocontroller und Digitale Elektronik STK500 + Attiny2313


von Dobby (Gast)


Lesenswert?

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

von Philipp (Gast)


Lesenswert?

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:

von DerGast (Gast)


Lesenswert?

Dobby schrieb:
> rjmp loop

probier mal rcall

von Dobby (Gast)


Lesenswert?

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?

von Dobby (Gast)


Lesenswert?

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

von Spess53 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.