Forum: Mikrocontroller und Digitale Elektronik Probleme mit dem Takt bei PIC 18F2455


von Michael (Gast)


Lesenswert?

Hallo zusammen,
bin gerade dabei einen PIC 18F2455 zu programmieren und mache meine 
ersten Versuche. Wollte daher einfach mal einen Port setzen und 
rücksetzen, also eine Art Blinklicht. Nun ist das Problem, dass der Takt 
hinten und vorne nicht stimmt. Habe von sprut den Bootloader5 mit einem 
Brenner5 und der Software P18 in den PIC geladen. Das hat soweit 
funktioniert. Nun habe ich folgendes kleines Testprogramm:

#ORG 0x0800,0x5FFF  // 0 - 0x7FF benötigt für Sprut-Bootloader

void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF|ADC_TAD_MUL_0);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2|RTCC_8_bit);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);

while(1)
{
OUTPUT_HIGH(PINB7);
delay_ms(2000);
OUTPUT_LOW(PINB7);
delay_ms(2000);
}
}

Mein Problem ist nun, dass der Takt am Port B 7 viel zu hoch ist, etwa 
im Bereich von 20kHz. Ich betreibe den PIC an einem Quarz mit 4 MHz. Die 
Einstellungen wie PLLDIV etc. habe ich auf Richtigkeit überprüft. Wo 
liegt mein Fehler? Danke im Voraus,
Gruß Michael

von Severino R. (severino)


Lesenswert?

Michael wrote:

> delay_ms(2000);

delay_ms() muss wissen, wie schnell der Mikrocontroller läuft. Wo wird 
das definiert?
Und übrigens: Welcher Compiler und welche Libraries werden verwendet?
Und: Läuft das Ganze in MPLAB SIM korrekt?

von Michael (Gast)


Lesenswert?

Hallo Severino,
die Geschwindigkeit ist über den Bootloader eigentlich vorgegeben. Habe 
den für 4 MHz verwendet. Oder liege ich da falsch?
Als Compiler verwende ich den PCWH Version 3.219. Habe die PIC18F2455.h 
included.
Den MPLAB SIM habe ich nicht, kann also nicht sagen ob es da korrekt 
funktionieren würde.
Gruß Michael

von Daniel P. (ppowers)


Lesenswert?

sieht nach dem CCS C - Compiler aus.
Da muss der Takt für das delay_ms(..) mit der folgenden Zeile vorgegeben 
werden (für einen 4 MHz Quarz):
#use delay(clock=4000000)

Welche Konfigurationen setzt denn der Bootloader? Kann es sein, dass vom 
Bootloader die PLL aktiviert wird? Oder hast Du die ConfigBits manuell 
vor dem Brennen des Bootloaders gesetzt?

Gruß
daniel+

von Daniel P. (ppowers)


Lesenswert?

Mist... zu spät.

AAAAAAABER:
Im Hauptprogramm (also in dem Programm, welches durch den Bootloader 
gebrannt geflasht wird) musst Du die #use delay - Zeile ebenfalls haben.
Diese Zeile hat ja so direkt nichts mit den Config Bits zu tun sondern 
sagt dem Compiler nur, wie er die Funktion delay_ms zusammenfriemeln 
soll.
Natürlich muss der dort angegebene Wert mit dem tatsächlich anliegenden 
Takt übereinstimmen, sonst passt es nicht.

Ich vermute fast, dass der Compiler - wenn diese Zeile fehlt - einen 
default-Wert annimmt, welcher offensichtlich nicht Deinen 4 MHz 
entspricht.
Aber schreib mal bitte was zu den Config-Bits des Bootloaders. 
Vielleicht liegt es ja doch an der PLL...

von Severino R. (severino)


Lesenswert?

Michael wrote:

> Den MPLAB SIM habe ich nicht, kann also nicht sagen ob es da korrekt
> funktionieren würde.

