Forum: Mikrocontroller und Digitale Elektronik [PIC 16F88] Testprogramm für Timer


von Thomas M. (xt-fahrer)


Lesenswert?

Hallo zusammen,

ich möchte mit einem Testprogramm und Oszi herausfinden, ob meine 
Timerwerte stimmen. Zur Funktionsweise: jedesmal, wenn TMR1 (16 bit) 
oder TMR2 (8 bit mit Postscaler) überläuft, toggle ich ein 
Speicherzellenwert und setze oder lösche einen Port, den ich dann mit 
dem Oszi erfasse. So müßte ein Rechteck herauskommen mit einer 
Periodendauer, die der Dauer von einem Überlauf zum nächsten entspricht. 
Bei TMR1 sind das etwa 0,26 s und bei TMR2 800µs - wenn meine Werte 
stimmen (siehe Formeln).
Leider zeigt mein Oszi kein Rechtecksignal.
Vielleicht könnt ihr einen Blick auf dieses kurze Prog werfen und mir 
einen Hinweis geben?


        Title  "16F88 Test"

    ERRORLEVEL -302

         LIST   P=PIC16F88
     include "P16F88.INC"
     __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _LVP_OFF & _MCLR_ON & 
_CCP1_RB3 & _CP_OFF & _DEBUG_OFF & _CPD_OFF & _WRT_PROTECT_OFF

#DEFINE tmr1  PORTB,1    ; [pin7]= TMR1-LED
#DEFINE tmr2  PORTB,6     ; [pin12]= TMR2-led
;======================================================================= 
===
;
;       RAM Definition
;
;======================================================================= 
===
;
    cblock 20h
    TMR1_Hi
    TMR2_Hi
    endc
;======================================================================= 
===
;
;       Hauptprogramm
;
;======================================================================= 
===


    org 0        ; Start Adresse 0
Start   clrf PORTA
    clrf PORTB
    clrf TMR1L
    clrf TMR1H

    bsf    STATUS,RP0
        movlw  0
        movwf  TRISA
        movlw  0
        movwf  TRISB
    ;
        movlw b'11000001'  ; keine Pull-ups,Rising edge INT0,interner 
Timer,1:4 prescaler
        movwf OPTION_REG


    movlw .200      ;         fosz x gewünschte Zeit in s
    movwf PR2      ; PR2 = --------------------------------------
              ;             4 x TMR2-Prescaler x TMR2-Postscaler

    bcf  STATUS,RP0      ; zurück zu Bank 0
    ;
    movlw b'00001001'  ; TMR2 aus, prescaler 1:4, postscaler 1:2
    movwf T2CON      ;
         ;             4 x PR2 x TMR2-Prescaler x TMR2-Postscaler
         ; TMR2-Zeit = -------------------------------------------[s]
         ;                               fosz
              ;
    movlw b'00110000'  ; TMR1 aus, prescaler 1:8, Sync an
    movwf T1CON      ;
              ;             4 x prescaler x TMR1-Wert
              ; TMR1-Zeit = ------------------------- [s]
                  ;                       fosz[MHz]
    movlw 0x20
    movwf FSR
    clrf INDF
    incf FSR,F
    btfss FSR,6      ; Lösche Speicherzellen von 0x20 bis 63
    goto $-3
    ;
    bsf T1CON,TMR1ON
    bsf T2CON,TMR2ON
Mainloop
    movf TMR1_Hi,1    ; TMR1_Hi wird in sich selbst kopiert um das 
Zeroflag zu testen
    btfss STATUS,Z
    bsf tmr1

    movf TMR1_Hi,1
    btfsc STATUS,Z
    bcf tmr1

    movf TMR2_Hi,1
    btfss STATUS,Z
    bsf tmr2

    movf TMR2_Hi,1
    btfsc STATUS,Z
    bcf tmr2

    btfsc T1CON,TMR1IF
    call TMR1Overflow

    btfsc T2CON,TMR2IF
    call TMR2Overflow

    goto Mainloop

TMR1Overflow
    movf TMR1_Hi,1
    btfsc STATUS,Z
    goto TMR1LoHi
    goto TMR1HiLo

  TMR1HiLo
    clrf TMR1_Hi
    goto $+2
  TMR1LoHi
    incf TMR1_Hi
    bcf T1CON,TMR1IF
    return

TMR2Overflow
    movf TMR2_Hi,1
    btfsc STATUS,Z
    goto TMR2LoHi
    goto TMR2HiLo

  TMR2HiLo
    clrf TMR2_Hi
    goto $+2
  TMR2LoHi
    incf TMR2_Hi
    bcf T2CON,TMR2IF
    return

end

von M. J. (manfred-64)


Lesenswert?

Hi,

> Leider zeigt mein Oszi kein Rechtecksignal.
Schade das Du nicht beschrieben hast was Du auf dem Oszi siehst!

von Andy (Gast)


Lesenswert?

Vielleicht hilft Dir auch diese Seite weiter...

http://pictimer.picbingo.com/

von Chris B. (dekatz)


Lesenswert?

Wenn ich mich recht erinnere liegt auf PORTB,6 ein ANALOG-Eingang.
Ohne Umschalten auf DIGITAL wird dort nix zu sehen sein (ANSEL-Register, 
Datenblatt lesen!)

von Andy (Gast)


Lesenswert?

Hier auch noch ein Link zu diesem Thema:

