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
Zeig mal deinen Code. 333kHz entspricht 6 ASM-Befehlen, der goto-Befehl für die Schleife braucht 2 Zyklen.
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.
:
Bearbeitet durch User
Hallo Jungs, vielen dank für die schnelle Antwort! Hier der Quellcode für ASM:
1 | #include "p12F510.inc" |
2 | |
3 | ; CONFIG |
4 | ; __config 0xFFEA |
5 | __CONFIG _OSC_IntRC & _WDT_OFF & _CP_OFF & _MCLRE_OFF & _IOSCFS_ON |
6 | |
7 | org 0x000 |
8 | movwf OSCCAL ; apply internal RC factory calibration |
9 | movlw b'00000000' ; all ports as output |
10 | tris GPIO |
11 | start |
12 | movlw b'111111' ; set GPIO high |
13 | movwf GPIO |
14 | movlw b'000000' ;set GPIO low |
15 | movwf GPIO |
16 | goto start ; endless loop |
17 | |
18 | end |
Quellcode in Hi-Tech PICC lite:
1 | #include <stdio.h> |
2 | #include <stdlib.h> |
3 | #include <htc.h> |
4 | |
5 | /*
|
6 | *
|
7 | */
|
8 | int main(int argc, char** argv) { |
9 | __CONFIG(OSC_IntRC & WDT_OFF & CP_OFF & MCLRE_OFF & IOSCFS_ON); |
10 | CM1CON0=7; // disable Comparator |
11 | ADCON0=7; // disable AD |
12 | TRIS=0x00; // all ports as output |
13 | GPIO=0; |
14 | while(1){ |
15 | GPIO=~GPIO; |
16 | }
|
17 | return (EXIT_SUCCESS); |
18 | }
|
in beiden Fällen erhalte ich die selbe Ausgangsfrequenz.
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
:
Bearbeitet durch User
@hartl192 Vielen Dank für die schnelle und präzise Antwort! Gruß konsti
Hat der PIC eigentlich keinen XOR-Befehl, um ein bit zu toggeln? Das müßte ich aber selbst mal nach sehen.
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
:
Bearbeitet durch User
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...
:
Bearbeitet durch User
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.