Frage zu Spruts Lauflicht Beispiel Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
Frage zu Spruts Lauflicht Beispiel |
|
|
|
|
BID = 384150
Herrminator Gelegenheitsposter
Beiträge: 87
|
|
Hallo zusammen,
habe mich gestern durch das Lauflicht Beispiel von Sprut durchgearbeitet. Habe hinter jede Zeile geschrieben was der PIC macht. Nun verstehe ich den Parameter F nicht in folgendem Programmteil:
; Warteschleife 250 ms
Wait
movlw D'250' ; 250 ms Pause
movwf loops
Wai
movlw .110 ; Zeitkonstante für 1ms
movwf loops2
Wai2 nop ;
nop
nop
nop
nop
nop
--> decfsz loops2, F ; 1 ms vorbei?
goto Wai2 ; nein, noch nicht
;
--> decfsz loops, F ; 250 ms vorbei?
goto Wai ; nein, noch nicht
retlw 0 ; das Warten hat ein Ende
end
In der Befehlsbeschreibung heisst es:
Syntax: DECFSZ f,d
Bedeutung: wenn d=0: Vom Wert in f wird 1 abgezogen,
und das Ergebnis in W gespeichert.
wenn d=1: Vom Wert in f wird 1 abgezogen,
und das Ergebnis wieder in f gespeichert.
Ist das Ergebnis der Subtraktion Null, dann wird der nächste Befehl im Programm übersprungen, und mit dem übernächsten weitergebacht.
----------------------------------------------------------
Das heißt für mich das das kleine f aus der Beschreibung mein loops bzw loops2 ist. Wenn ich das aber richtig verstanden habe sollte jetzt dich 0 oder 1 folgen.
Oder für was steht das f ?
Bin mal gespannt was ich da falsch verstanden habe.
MfG
Tobias
|
|
BID = 384797
qutom Gelegenheitsposter
Beiträge: 58 Wohnort: Marl
|
|
Hallo.... vieleicht kann ich da weiterhelfen...
Der Befehl:
DECFSZ f,d
Heisst:
Vermindere um 1, überspringe nächsten Befehl, wenn f=0.
Der Inhalt von "f" wird um 1 erniedrigt und das Ergebnis, wenn
d=0 im W Register
d=1 im f Register, gespeichert. Ist das Ergebnis gleich Null, dann wird der nächste Befehl übersprungen.
Das W Register ist das Working Register, sozusagen der Akkumulator. Das f Register ist der Ram Speicher.
So kann man einfache Zeitschleifen machen.
z.b.
movlw 055H ; Lade 55Hex im Akkumulator
movwf count ; Kopiere Akkumulator ins Ram Speicher
loop:
decfsz count,f ; Decrementiere Ram Speicher 55Hex um 1
goto loop ; ist der Ram Speicher irgendwann leer,
Return ; dann überspringe "goto loop" und springe
; zum Return
|
|
BID = 384817
Herrminator Gelegenheitsposter
Beiträge: 87
|
Danke erst mal. Dein Beispiel habe ich verstanden. Gleich mal simuliert.
Wenn ich das richtig verstanden habe heißt das :
DECFSZ f,d f=count d=1
was bedeutet das von dezimal 85 bis 1 im f Register also in der Speichervariablen count abgezogen wird. Und bei 0 dann in das Register W (Akku) 0 geschrieben wird und dann der nächste Befehl übersprungen wird ? Somit wäre W = 0
Jetzt bin ich mal gespannt....
|
BID = 385259
stepp64 Gesprächig
Avatar auf fremdem Server ! Hochladen oder per Mail an Admin
Beiträge: 162
|
Hallo,
für das d in den Befehlen musst du nicht unbedingt eine 0 oder eine 1 schreiben. Du kannst auch W oder F schreiben. Der Befehl DECFSZ count,0 ist das selbe wie DECFSZ count,W. Es ließt sich halt einfach besser wenn da W oder F statt 0 oder 1 steht. Den Wert hinter dem Komma musst du immer angeben, wenn es die Syntax verlangt. Machst du dass nicht, setzt der Compiler automatisch den Wert auf F und gibt einen Hinweis aus. Das ist könnte dann falsch werden, wenn du das Ergebnis eigentlich in W haben wolltest. Also immer schön mit angeben ob das Ziel F oder W sein soll.
Der DECFSZ arbeitet nicht ganz so wie du es beschrieben hast.
DECFSZ count,w bedeutet, dass von dem Wert in count 1 abgezogen wird und das Ergebnis nach w kopiert wird (count verändert sich nicht!). Dann wird verglichen, ob das Ergebnis gleich 0 ist. Ist dem so, wird der nächste Befehl übersprungen, ansonsten nicht. Dieser Befehl ist eigentlich völlig sinnlos, da sich count nicht verändert und der Test somit immer gleich verläuft. Dieser Befehl macht nur Sinn, wenn du das Ergebniss nach f kopierst, also DECFSZ count,f. Dann kannst du damit Zählschleifen bauen, die solange durchlaufen werden, bis count gleich 0 wird. Der Wert hinter dem Komma gibt immer das Ziel der Operation an!
Gruß Sven
[ Diese Nachricht wurde geändert von: stepp64 am 12 Nov 2006 22:18 ]
|
BID = 392169
Herrminator Gelegenheitsposter
Beiträge: 87
|
Hallo zusammen,
entschuldigt war mal wieder auf Service im Ausland. Danke an euch. Jetzt habe ichs verstanden.
Liebe Grüße
Tobias
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 22 Beiträge im Durchschnitt pro Tag heute wurden bisher 2 Beiträge verfasst © x sparkkelsputz Besucher : 182686904 Heute : 217 Gestern : 7485 Online : 417 7.1.2025 1:23 1 Besucher in den letzten 60 Sekunden alle 60.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0629210472107
|