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
Hi,
> Leider zeigt mein Oszi kein Rechtecksignal.
Schade das Du nicht beschrieben hast was Du auf dem Oszi siehst!
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!)
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...
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
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.
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?
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.