Assembler blinkt nicht

Hallo,

ich hab es nun fertig gebracht, einen funktionsfähigen Brenner zu bauen (manche erinnern sich vielleicht ^^) und bin nun dabei, Assembler zu lernen. So weit so gut. Ich hab ein nettes Tutorial gefunden, verstehe alles, und es soll was blinken. Tut es aber nicht, es leuchtet nur dauerhaft.

Nach dem Gruß folgt das komplette Programm (sieht mangels Tabstops leider sehr hässlich aus). Sieht jemand den Fehler? Ich glaube, dass er irgendwie mit der Schleife zusammenhängt, denn bis zum ersten Aufruf der Subroutine kann ich die LED auf dem gleichen Weg, wie ich sie angemacht habe, auch wieder abschalten - danach funktioniert das nicht mehr.
Laut Tutorial soll da 255 Mal von 255 bis 0 runtergezählt und dann die LED umgeschaltet werden. Wie diese Schleife funktioniert ist mir ohnehin nicht ganz klar - wer setzt die 0 wieder auf 255 zurück? Mit einem Taster an Port A kann man die Frequenz halbieren, das ist aber erstmal unwichtig, denn solange nichts blinkt, hab ich davon nix.

Danke schonmal allen, die sich überhaupt die Zeit nehmen, das alles anzusehen :smile:

mfg
MB

;*****Set up the Constants****

STATUS equ 03h ;Address of the STATUS register
TRISB equ 86h ;Address of the tristate register for port A
PORTB equ 06h ;Address of Port A
TRISA equ 85h ;Address of the tristate register for port A
PORTA equ 05h ;Address of Port A
COUNT1 equ 08h ;First counter for our delay loops
COUNT2 equ 09h ;Second counter for our delay loops

;****Set up the port****

bsf STATUS,5 ;Switch to Bank 1
movlw b’00000000’ ;Set the Port B pins
movwf TRISB ;to output.
movlw b’11110000’ ;Set the Port A pins:
movwf TRISA ;bit 1 to output, bit 0 to input.
bcf STATUS,5 ;Switch back to Bank 0

;****Turn the LED on****

Start movlw b’00100000’ ;Turn the LED on by first putting
movwf PORTB ;it into the w register and then
;on the port

;****Start of the delay loop 1****

call Delay

btfsc PORTA,0
call Delay

;****Delay finished, now turn the LED off****

movlw b’00000001’ ;Turn the LED off by first putting
movwf PORTB ;it into the w register and then on
;the port

;****Add another delay****

call Delay

btfsc PORTA,0
call Delay

;****Now go back to the start of the program

goto Start ;go back to Start and turn LED
;on again
;****Here is our Subroutine

Delay

Loop1 decfsz COUNT1,1 ;This second loop keeps the LED
goto Loop1 ;turned off long enough for us to
decfsz COUNT2,1 ;see it turned off
goto Loop1
return

;****End of the program****

end ;Needed by some compilers,
;and also just in case we miss
;the goto instruction.

Wichtigstes vergessen: Es geht um einen PIC16F627
owT

Hallo,

ich hab es nun fertig gebracht, einen funktionsfähigen Brenner
zu bauen (manche erinnern sich vielleicht ^^) und bin nun
dabei, Assembler zu lernen. So weit so gut. Ich hab ein nettes
Tutorial gefunden, verstehe alles, und es soll was blinken.
Tut es aber nicht, es leuchtet nur dauerhaft.

Hallo,

im Ablauf sehe ich auf den ersten Blick keinen Fehler (ein Register zählt automatisch von 255 aufwärts -> 0 und abwärts von 0 -> 255). Ich würde daher mal die Konstanten überprüfen. Mir ist insbesondere nicht klar, wieso du die LED mit ‚00100000‘ ein- und mit ‚00000001‘ ausschaltest, aber ich kenne ja die Beschaltung nicht.

Gruss Reinhard

Hallo,

im Ablauf sehe ich auf den ersten Blick keinen Fehler (ein
Register zählt automatisch von 255 aufwärts -> 0 und
abwärts von 0 -> 255). Ich würde daher mal die Konstanten
überprüfen.

?!
Wenn ich eins abziehe wird die Zahl größer? Das verwirrt mich :smile:

Mir ist insbesondere nicht klar, wieso du die LED
mit ‚00100000‘ ein- und mit ‚00000001‘ ausschaltest, aber ich
kenne ja die Beschaltung nicht.

