Forum: Mikrocontroller und Digitale Elektronik Systemtakt läuft zu schnell PIC16F88


von Thomas M. (xt-fahrer)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

Falsch gerechnet.
Wie ist Timer1 eingestellt ?

von Mike J. (emjey)


Lesenswert?

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.

von Thomas M. (xt-fahrer)


Lesenswert?

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

von Thomas M. (xt-fahrer)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

Setz mal Bit 2 und 3 vom Timer.

von B. S. (bestucki)


Lesenswert?

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.

von Thomas M. (xt-fahrer)


Lesenswert?

Erledigt!
Keine Änderung. Die Zeitspanne bei TMR1=2700 ist immernoch 8,3 ms

von holger (Gast)


Lesenswert?

Der läuft nicht zufällig mit 8MHz internem Clock?

OSCCON Register checken.

von Thomas M. (xt-fahrer)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

Und hier mal die Reihenfolge umdrehen

toggle
  call TMR1Overflow
  clrf TMR1H
  clrf TMR1L
  goto looop


toggle
  call TMR1Overflow
  clrf TMR1L
  clrf TMR1H
  goto looop

von Thomas M. (xt-fahrer)


Lesenswert?

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

von Thomas M. (xt-fahrer)


Lesenswert?

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

von tt2t (Gast)


Lesenswert?

> 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

von Thomas M. (xt-fahrer)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>Ok, ich messe 1,6 µs für jede Hi/Lo-Phase. Passt das?

Nö, es müssten 2us sein.

von Thomas M. (xt-fahrer)


Lesenswert?

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
Noch kein Account? Hier anmelden.