http://www.gooligum.com.au/tutorials/baseline/PIC_Base_A_5.pdf

Schau Dir doch auch einmal einen C-Compiler an. Zum Beispiel der CCS.
Ist da alles viel einfacher und in 3-4 Zeilen erledigt...

von Thomas M. (xt-fahrer)


Lesenswert?

Manfred John schrieb:
> Hi,
>
>> Leider zeigt mein Oszi kein Rechtecksignal.
> Schade das Du nicht beschrieben hast was Du auf dem Oszi siehst!

Ja, richtig :-)
Ich sehe eine 5V-Linie

von Thomas M. (xt-fahrer)


Lesenswert?

Chris B. schrieb:
> Wenn ich mich recht erinnere liegt auf PORTB,6 ein ANALOG-Eingang.
> Ohne Umschalten auf DIGITAL wird dort nix zu sehen sein (ANSEL-Register,
> Datenblatt lesen!)

clrf ANSEL ist eingefügt, leider ändert sich nichts.

von Thomas M. (xt-fahrer)


Lesenswert?

Andy schrieb:
> Vielleicht hilft Dir auch diese Seite weiter...
>
> http://pictimer.picbingo.com/

Sehr gut,danke!
Ich denke, der Fehler liegt im falschen Parameter. Das Prog hier ist ja 
nur ein Testbau. In meinem eigentlichen Programm soll TMR1 nach 11,4 ms 
ein Zählerstand von etwa 2800 haben bei 8MHz Quarzfrequenz. Im 
MPLAB-Debugger läuft das auch alles mit dem 1:8 Prescaler, aber wenn ich 
mir die Ergebnisse des Rechenprogramms anschaue...
Helft mir mal auf die Sprünge: ich habe 8Mhz auf dem Quarz, ein 
instruction cycle ist fosz/4, prescaler 1:8
Mit dieser Formel
             4  prescaler  TMR1-Wert
 TMR1-Zeit = -------------------------
                       fosz

stimmt die Rechnung, und MPLAB Debugger sagt das auch
Liege ich richtig?

von John B. (johnbauer)


Lesenswert?

Thomas M. schrieb:
> #DEFINE tmr1  PORTB,1    ; [pin7]= TMR1-LED
> #DEFINE tmr2  PORTB,6     ; [pin12]= TMR2-led
TMR2 ist in der Include-Datei für Timer2 definiert. Wenn hier LEDs 
angeschlossen wäre es vielleicht sinnvoller die Variablen LED1 und LED2 
zu nennen.


>     cblock 20h
Ist Hex-Schreibweise ist bei Microchip nicht 0x20?

>     btfsc T1CON,TMR1IF
>
>     btfsc T2CON,TMR2IF
Die Interrupt Flags TMR1IF und TMR2IF befinden sich im Register PIR1.

Gruß
John

von Thomas M. (xt-fahrer)


Lesenswert?

John Bauer schrieb:
> Thomas M. schrieb:
>> #DEFINE tmr1  PORTB,1    ; [pin7]= TMR1-LED
>> #DEFINE tmr2  PORTB,6     ; [pin12]= TMR2-led
> TMR2 ist in der Include-Datei für Timer2 definiert. Wenn hier LEDs
> angeschlossen wäre es vielleicht sinnvoller die Variablen LED1 und LED2
> zu nennen.

Deswegen hab ich es ja auch klein geschrieben

>
>
>>     cblock 20h
> Ist Hex-Schreibweise ist bei Microchip nicht 0x20?

So gehts aber auch

>
>>     btfsc T1CON,TMR1IF
>>
>>     btfsc T2CON,TMR2IF
> Die Interrupt Flags TMR1IF und TMR2IF befinden sich im Register PIR1.

DANKE!!!
Ich Idiot, klar doch! Aber der Assembler hat es ohne Fehlermeldung 
übersetzt...
Testprogramm läuft jetzt, und ich bekomme das Rechteck.
Irgendwas scheint der Debugger falsch zu debuggen. Ich messe folgende 
Pulsdauer: (Quelle ist der interne Takt fosz/4, also 8Mhz/4=2Mhz)
bei Prescaler 1:1 25 ms
bei Prescaler 1:8 200 ms, und die Prescalerwerte dazwischen stimmen 
auch.
Das ist die Dauer eines Hi- bzw. Low-Impulses, also 65536 TMR1-Schritte.

Wie ich schon schrieb, muß ich für eine Dauer von 11,4 ms auf einen 
ungefähren TMR1-Stand von 2800 kommen. Meßtechnisch tue ich das nur mit 
Prescaler 1:1, im MPLAB Debugger mit 1:8.

Wo liegt mein Denkfehler?

Gruß
Tom

von Thomas M. (xt-fahrer)


Lesenswert?

Ich habe (m)einen Denkfehler gefunden: es müßten eigentlich 262 ms bei 
1:8 und fosz/4 als Takt sein, aber warum messe ich 200 ms bzw. 25ms bei 
1:1?
Die 2800 bei 25ms können natürlich nicht sein :-(((

Gruß
Tom

von M. J. (manfred-64)


Lesenswert?

Moin,

schau doch mal wie schnell der Internetakt wirklich läuft.
Im sinne von:
incf PORTx
goto $-1

Oder über Hardware Funktion, wenn das bei dem Pic möglich ist.
Sieh dir auch mal die Errata an.

Gruß
Manfred

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.