Hallo Leute,
Ich bräuchte mal eure Hilfe.
Wollte seit Herbst wieder ein kleines Projekt starten und hab MPLAB
v8.63 und CCS 4.140 wieder installiert (neuer PC).
Mit einem kleinen LED-Blinkprogramm habe ich das Setup getestet (hab ich
öfters so gemacht). Das Problem ist nun, dass der µC nun genau 4mal so
langsam läuft als wie er soll!
Hier das Programm:
Hier soll er jede Sekunde die LED an e0 togglen. Effektiv macht er es
alle 4 Sekunden.
1
#include"C:/Programme/PICC/Devices/18F4550.h"
2
#use delay(clock=8000000)
3
#fuses INTRC,NOWDT,NOPROTECT,NOPUT,NOIESO,NOFCMEN
4
5
voidmain(void)
6
{
7
setup_oscillator(OSC_8MHZ);
8
delay_ms(1);
9
10
while(TRUE)
11
{
12
output_high(pin_e0);
13
delay_ms(1000);
14
output_low(pin_e0);
15
delay_ms(1000);
16
}
17
}
Folgendes habe ich schon probiert:
Sowohl mit Quarz, als auch mit internen Oszillator das gleiche Problem
anderes Demoboard
neuer, ungebrauchter PIC
anderer PC mit bereits vorhandener Installation
nicht mit delay, sondern mit Timerüberläufe die LED togglen
nicht debuggen(PICkit 2), sondern programmieren und nur mit Netzteil
betreiben
Bin jetzt echt schon am verzweifeln. Ich weiss nicht mehr weiter.
Vielleicht hat ja einer eine Idee wo der Fehler liegt.
schon mal danke,
mfg alex
>Hier soll er jede Sekunde die LED an e0 togglen. Effektiv macht er es>alle 4 Sekunden.
Dann hast du wohl vergessen das der PIC intern mit F_OSC/4 läuft.
Hallo Holger
Bei delay_ms ist dieser Fakt aber unerheblich. Wenn ich bei #use
delay(clock=######) die richtige Taktfrequenz eingebe, muss
delay_ms(1000) auch ein delay von 1s geben, und das hat es bis her auch
immer gemacht. Wie gesagt, bisher
Hab ja auch mit Timerüberläufe die LED getoggled:
8Mhz --> 1 Takt ergibt 0,125µs Periodendauer
--> *4 ergibt 0,5µs Zykluszeit
--> *8 (hatte einen Vorteiler drinn) ergibt 4µs Timerschritt
--> *62500 (hab bei jedem Interrupt den 16Bit Timer auf 3035 gesetzt)
ergibt 250ms ISR Takt
Im Endeffekt ist er aber genau jede Sekunde (also 4mal 250ms) in die ISR
gesprungen
mfg alex
Alexander U. schrieb:> Hallo Leute,>> Ich bräuchte mal eure Hilfe.> Wollte seit Herbst wieder ein kleines Projekt starten und hab MPLAB> v8.63 und CCS 4.140 wieder installiert (neuer PC).> Mit einem kleinen LED-Blinkprogramm habe ich das Setup getestet (hab ich> öfters so gemacht). Das Problem ist nun, dass der µC nun genau 4mal so> langsam läuft als wie er soll!>> Hier das Programm:> Hier soll er jede Sekunde die LED an e0 togglen. Effektiv macht er es> alle 4 Sekunden.
Der Code scheint ok zu sein, eigentlich sollte die LED mit 0,5 Hz
blinken.
Watchdog ist auch abgeschaltet.
Zum CCS kann ich leider nichts sagen. Aber
1
#use delay(clock=8000000)
sollte eigentlich die Taktfrequenz des Oszillators sein. Zumindest
würde ich das auch so lesen.
Frag doch mal auf der CSS-Webseite im Forum.
Hättest du ggf. die Möglichkeit, es mit einem anderen C-Compiler zu
probieren?
Es mag banal klingen, aber kann es sein, dass es beim Übergabewert von
1000 zu Problemen in der delay Funktion kommt, wenn der Takt eine zu
hohe Geschwindigkeit hat?
Versuch mal statt der einen:
Michael L. schrieb:> Hättest du ggf. die Möglichkeit, es mit einem anderen C-Compiler zu> probieren?
Hallo Michael,
Das ist eine gute Idee. Ich probier mal den C18 Compiler aus.
mfg alex
>#use delay(clock=8000000)>> sollte eigentlich die Taktfrequenz des Oszillators sein. Zumindest
Sicher? Man kann da ja auch noch ne PLL aktivieren und solche Sachen.
Dann ist die interne Taktfrequenz nicht 8MHz so wie es auf dem
Quarz steht.
Wenn du eh ein PICkit hast, teste noch mal mit der internen Taktquelle
und kontrolliere die SFRs des PICs, welche für die Takteinstellungen
zuständig sind.
Wenn ich mich richtig erinnere hatte ich auch mal Probleme damit.
Da dieser PIC, wegen seinen USB, eine ziemlich komplexe
Oscillatorkonfiguration gegenüber zu den anderen PIC18 hat.
So, hab jetzt, statt den C18, doch mal eine etwas ältere Version von CCS
installiert. Damit scheint wieder alles normal zu funktionieren d.h.
obiger Code toggelt die LED mit 1s.
Vorher habe ich noch, wie von Stefan vorgeschlagen, das SFR angeschaut.
Im OSCCON Register waren für die jeweilige Taktfrequenz die passenden
Bits gesetzt.
Mit meinem Oszi habe ich dann auch noch den Pin OSC2 beobachtet, welcher
ja den Arbeitstakt des PIC ausgibt. Bei 8MHz konfigurierten Takt müssten
es ja 2Mhz sein, gemessen habe ich aber 0,5MHz.
Dann habe ich den internen 32KHz Oszillator aktiviert. Normalerweise
hätten an OSC2 jetzt 8KHz anliegen müssen. Gemessen habe ich 2KHz. Somit
ist der PIC hier scheinbar mit nur 8KHz Oszillatorfrequenz gefahren!
Sowas lässt sich ja normalerweise ja gar nicht konfigurieren oder?
Zumindest nicht mit dem internen Taktoszillator.
DANKE an alle!
mfg alex
Hattest du währenddessen auch einen Quarz am µC?
Hab deinen Code mit dem Simulator getestet (CCS 5.015) und er hat die
zwei SCS Bits im OSCCON Register nicht auf den internen Oscillator
gesetzt (war 00).
Mit
setup_oscillator( OSC_8MHZ|OSC_INTRC );
setzt er SCS auf 10.
Also hätte er ohne externer Quarz/Taktquelle nicht laufen sollen/können.
Eine eigene Frage?
Dieser Thread ist über 12 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.