Systemtakt läuft zu schnell PIC16F88

OP #2804311
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
#2804321
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.
OP #2804350
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
#2804435
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.
OP #2804483
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.
Gast #2804509
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
OP #2804536
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren