PIC Verzögerung 1 Sekunde, wie berechnet sichs ?

OP (Firma: unbekannt) #1640572
Lesenswert?

Ich hab mit einem PIC und dem MPLAB von der Herstellerfirma der Chips 
ein kleines Programm geschrieben, das halt ein KITT Licht erzeugt, wo 
die LEDs im Abstand von einer Sekunde blinken, allerdings versteh ich 
überhaupt nicht, warum die 3 Delay Schleifen eine Sekunde ergeben.



Ich weiß, dass ein Befehl 4 Taktzyklen braucht und die Sprunganweisungen 
8, der PIC taktet mit 4 Mhz





könnt ihr mir erklären, warum mein Code für eine Verzögerung von 1 
Sekunde sorgt, ich verstehs nämlich nicht, wie man das ausrechnet.


lg HeyHey
Angehängte Dateien:
#1640851
Lesenswert?

Hallo,

soweit ich das weiss braucht ein Befehl 1 Zyklus braucht / eine 
Sprumarke logischerweise 2.
Es gibt gute online Rechner für die wait loops.
mit ASM ist es am besten sich mit www.sprut.de zu beschäftigen. Hier 
gibt es alles für Assembler was das Herz begehrt. Von der LCD Uhr wo 
jeder Taktzyklus genauestens berechnet ist bis zu weiss gott ich was =)

Im Datenblatt gibt ist für jeden Befehl auch die entsprechenden 
Zeitangaben.

@4MHz braucht ein NOP genau eine ns.

4MHz ist eine "angesagte" Taktfrequenz - einfach mal nach pic loops 
calculator googln.

http://www.biltronix.com/picloops.html

is ganz ok ! und freeware..

Gruß
#1640852
Lesenswert?

huup hab ned genau gelesen: ööm das is wie eine mehrfach verschachtelte 
schleife.

for(durchlaufe 100 mal){
 for(durchlaufe 50 mal){
  for(durchlaufe 1000 mal){
   warte!
  }
 }
}

damit wir "warte!" 1000*50*100 mal aufgerufen

warum man nicht einfach 5000000 auf einmal aufruft?

also

for(durchlaufe 5000000 mal) {
 warte!
 }

?????

nunja die kleineren PICs kommt mit seinen 8 Bit halt gut nur mit zahlen 
bis 2^8 zurecht also 256. sonst muss man rumtricksen und so 
verschachtelt man lieber.
#1641185
Lesenswert?

ojemine ich chaos typ =)

bei 4 Mhz ist der Zyklustakt selbstverständlich 1 MHz.

Von diesen Zyklustakten braucht der PIC normalerweise 1 bei 
Sprungmarken, etc. 2. Da lagst du korrekter als ich.

Ausserdem habe ich mich nochmal vertan: 1µS sind es bei 4 Mhz und nicht 
eine 1ns!


Hier das hab ich dir noch rausgesucht:


Diese Wartezeit von 1 Bit wird mit der Routine Warte_s erledig. Die 
Wartezeit ist von der gewünschten Baudrate der RS-232-Verbindung und vom 
PIC Takt abhängig. Das Prinzip der Warteschleifen habe ich schon in 
einem anderen Beispiel erläutert.

Bei 9600Bps ist ein Bit genau 1/9600 Sekunde lang, das sind 104 µs.
Bei einem PIC-Takt von 4 MHz, werden Befehle im PIC mit einem Zyklustakt 
von 1 MHz abgearbeitet. Jeder Befehl (mit Ausnahme der wenigen Befehle, 
die 2 Zyklen lang sind) dauert folglich 1 µs.
Die Schleife von 'Warte1' bis zu 'goto Warte1' ist im Programm 6 Zyklen 
lang (goto benötigt 2 Zyklen), ein Durchlauf benötigt folglich 6 µs. Um 
1 Bit lang (also 104µs) zu verzögern, muß man die Schleife 16 mal 
durchlaufen. Diese durchläufe benötigen 96µs. Die noch verbleibenden 8 
µs verbauchen der Aufruf  von Warte_s, das Laden von cycl_2 sowie das 
Return.

;**********************************************************
;ein Bit Zeitverzoegerung mit einer Warteschleife
;
; senden            4 MHz    10 MHz
; 2400 Bps =          69d    173d
; 9600 Bps =          16d     43d

Warte_s movlw   D'16'           ; 9600 Bps / 4 MHz senden
        movwf   cycl_2          ;
Warte1
        nop
        nop
        nop
        decfsz  cycl_2, 1
        goto    Warte1
        return
Gast #1641259
Lesenswert?

Die Warteschleifen haben aber ein Problem: sie sind nicht so genau wie 
ein Timer. Beim Timer kann man nebenher noch etwas anders machen, Tasten 
pollen o.ö., ich arbeite daher bei Verzögerungen lieber mit den Timern. 
Der Aufwand ist minimal: Timer konfigurieren im INIT, beim Aufruf: Timer 
setzen und Timerflag pollen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren