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