Hallo zusammen, ich nutze o.g. PIC mit einem 8MHz-Quarz. Ich habe festgestellt, daß der Takt um ungefähr 25% zu schnell läuft. Beispiel: der 16-Bit-Timer TMR1 sollte nach meiner Prescaler-Einstellung nach 11,4 ms einen Stand von ungefähr 2700 haben. Es sind aber ca. 3380, oder andersrum: mit meinem Testprogramm, welches nach einem TMR1-Stand von 2700 eine LED toggelt, messe ich eine Zeit von 8,3 ms. Bei TMR2 ist es dasselbe: nach Einstellung sollte er nach 800 µs überlaufen, er läuft aber schon nach 600 µs über (auch ein Testprogramm, was LEDs toggelt). Der OSC1-Pin hat aber exakt 8 MHz. Ich habe auch schon den PIC getauscht, keine Änderung. Hat jemand eine Idee für dieses seltsame Verhalten? Tom
Ist der Quarz defekt? Tausche ihn doch mal gegen einen anderen/neuen den du da hast. Hast du die 2x 22pF an den Pins gegen Masse geschlossen? Es könnte so vieles sein, wenn du deine Schaltung und Programm posten würdest hilft das bestimmt das Problem besser einzugrenzen.
Ach ja, ich vergaß zu erwähnen: Quarze habe ich auch drei ausprobiert. Bei allen waren brav 8 MHz am Pin (hatte ich ja bereits geschrieben). TMR1-Init: movlw b'00110001' ; TMR1 an, prescaler 1:8 movwf T1CON Und hier das Test-Unterprogramm für TMR1, das für TMR2 habe ich schon gelöscht, funktioniert aber prinzipiell genauso Sub_TMR1_Test bsf T1CON,TMR1ON bcf INTCON,GIE clrf TMR1L clrf TMR1H looop movf TMR1H,W xorlw b'1010' btfsc STATUS,Z goto CheckTMR1L goto looop CheckTMR1L movf TMR1L,W xorlw b'10001100' ;Wenn TMR1=2700... btfsc STATUS,Z goto toggle goto CheckTMR1L toggle call TMR1Overflow clrf TMR1H clrf TMR1L goto looop TMR1Overflow clrwdt movf TMR1_Hi,1 btfsc STATUS,Z goto TMR1LoHi goto TMR1HiLo TMR1HiLo clrf TMR1_Hi bcf sswled goto $+3 TMR1LoHi incf TMR1_Hi bsf sswled return
Stefan schrieb: > Falsch gerechnet. Glaub ich nicht. Dann hätte ich bei TMR2 ja auch exakt so falsch rechnen müssen > Wie ist Timer1 eingestellt ? siehe neues Posting
Ich hoffe, ich hab mich in der Hitze nicht verrechnet. Der Timer und das Programm sollten richtig sein (ohne Gewähr). Der Timer sollte nach 10.8ms auf 2700 sein und das Programm vergleicht auch auf 2700. Wie misst du diese Zeit? Ist daran evt. etwas falsch? Alternativ ein Programm schreiben, das nach jedem Zyklus einen Pin toggelt. Dann die Frequenz messen. Auszug aus dem Datenblatt: For writes, it is recommended that the user simply stop the timer and write the desired values. A write contention may occur by writing to the timer registers while the register is incrementing. This may produce an unpredictable value in the timer register. Stoppe mal den Timer, bevor du die Register löschst.
Erledigt! Keine Änderung. Die Zeitspanne bei TMR1=2700 ist immernoch 8,3 ms
Der läuft nicht zufällig mit 8MHz internem Clock? OSCCON Register checken.
be stucki schrieb: > Ich hoffe, ich hab mich in der Hitze nicht verrechnet. Der Timer und das > Programm sollten richtig sein (ohne Gewähr). Der Timer sollte nach > 10.8ms auf 2700 sein und das Programm vergleicht auch auf 2700. > Wie misst du diese Zeit? Ist daran evt. etwas falsch? Alternativ ein Mit dem Oszi. Ich glaube nicht, daß ich da etwas falsch mache. Ich fast jedem Labor meines Studiums war ein Oszi dabei, daher meine ich, das Ding zu beherrschen. > > Stoppe mal den Timer, bevor du die Register löschst. Erledigt. Keine Änderung.
Und hier mal die Reihenfolge umdrehen toggle call TMR1Overflow clrf TMR1H clrf TMR1L goto looop toggle call TMR1Overflow clrf TMR1L clrf TMR1H goto looop
holger schrieb: > Der läuft nicht zufällig mit 8MHz internem Clock? > > OSCCON Register checken. __CONFIG _CONFIG1, _HS_OSC & _WDT_ON & _LVP_OFF & _MCLR_ON & _CCP1_RB3 & _CP_OFF & _DEBUG_OFF & _CPD_OFF & _WRT_PROTECT_OFF _HS_OSC bedeutet Quarz, und OSCCON ist 0, jedenfalls im MPLAB
holger schrieb: > Und hier mal die Reihenfolge umdrehen > > toggle > call TMR1Overflow > clrf TMR1H > clrf TMR1L > goto looop > > > toggle > call TMR1Overflow > clrf TMR1L > clrf TMR1H > goto looop Keine Änderung
> Und hier das Test-Unterprogramm für TMR1, das für TMR2 habe ich schon > gelöscht, funktioniert aber prinzipiell genaus Mach doch das mal einfacher und toggle einen Pin (an PORTB ist alles auf Ausgang)
1 | loop |
2 | |
3 | bsf PORTB, 0 |
4 | nop |
5 | nop |
6 | nop |
7 | bcf PORTB, 0 |
8 | nop |
9 | goto loop |
braucht genau 4x8 FOSC-Takte (jeder Befehl braucht ja 4 FOSC-Takte), also bei einem Quarz von 8 MHz müssten 250 kHz an RA0 anliegen
> braucht genau 4x8 FOSC-Takte (jeder Befehl braucht ja 4 FOSC-Takte), > also bei einem Quarz von 8 MHz müssten 250 kHz an RA0 anliegen Ok, ich messe 1,6 µs für jede Hi/Lo-Phase. Passt das?
>Ok, ich messe 1,6 µs für jede Hi/Lo-Phase. Passt das?
Nö, es müssten 2us sein.
holger schrieb: >>Ok, ich messe 1,6 µs für jede Hi/Lo-Phase. Passt das? > > Nö, es müssten 2us sein. Und da sind sie wieder, die 25% Bit 1 und 0 von OSCCON sind 0, heißt, der Taktgeber wird vom Configuration word definiert, richtig? Also Quarz, und der hat 8 MHz Ich habe jetzt im Programm OSCCON komplett nochmal explizit auf 0 gesetzt, aber es sind immernoch 1,6µs
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.