MPLAB SIM ist Bestandteil von Microchip's MPLAB und steht kostenlos auf 
www.microchip.com zum Download. PCWH sollte sich auch in MPLAB einbinden 
lassen.

Aber in der Zwischenzeit hat Daniel P. ja konkretere Tipps geliefert.

von Michael (Gast)


Lesenswert?

Hallo,
die Config-Bits des Bootloaders sind wie folgt: PLLDIV= 0, USBDIV=1, 
CPUDIV=00, FOSC=1111, IESO=1, FCMEN=1. Also CONFIG1L=0x20 und 
CONFIG1H=0xDF.
Habe jetzt noch die Zeile

#use delay(clock=4000000)

im Hauptprogramm eingefügt, hat aber leider nichts genützt. Im Moment 
kommt sogar überhaupt kein Signal mehr an.
Gruß Michael

von Michael (Gast)


Lesenswert?

Update Sorry für Doppelpost aber weiß nicht wie man editieren kann.

Also es kommt wieder was an. Habe jetzt einen Takt von ziemlich genau 4 
kHz am Ausgang. Habe jetzt den Bootloader entfernt und nur das 
Hauptprogramm in den PIC geladen. Erkenne aber noch keinen Zusammenhang 
zwischen der Ausgangsfrequenz und meinen Einstellungen.
Gruß Michael

von Severino R. (severino)


Lesenswert?

Vielleicht hilft Dir folgender Link weiter, oder ein anderer Artikel auf 
der verlinkten Web-Site:

http://www.fernando-heitor.de/component/option,com_openwiki/Itemid,123/id,tutorials:ccs:kapitel_1/rev,1173018489/

von Daniel P. (ppowers)


Lesenswert?

Schau Dir mal das Blockdiagramm auf Seite 26 im Datasheet an.
Die Takterzeugung der USB-PICs ist deutlich anders als bei den Modellen 
ohne USB. Da muss man schon etwas genauer hinschauen.
Wenn Dein FOSC = 1111 ist, so wird der CPU-Takt - wenn ich das richtig 
interpretiere - aus dem USB-Takt abgeleitet.
Mit CPUDIV = 00 erfolgt also eine Taktteilung um den Faktor 2. Im 
Endeffekt flitzt Dein CPU also mit 48MHz ;-)
Kein Wunder, dass die Blinkfrequenz der LEDs dann nicht stimmt :-P

Wenn Du den Takt nicht aus der USB-PLL ableiten lassen willst mußt Du 
den Oszillator auf XT einstellen.

Viel Erfolg
daniel

von Michael (Gast)


Lesenswert?

Danke für den Link, werde es mir anschaun. Dass die CPU mit 48MHz rennt 
ist absolut erwünscht, die muss nämlich später pro Sekunde 15.000 
A/D-Wandlungen ausführen und die Ergebnisse über USB zum PC übertragen 
:-)
Den Tipp mit der Umstellung probier ich morgen; jetzt ist erstmal 
Feierabend für heute. Danke schonmal allen die mir geholfen haben!
Gruß Michael

von Michael (Gast)


Lesenswert?

Hallo,
also die delay-Funktion funktioniert jetzt wie sie soll. Jetzt würde ich 
aber gerne die CPU nicht nur mit 4 MHz sondern mit 48 MHz laufen lassen. 
Wie kann ich die Register CONFIG1L und CONFIG1H beschreiben?
Gruß Michael

von Daniel P. (ppowers)


Lesenswert?

Na schau doch einfach ins Datenblatt auf Seite 26 bzw. 290

FOSC0:FOSC3 muss 1111 sein (HS oscillator, PLL enabled (HSPLL))
Damit wird der CPU-Takt aus dem USB-Takt erzeugt. Wenn Du dann einen 
CPU-Takt von 48MHz haben willst, setzt Du CPUDIV auf 00 (Taktteilung um 
Faktor 2).

Denk dann aber auch an die Zeile
#use delay(clock=48000000)
...sonst blinken Deine LEDs wieder verkehrt ;-)

