Forum: Mikrocontroller und Digitale Elektronik Problem mit PIC16F84(A) und einem Delay


von Necro F. (Firma: Schule) (miyabiningyo)


Angehängte Dateien:

Lesenswert?

meine aufgabe ist es ein led(in diesem fall PORTB, 0) mit einer 
bestimmten herz zahl zum blinken zu bringen.
dazu haben ich mir einfach ein delay code von 
http://www.piclist.com/techref/piclist/codegen/delay.htm machen lassen, 
da meine erfahrung noch nicht gros genug ist einen eigen zu erstellen
jetzt ist mein problem, dass er leider haengen bleibt in dem delay und 
es eigentlich gehen sollte.
ich weis das er irgendwann um
1
movlw 0x06
2
movwf d3
haengen bleibt und ich weis nicht warum
koennte mir bitte jemand helfen

mfg necro

von Necro F. (Firma: Schule) (miyabiningyo)


Lesenswert?

Ich habe herrausgefunden, dass er bei
1
decfsz  d1, f
 irgendwie haengen bleibt und ich weis nicht warum, denn laut Datenblatt 
ist das ein zulaessiger Command.
Ich bin am verweifen und bitte um Hilfe.
MFG Necro

von tastendrücker (Gast)


Lesenswert?

>meine aufgabe ist es es [...]

Gut.

>dazu haben ich mir einfach ein delay code von
>http://www.piclist.com/techref/piclist/codegen/delay.htm machen lassen,
>da meine erfahrung noch nicht gros genug ist einen eigen zu erstellen

Wieso nicht? Nicht aufgepasst? Wenn du keine Ahnung, dann verschaff dir 
welche.

>Ich habe herrausgefunden, dass er bei
>
> decfsz  d1, f
>
>irgendwie haengen bleibt und ich weis nicht warum,

Und wie hast du das herausgefunden? Dass das Prgogramm an der Stelle 
"hängen bleibt", kann ich nicht nachvollziehen.

von Necro F. (Firma: Schule) (miyabiningyo)


Lesenswert?

> Wieso nicht? Nicht aufgepasst? Wenn du keine Ahnung, dann verschaff dir
> welche.

Ich wurde einfach vor das Teil gesetzt ohne das man mir was erklaert hat 
bis auf wie ich bits pruefe und setze.


>>Ich habe herrausgefunden, dass er bei
>>
>> decfsz  d1, f
>>
>>irgendwie haengen bleibt und ich weis nicht warum,
>
> Und wie hast du das herausgefunden? Dass das Prgogramm an der Stelle
> "hängen bleibt", kann ich nicht nachvollziehen.

Der Befehl meint ja, dass er wenn in dem fall d1 0 ist springen soll.
Nur leider springt er bei mir nicht auch wenn ich d1 auf 0(oder 1 fuer 
den Fall wenn er erst decrementiert und dann prueft)
Somit macht das Programm immer wieder den Call der wieder vor das decfsz 
springt.
Leider habe ich entweder diesen Befehl nicht verstanden(auch nachdem ich 
ein ausfuehrliches Manual gelesen hab) oder er funktioniert nicht in 
dieser weise.

MFG Necro

von tastendrücker (Gast)


Lesenswert?

Die Anweisung decfsz 'springt' nicht, sie 'überspringt' (skipt) die 
nächste Anweisung, wenn (in deinem Fall) d1=0 ist. Hier mal ein paar 
Kommentare:


UP_wait05s
      ;2499992 cycles
  movlw  0x15    ; Zählschleife laden
  movwf  d1
  movlw  0x74
  movwf  d2
  movlw  0x06
  movwf  d3
UP_wait05s_0            ; Zählschleife ausführen.
  decfsz  d1, f          ; d1=d1-1 , d1=0?
  goto  $+2            ; nein d1!=0 -> goto ausführen
  decfsz  d2, f          ; ja   d1=0 -> d2=d2-1 , d2=0?
  goto  $+2            ; nein d2!=0 -> goto ausführen
  decfsz  d3, f          ; ja   d2=0 -> d3=d3-1 , d3=0?
  goto  UP_wait05s_0   ; nein d3!=0 -> goto ausführen


Bedenke, dass die Anweisung 'decfsz d1, f' hier einige tausendmal(!) bei 
jedem 'CALL UP_wait05s' ausgeführt wird!.

von Necro F. (Firma: Schule) (miyabiningyo)


Lesenswert?

tastendrücker wrote:
> Die Anweisung decfsz 'springt' nicht, sie 'überspringt' (skipt) die
> nächste Anweisung, wenn (in deinem Fall) d1=0 ist. Hier mal ein paar
> Kommentare:
>
>
> UP_wait05s
>       ;2499992 cycles
>   movlw  0x15    ; Zählschleife laden
>   movwf  d1
>   movlw  0x74
>   movwf  d2
>   movlw  0x06
>   movwf  d3
> UP_wait05s_0            ; Zählschleife ausführen.
>   decfsz  d1, f          ; d1=d1-1 , d1=0?
>   goto  $+2            ; nein d1!=0 -> goto ausführen
>   decfsz  d2, f          ; ja   d1=0 -> d2=d2-1 , d2=0?
>   goto  $+2            ; nein d2!=0 -> goto ausführen
>   decfsz  d3, f          ; ja   d2=0 -> d3=d3-1 , d3=0?
>   goto  UP_wait05s_0   ; nein d3!=0 -> goto ausführen
>
>
> Bedenke, dass die Anweisung 'decfsz d1, f' hier einige tausendmal(!) bei
> jedem 'CALL UP_wait05s' ausgeführt wird!.

Das mit dem Springen unde dem Ueberspringen war mir klar, dass er dann 
halt nicht die naechste Operation sondern die uebernaechste ausgefuehrt 
wird.

Die Delay-Schleife hab ich vorher auch schon verstanden nach dem ich es 
mir etwas genauer angeschaut habe. Tortzdem danke fuer die Erklaerung

Ich habe es jetzt hin bekommen in dem ich es in einem extra 
Unterprogramm aufrufe. Was da jetzt den unterschied macht hab ich aber 
nicht wirklich verstanden.

Vielen Dank Necro

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