Hallo,
derzeit versuche ich mich etwas in die PIC Assembler Sprache
einzuarbeiten. Nur komme ich im Moment leider nicht von alleine weiter.
Zuerst einmal mein Beispielcode, an dem es bei mir mit dem Verständnis
ein bisschen hakt.
Es handelt sich um einen PIC16c620 mit 4Mhz
Der Übersicht halber, poste ich nur die relevanten Auszüge aus dem
gesamt Beispielcode. Zumindest denke ich, dass sie relevant sind.
Auszug 1:
1 | tmpw equ h'0028' ; temp.Variable fuer W-Reg
|
2 | IOPTION equ b'01000101' ;Option-Register
|
Auszug 2: Die Main Funktion, über die dann weitere aufgerufen werden
1 | START
|
2 | call INIT ; System initialisieren
|
Von dort aus wird ja in die Subroutine INIT gesprungen von der ich nun
den nächsten Auszug vorstelle.
1 | INIT:
|
2 |
|
3 |
|
4 | movlw IOPTION ;Option-Register initial.
|
5 | option ;TMR0-Prescaler 1:64
|
6 |
|
7 |
|
8 | movlw b'10010000' ;Intcon-Register initial.
|
9 | movwf INTCON
|
10 |
|
11 | call WAIT_2 ;PAUSE
|
Soweit denke ich, dass ich den Code verstanden habe. Mit Call WAIT_2 wir
eine Funktion aufgerufen, die nichts beinhaltet, außer zweimal
hintereinander die Funktion PAUSE aufruft.
Also call PAUSE
call PAUSE
Nur leider verstehe ich in folgendem Beispielcode nun nicht, wie man auf
die 3,1ms Pause kommt. Bzw. was die 9600 zu bedeuten haben.
So wie ich das verstanden habe, benötigt der PIC16 für einen Zyklus 4
Takte. Bei 4 MHZ wären das ja dann 1uS pro Zyklus.
Man zählt von h'F0' was ja Dez. 240 entspricht jeweils einen Schritt
herunter und springt dann mit GOTO wieder hinauf, bis man bei 0 landet.
Ich meine gelesen zu haben, dass ein GOTO Befehl 2 Zyklen benötigt.
Mit folgender Formel habe ich dann versucht auf die 3,1ms zu kommen, bin
aber in allen möglichen Varianten daran gescheitert.
Formel siehe folgenden Link :
http://home.arcor.de/tobias-herke/01_E-TECH/Kurse/Zeitschleifen.html
Ich verstehe einfach nicht, wie man durch diese Funktion 3,1 ms Pause
realisiert ...
1 | movlw h'F0' ;Warteschleife einstellen 3.1 ms (9600)
|
2 | movwf tmpw ;einstellen
|
3 |
|
4 | clrwdt ;WDOG triggern
|
5 |
|
6 | W1_LOOPBIT
|
7 | decfsz tmpw,1 ;Pruefen ob innere Schleife
|
8 | goto W1_LOOPBIT ;noch durchlaufen werden muss
|
9 |
|
10 | movlw h'F0' ;Warteschleife einstellen 3.1 ms (9600)
|
11 | movwf tmpw ;einstellen
|
12 |
|
13 | clrwdt ;WDOG triggern
|
14 |
|
15 | W2_LOOPBIT
|
16 | decfsz tmpw,1 ;Pruefen ob innere Schleife
|
17 | goto W2_LOOPBIT ;noch durchlaufen werden muss
|
18 |
|
19 | clrwdt ;WDOG triggern
|
20 |
|
21 | movlw h'47' ;Warteschleife einstellen 3.1 ms (9600)
|
22 | movwf tmpw ;einstellen
|
23 |
|
24 | W3_LOOPBIT
|
25 | decfsz tmpw,1 ;Pruefen ob innere Schleife
|
26 | goto W3_LOOPBIT ;noch durchlaufen werden muss
|
27 |
|
28 | return
|
Die Funktion wird zweimal hintereinander aufgerufen.
Vielen Dank für eure Hilfe.