Forum: Mikrocontroller und Digitale Elektronik avr rjmp problem


von steffen (Gast)


Lesenswert?

Frohes neues Jahr

Ich bin noch am Anfang was Mikrocontroller betrifft. Mein Problem ist, 
dass eine Endlosschleife ignoriert wird.

 ende:

 nop

 RJMP ende

Das sieht erstmal unnötig aus. Das ist das Ende eines Programmes, 
welches eine 7Segment-Anzeige runter zählt. Ich möchte, dass sie nach 
einmal runterzählen abschaltet, egal wie. Ich dachte mir : Lass den 
Controller einfach nichts tun, und das in einer Schleife. Wenn ich das 
Programm nun laufen lasse, zählt er nach einer kurzen Pause wieder von 
Vorne. Im Debuggingmode vom avr studio 4 wird allerdings gemacht was 
gewollt ist. Hat das was mit dem Watchdog zu tun (nicht 
eingeschaltet/keine Fuse gesetzt)? geht es einfacher? (ganz bestimmt).

Über Hilfe freue ich mich
Steffen

von Simon B. (nomis)


Lesenswert?

steffen schrieb:
> Ich möchte, dass sie nach einmal runterzählen abschaltet, egal wie.

(Du könntest den µC u.U. auch schlafen legen (sleep).)

> Ich dachte mir : Lass den Controller einfach nichts tun, und das in
> einer Schleife. Wenn ich das Programm nun laufen lasse, zählt er nach
> einer kurzen Pause wieder von Vorne.

klingt als würde ein Reset ausgelöst. Z.B. durch einen Interrupt, der 
aktiviert, für den aber kein IRQ-Handler gesetzt ist. Oder tatsächlich 
der Watchdog.

> Hat das was mit dem Watchdog zu tun (nicht eingeschaltet/keine Fuse
> gesetzt)?

Es gibt diverse Möglichkeiten und ja, Watchdog ist nicht unplausibel. 
Wir könnten Dir aber besser helfen, wenn Du den kompletten Sourcecode 
hier bereitstellst.

Viele Grüße,
        Simon

von steffen (Gast)


Lesenswert?

.include "tn85def.inc" ; für einen ATtiny8515


.def zero  = r1
.def count = r16
.def temp1 = r17
.equ c1 =  0
.org 0x0000


.MACRO nops
                 nop
     nop
     nop
     nop
     nop
     nop
     nop
.ENDMACRO

       rjmp    main                ; Reset Handler

main:
           ldi     temp1, HIGH(RAMEND)
           out     SPH, temp1
           ldi     temp1, LOW(RAMEND)  ; Stackpointer initialisieren
           out     SPL, temp1


           ldi     temp1, $FF        ; die Anzeige hängt am Port D
           out     DDRB, temp1       ; alle Pins auf Ausgang

           ldi     count, 0          ; und den Zähler initialisieren
           mov     zero, count

loop:
           ldi     ZL, LOW(Codes*2)  ; die Startadresse der Tabelle in 
den
           ldi     ZH, HIGH(Codes*2) ; Z-Pointer laden

           mov     temp1, count      ; die wortweise Adressierung der 
Tabelle
           add     temp1, count      ; berücksichtigen

           add     ZL, temp1         ; und ausgehend vom Tabellenanfang
           adc     ZH, zero          ; die Adresse des Code Bytes 
berechnen

           lpm                       ; dieses Code Byte in das Register 
r0 laden

           out     PORTB, r0

           sbic    PINB, 5

   rjmp    ende          ; und an die Anzeige ausgeben

           inc     count             ; den Zähler erhöhen, wobei der 
Zähler
           cpi     count, 4
           brne    delay1            ; immer nur von 0 bis 9 zählen soll
           ldi     count, 0


          delay1:

            ldi R25,HIGH(c1)
            ldi R24,LOW(c1)

          Loop1:
               nops
               nops

          sbiw    R24,1
          brne    Loop1

          RJMP    loop              ; auf zur nächsten Ausgabe




              ende:

               nop

              RJMP ende


Codes:
       .db     0b10000000
       .db     0b11000100
       .db     0b11011001
       .db     0b00100000


Ich will mich hier nicht mit fremden Federn schmücken, das ist ein 
veränderter Code aus dem Internet. Ich hab hier alles mal ausprobiert. 
.db 4 ist nur um den Befehl sbic auszuführen und statt einer (für mich 
undurchsichtigen) schleife ein 16 Bit Zähler (delay1). Selbst vor Makros 
habe ich nicht halt gemacht.

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

dein Ende wir ja nur erreicht wenn am Eingang PB5 irgendwas passiert 
(H-Pegel anliegt), an sonsten geht der Zähler wieder von 0 los.

Sascha

von steffen (Gast)


Lesenswert?

AHHHHHHHHH
So einfach. Ich versuch das ganze jetzt nochmal ohne .db Tabelle. Ist 
wahrscheinlich umständlicher aber da sollte ja noch genug Speicher über 
sein.
Vielen Dank @ Sascha

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.