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.