An Port A0-A3 hängen Taster, an Port B0-B5 LEDs. Ursprünglich war es auch so gedacht, dass nur die erste LED in der Reihe (B5) an und aus geht, ich hab es nur zu Diagnosezwecken so umgestellt, dass gleichzeitig auch die letzte (B0) an geht. Ich wollte damit testen, ob das Teil einfach nur so schnell an und aus geht, dass ich es nicht sehen kann - wäre das der Fall gewesen, hätte ich zwei leuchtende LEDs gehabt. Ist aber nicht der Fall, die erste leuchtet beharrlich weiter.

Was genau soll ich an den Konstanten denn überprüfen?

mfg
MB

Hallo,

Was genau soll ich an den Konstanten denn überprüfen?

ich hab die Adresse mal gewechselt (neues Ziel: 20h und 21h, eiskalt aus einem anderen Beispiel abgepinnt). Jetzt gehts. Mit diesem kleinen Detail (Speicher und so Kram) muss ich mich wohl nochmal genauer beschäftigen :smile:

Danke fürs Draufschubsen.

mfg
MB

Hallo MB,

im Ablauf sehe ich auf den ersten Blick keinen Fehler (ein
Register zählt automatisch von 255 aufwärts -> 0 und
abwärts von 0 -> 255). Ich würde daher mal die Konstanten
überprüfen.

?!
Wenn ich eins abziehe wird die Zahl größer? Das verwirrt mich

)

oder wenn du 1 addierst wird sie kleiner!!
Du musst dir das ganze binär ansehen.
255D = 11111111B

 11111111<sub>B</sub>
+ 1<sub>B</sub>
= 1'00000000<sub>B</sub>
Da das Register aber nur 8 Bit breit ist, geht der Übertrag verloren.


MfG Peter(TOO)

Hallo,

ich hab die Adresse mal gewechselt (neues Ziel: 20h und 21h,
eiskalt aus einem anderen Beispiel abgepinnt). Jetzt gehts.
Mit diesem kleinen Detail (Speicher und so Kram) muss ich mich
wohl nochmal genauer beschäftigen :smile:

Schau mal ins Datenblatt:
http://ww1.microchip.com/downloads/en/DeviceDoc/4030…
Auf Seite14 findest Du die Speicheradressen im RAM. und wenn Du da mal auf die ursprünglich benutzen 08h und 09h schaust: die werden immer als ‚0‘ gelesen, weil da gar kein RAM ist.
Btw., es ist immer sinnvoll, eine Speicherzelle nach dem Reset zu initialisieren. Und alle sinnvoll zu verwendenden Steuerregister ebenfalls (Ports, Interrupts, Timer etc.). Es kann immer mal sein, dass man einen anderen als den ursprüngliche ausgesuchten Prozessortyp verwendet und der andere Typ sich ein klein wenig anders verhält. Oder dass sich nach dem Power-on andere Registerinhalte ergeben als vermutet.
‚Defensive Programmierung‘ nennt man das.
Gruß
loderunner

Hallo,

@Peter(TOO):

Da das Register aber nur 8 Bit breit ist, geht der Übertrag
verloren.

ich verstehe…ungewohnt, aber praktisch einzusetzen ^^

@(I|l)oderunner

(Ist das in deinem Namen ein kleines L oder ein großes I? Dchlecht zu erkennen hier)
Das Datenblatt liegt ständig neben MPLAB…ich hätte mir nur schlauerweise auch das Datenblatt vom 16F84 anschauen sollen, denn für den ist das Tutorial geschrieben und der hat da offenbar Speicher. Aus irgend einem Grund bin ich gestern Abend zu der Annahme gekommen, dass die grauen Bereiche zu meiner freien Verwendung bereit stehen…

mfg
MB

Anmerkung o.T.
Hallo,

@(I|l)oderunner
(Ist das in deinem Namen ein kleines L oder ein großes I?
Dchlecht zu erkennen hier)

LODERUNNER.
Wie das Spiel damals unter anderem auf C64 und (in meinem Fall) auf dem Apple][. Ein kleines Männchen in einem Labyrinth aus Leitern und Ziegelsteinen mit einer Energiepistole, die für bestimmte Zeit die Ziegelsteine verschwinden lässt, wird von anderen kleinen Männchen gejagt.
Hier gibt es eine Dos-Version:
http://retrograde.trustno1.org/broderbund.htm

Gruß
loderunner

Danke. (ot)
Hallo,

LODERUNNER.

gut, dass ich das jetzt endlich weiß, bin schon mehrere Male drübergestolpert :smile:

Das Spiel hab ich sogar schon gesehen und gespielt… bzw. versucht, es zu spielen. Bin aber nicht so ganz damit zurecht gekommen, soweit ich mich erinnere… Habs noch auf einer „DOS-Spielesammlung“-CD.

mfg
MB