Forum: Mikrocontroller und Digitale Elektronik PIC: Verzögerung läuft nicht wie geplant


von Michael (Gast)


Lesenswert?

Ich hab da ein kleines Problem mit ner Verzögerung. Und zwar will ich 
nen Delay von einer Minute aufbauen. Als PIC kommt ein PIC16F54 zum 
Einsatz.

Von der Sprut-Seite hab ich mir die Verzögerungsroutine geklaut und ein 
wenig modifiert sodass ich, grob, auf eine Minute komme. Aber meine 
Mathekenntnis lässt mich grade wohl im Stich denn die Verzögerung ist 
deutlich länger als eine Minute:
1
    movlw  .240        ;240 Schleifendurchgänge für 1 Minute: 60*4*250ms=240*250ms=1min
2
    movwf  outerloop
3
;*******geklaut von Sprut*******
4
loop1  movlw  .250        ;250 Schleifendurchgänge für 250ms
5
    movwf  innerloop
6
;delay für eine Millisekunde, 1 MHz Oszilator
7
loop2  movwf  .27         ;110/4=27.5, 110 fuer 4 MHz
8
    movwf  onemsloop
9
loop3  nop
10
    nop
11
    nop
12
    nop
13
    nop
14
    nop
15
    decfsz  onemsloop      ;onemsloop bei 0?
16
    goto  loop3        ;nein, nochmal durchlaufen
17
;delay für eine Millisekunde ist fertig
18
    decfsz  innerloop      ;innerloop fertig?
19
    goto  loop2        ;nein, nochmal durchlaufen
20
;*******geklaut von Sprut*******
21
;250 mal eine Millisekunden-Schleife ausgeführt    
22
    decfsz  outerloop      ;outerloop bei 0?
23
    goto  loop1        ;nein, nochmal durchlaufen

Stelle ich outerloop auf 4 ein für eine Sekunde dann läuft das Ganze 
zwischen drei und vier Sekunden (die eine Minutenvariante hab ich nicht 
ausgemessen). Als Oszilator habe ich einen RC-Schwingkreis (Config auf 
RC eingestellt) aber auch mit nem 4 MHz Quarz komme ich nicht hin. Kann 
es sein, dass der Oszilatoreingang am PIC kaputt ist? Ich hab leider 
derzeit keinen zweiten PIC mit dem ich testen könnte. Hab zwar hier 
neben dem 16F54 noch zwei 16F84 aber die sind mit dem PICKIT2 nicht 
programmierbar. Vielleicht ist aber auch was am Code falsch und jemandem 
springt es jetzt so direkt ins Auge nur ich seh mal wieder nix.

von K. J. (Gast)


Lesenswert?

Hi 1MIN bei 4mhz sieht bei mir wie folgt aus nen rc kanste für ne 
Zeitbasis knicken selbst nen Quarz ist da je nach Temperatur ziemlich 
anfällig zum kurtz mal ne min überbrücken geht es.

; Zeitverzögerung = 0.99999300s mit Osc = 4.00000000MHz

delay_1_sec
  movlw  D'6'
  movwf  ZählerC
delay_1_sec_loop
  call  sub_delay_1_sec
  decfsz  ZählerC,1
  goto  delay_1_sec_loop
  return

sub_delay_1_sec
  movlw  D'217'
  movwf  ZählerB
  movlw  D'111'
  movwf  ZählerA
sub_delay_1_sec_loop
  decfsz  ZählerA,1
  goto  sub_delay_1_sec_loop
  decfsz  ZählerB,1
  goto  sub_delay_1_sec_loop
  return

von Michael (Gast)


Lesenswert?

Danke für deine Mühe, ich hab meinen Fehler gefunden.

folgende Zeile (Zeile 7 im obigen Post von mir) war/ist falsch gewesen
1
loop2  movwf  .27         ;110/4=27.5, 110 fuer 4 MHz

Da muss natürlich
1
loop2  movlw  .27         ;110/4=27.5, 110 fuer 4 MHz

stehen. Ich glaub da ist es für mich zu Spät, vielleicht hilft ein 
Kaffee? Die Pause hat aber geholfen, wird Zeit für das WE.

Klar, ein RC-Schwingkreis ist für zeitkritische Sachen nicht wirklich zu 
gebrauchen aufgrund der Toleranzen aber mir genügen in meiner Anwendung 
auch 57 Sec oder 66 Sec. Es müssen nur ungefähr 60 Sekunden sein. Da 
soll eine Pumpe nachdem der Schwimmer wieder auf low geht noch ca. eine 
Minute nachpumpen ;)

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.