Hallo allerseits,
ich bin derzeit etwas ratlos und daher bitte ich Euch um Eure Hilfe.
Seit langer Zeit habe ich wiedermal angefangen zu programmieren. Da ich
bereits in der Vergangenheit mit dem PICs gearbeitet habe, entschied ich
mich für den pic12f510. Wie bei allem probiert man zunächst die
allereinfachsten Sachen, in meinem Fall: Pin toggeln. Und siehe da, es
funktioniert!
Was mich aber stutzig gemacht hat ist, dass meine Ausgangsfrequenz bei
ca. 330kHz liegt, obwohl der Pic mit 8MHz (interner Oszillator)
konfiguriert ist.
Im Datenblatt steht, dass der Maschinenzyklus bei vier Takten liegt.
Somit sollte eine Frequenz von ca. 1MHz am Ausgang zu sehen sein. Stimmt
das oder irre ich mich?
Danke im Voaus
konsti
konsti schrieb:> Was mich aber stutzig gemacht hat ist, dass meine Ausgangsfrequenz bei> ca. 330kHz liegt, obwohl der Pic mit 8MHz (interner Oszillator)> konfiguriert ist.
Sicher, dass der Interne Oszillator richtig eingestellt ist?
Wenn du uns den Code zeigst, können wir besser Helfen.
Wenn man die Schleife so macht:
btg LATC,0 //1 Zyklus
goto $-1 //2 Zyklen
dauert ein Durchlauf der Schleife 3 Zyklen. Eine Periode des Signals
braucht aber 2 Schleifendurchläufe, einen für high, den andern für low.
Dann sind wir bei den 6 Zyklen die Sascha erwähnt hat.
Konstantin Senef schrieb:> start> movlw b'111111' ; set GPIO high> movwf GPIO> movlw b'000000' ;set GPIO low> movwf GPIO> goto start ; endless loop
Das sind die 6 Befehlszyklen. Es ist also sehr Normal, dass der PIC mit
diesem Code bei einer Taktfrequenz von 8MHz 333.333kHz ausgibt.
Schneller wärs mit:
start
setf GPIO
clrf GPIO
goto start
Das sin 4 Befehlszyklen pro Periode --> 500kHz
Konstantin Senef schrieb:> while(1){> GPIO=~GPIO;> }
Daraus wird der Compiler wahrscheinlich das machen:
btg LATC,0 //1 Zyklus
goto $-1 //2 Zyklen
und wir sind wieder bei den 6 Befehlszyklen pro Periode des
Ausgangssignals
Wilhelm F. schrieb:> Hat der PIC eigentlich keinen XOR-Befehl, um ein bit zu toggeln? Das> müßte ich aber selbst mal nach sehen.
Hat er, es gibt:
-xorlw
-xorwf
Und btg ist fürs Toggeln eines einzelnen bits.
Der TO schreibt in senem Beitrag:
konsti schrieb:> Pin toggeln
Deshalb bin ich auf eine Lösung mit btg gekommen.
Mit XOR würde das Toggeln des ganzen Ports so aussehen:
movlw 0xFF
start
xorwf GPIO,f
goto start
M. H. schrieb:> Wilhelm F. schrieb:>> Hat der PIC eigentlich keinen XOR-Befehl, um ein bit zu toggeln? Das>> müßte ich aber selbst mal nach sehen.> Hat er, es gibt:> -xorlw> -xorwf>> Und btg ist fürs Toggeln eines einzelnen bits.
"btg" gibt es glaube ich im Befehlssatz gar nicht, aber ich hab auch nur
den des PIC12Fxxx vor liegen. Wahrscheinlich eine Makro-Definition, oder
nicht?
Wilhelm F. schrieb:> "btg" gibt es glaube ich im Befehlssatz gar nicht
Du hast recht der PIC12 kann wie der PIC16 btg nicht, aber der PIC18
kanns. Sry für die falsche Info.
Richtig ist das dann so:
Konstantin Senef schrieb:
> while(1){> GPIO=~GPIO;> }
Daraus wird der Compiler wahrscheinlich das machen:
comf GPIO,f //1 Zyklus
goto $-1 //2 Zyklen
...
M. H. schrieb:> Richtig ist das dann so:>> Konstantin Senef schrieb:>> while(1){>> GPIO=~GPIO;>> }> Daraus wird der Compiler wahrscheinlich das machen:> comf GPIO,f //1 Zyklus> goto $-1 //2 Zyklen> ...
Mit comf toggelt der aber den ganzen Port. Man sollte auf jeden Fall
aber auch mal einen Blick ins Assembler-Listing werfen.
Wilhelm F. schrieb:> Mit comf toggelt der aber den ganzen Port.
Das macht sein asm Code auch:
K. S. schrieb:> start> movlw b'111111' ; set GPIO high> movwf GPIO> movlw b'000000' ;set GPIO low> movwf GPIO> goto start ; endless loop
Und laut DB des PIC12F510 heißt der ganze PORT GPIO und die einzelnen
bits heißen GP<5:0>
In C-Code müsste er also auch den gesamten Port toggeln.
Und setf hat der PIC12 wie ich jetzt gesehen habe auch nicht, wieder nur
der PIC18.
Ich habe in der Schule ein halbes Jahr PIC16 in asm Programmiert, privat
mache ich PIC18 und manchmal PIC12. Dann kann es passieren, dass man mit
den Befehlen etwas durcheinander kommt- Der Befehlssatz des PIC12 ich
von mir aus eine Mischung aus dem vom PIC16 und PIC18...
M. H. schrieb:> Wilhelm F. schrieb:>> Mit comf toggelt der aber den ganzen Port.> Das macht sein asm Code auch:
Warum schaut er sich die Befehle bsf und bcf nicht mal an?
Wilhelm F. schrieb:> Warum schaut er sich die Befehle bsf und bcf nicht mal an?
Vllt. will er den ganzen Port toggeln. Sonst hätte wahrscheinlich nich
tmovlw b'111111' geschrieben.
Eine eigene Frage?
Dieser Thread ist über 12 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.