avr rjmp problem

Gast #2977975
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
#2977980
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
Gast #2977995
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren