Forum: Mikrocontroller und Digitale Elektronik PIC12f510 Ausgangsfrequenz zu langsam


von konsti (Gast)


Lesenswert?

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

von Sascha (Gast)


Lesenswert?

Zeig mal deinen Code. 333kHz entspricht 6 ASM-Befehlen, der goto-Befehl 
für die Schleife braucht 2 Zyklen.

von Max H. (hartl192)


Lesenswert?

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
von K. S. (konsti)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

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
von K. S. (konsti)


Lesenswert?

@hartl192

Vielen Dank für die schnelle und präzise Antwort!

Gruß

konsti

von Wilhelm F. (Gast)


Lesenswert?

Hat der PIC eigentlich keinen XOR-Befehl, um ein bit zu toggeln? Das 
müßte ich aber selbst mal nach sehen.

von Max H. (hartl192)


Lesenswert?

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
von Wilhelm F. (Gast)


Lesenswert?

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?

von Max H. (hartl192)


Lesenswert?

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.

von Wilhelm F. (Gast)


Lesenswert?

M. H. schrieb:

> start
>   xorwf GPIO,f
>   goto start

Ja, sowas in der Art meinte ich.

von Max H. (hartl192)


Lesenswert?

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
...

von Wilhelm F. (Gast)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

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
von Wilhelm F. (Gast)


Lesenswert?

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?

von Max H. (hartl192)


Lesenswert?

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
Noch kein Account? Hier anmelden.