Forum: Mikrocontroller und Digitale Elektronik PIC18F4550 läuft zu langsam


von Alexander U. (alexander_u)


Lesenswert?

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
void main(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

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

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

von Alexander U. (alexander_u)


Lesenswert?

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

von Michael L. (michaelx)


Lesenswert?

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?

von PIC N. (eigo) Benutzerseite


Lesenswert?

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:
1
delay_ms(1000);
Es mit mehreren Aufrufen so:
1
uint8_t k = 0;
2
3
for(k=0; k<10; k++)
4
{
5
   delay_ms(100);
6
}

von Alexander U. (alexander_u)


Lesenswert?

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

von holger (Gast)


Lesenswert?

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

von Stefan R. (kroko)


Lesenswert?

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.

von Alexander U. (alexander_u)


Lesenswert?

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

von Stefan R. (kroko)


Lesenswert?

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.

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.