Oder wie meintest Du das jetzt mit dem Beschreiben der Register???
CONFIG1L und CONFIG1H sind doch die Configurationswords (siehe S.288) 
und setzen sich aus FOSC0:FOSC3, CPUDIV, USBDIV usw. zusammen. Diese 
werden natürlich beim Brennen beschrieben.

Gruß
daniel

von Michael (Gast)


Lesenswert?

Hallo,
das Problem ist, dass sich die Register CONFIG1L und CONFIG1H nicht so 
einfach beschreiben lassen, sie haben die Adressen 0x300000 bzw. 
0x300001. Wenn ich die gewünschten Werte also an diese Adressen 
schreibe, so kann ich dem .lst-file entnehmen dass der Compiler 
irgendwelche x-beliebigen Register beschreibt, nicht aber die 
gewünschten. Die o.g. Adressen gibt es in Wirklichkeit ja auch garnicht. 
Weiß also nicht, wie ich diese richtig adressiere.
Gruß Michael

von Daniel P. (ppowers)


Lesenswert?

DAS SIND KEINE REGISTER!
Die kannst Du nicht einfach wie eine Variable im RAM setzen und lesen.
Es ist auch höchstgradig riskant die Configurationsbits aus einem 
laufenden Programm heraus zu ändern. Daher werden die bits ja auch beim 
Brennen der Firmware gesetzt.
Alternativ kannst Du die ConfigBits mit einer TableWrite-Operation - 
ähnlich wie beim Beschreiben des Programmspeichers - modifizieren. Davon 
rate ich aber ab.

Gruß
daniel

von Michael (Gast)


Lesenswert?

Ok danke, habe die Einstellungen jetzt beim Brennen vorgenommen und die 
CPU läuft mit 48 MHz. Ich wollte die Einstellungen ja nicht aus dem 
laufenden Programm heraus ändern, sondern nur am Beginn bei der 
Initialisierung. Aber wenn das so kompliziert ist...

von Daniel P. (ppowers)


Lesenswert?

Michael wrote:
> Ich wollte die Einstellungen ja nicht aus dem
> laufenden Programm heraus ändern, sondern nur am Beginn bei der
> Initialisierung. Aber wenn das so kompliziert ist...
Das macht keinen Sinn, da Du den PIC nach dem Ändern der 
ConfigurationsBits erst mindestens resetten müsstest (manche Änderungen, 
besonders an den Oszillatoreinstellungen werden teilweise erst nach 
einer vollständigen PowerDown / PowerUp - Sequenz wirksam).

Ich verstehe auch nicht, was Du Dir davon versprichst!? Der Bootloader 
funktioniert doch mit den gleichen Takteinstellungen, oder nicht?

Wenn Du nach einer Möglichkeit suchst, die interne PLL des PICs im 
Betrieb ein- bzw. auszuschalten, dann solltest Du Dir mal die PICs der 
J-Serie anschauen. Bei denen ist das per Software (und ohne 
nachfolgenden Reset) möglich.

gruß
daniel

von Michael (Gast)


Lesenswert?

Alles klar, dann macht das wohl tatsächlich keinen Sinn so. Habt bitte 
etwas Nachsicht; bin absolut neu auf dem Gebiet :-)

von Daniel P. (ppowers)


Lesenswert?

Kein Problem ;-)
...aber dann direkt an USB wagen... uiuiui... viel Glück ;-)

Gruß
Daniel

P.S.: PICs werden in diesem Forum hier häufig belächelt. Auf 
www.fernando-heitor.de gibt es ein Forum, welches sich ausschließlich 
mit den PICs beschäftigt. Auch der CCS C Compiler ist dort recht 
verbreitet...
Unter Umständen ist die Unterstützung bezüglich der PICs und des CCS 
Compilers dort ergiebiger.

von Michael (Gast)


Lesenswert?

Ok alles klar, danke für die Unterstützung!

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.