PIC12f510 Ausgangsfrequenz zu langsam

Gast #3435493
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
#3435539
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.
#3435715
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.
#3435718
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
#3435841
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
Gast #3435848
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?
Gast #3435865
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.
#3435876
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...

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