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