www.mikrocontroller.net

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


Autor: Necro Fuse (Firma: Schule) (miyabiningyo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
movlw 0x06
movwf d3
haengen bleibt und ich weis nicht warum
koennte mir bitte jemand helfen

mfg necro

Autor: Necro Fuse (Firma: Schule) (miyabiningyo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe herrausgefunden, dass er bei
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

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Necro Fuse (Firma: Schule) (miyabiningyo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!.

Autor: Necro Fuse (Firma: Schule) (miyabiningyo)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.