🇩🇪
Zitat von: picass in 30.06.2024, 10:42:35 CESTDie Länge der 2 Haupt-Impulse stellt die Größe der Temp oder der Pegelhöhe dar. Siehe Bild.Dein Lieblingspic 18F14K22 hat zwar kein Timer1 Gate-Modul, dafür aber Capture, das wohl auch für diesen Zweck eingesetzt werden kann. Auch hier kann der TIMER1-Count zwischen zwei Flanken erfasst werden.
Das wäre eine Anwendung für Komparatoren und Timer.
Grüße, picass
main:
CALL TM1G_Pulse_HIGH ;22382wc (22.382ms) TMR1G-Routinen
CALL TM1G_Pulse_LOW
CALL TM1G_Periode
CALL TM1G_Frequenz
CALL TM1G_DutyCycle
;
btfss KeyPress,KEY1 ;wurde Taste gedrückt?
CALL HoldCurrentState ;Ja Programm anhalten
GOTO main
TM1G_Pulse_HIGH: ;Debug 1739ms=0x06CB
movlw b'00000000' ;clock fosc/4, Presc.1:1,TMR1 OFF
movwf T1CON
movlw b'11010000' ;TMR1G enabled,activ HIGH,sgl.puls mode,
movwf T1GCON ;TMR1 Gate source TMR1 input pin RB0
CALL TMR1_Gate
TM1G_Periode: ;Debug 8251us=0x203B
movlw b'00000000' ;clock fosc/4, Presc.1:1,TMR1 OFF
movwf T1CON
;
movlw b'10110000' ;enabled,activ LOW,sgl.puls mode,
movwf T1GCON ;TMR1 Gate source TMR1 input pin RB0
CALL TMR1_Gate
TMR1_Gate:
clrf TMR1H ;vlear TIMER 1
clrf TMR1L
bsf T1CON,TMR1ON ;b0=1 Start TMR1
bsf T1GCON,T1GGO ;b3=1 Gate startbereit wartet auf Flanke
btfsc T1GCON,T1GGO ;Gate geschlossen? T1GGO=0?
GOTO $-1
copy TMR1H,tmpTMR1H ;TMR1:H in Arbeitsvariable kopieren
copy TMR1L,tmpTMR1L
RETURN
BANKSEL TRISA ;bank1
clrf TRISA
bcf TRISA,RA4 ;(03) Comparator2 C2OUT
bsf TRISA,RA3 ;(02) " C2IN-
bsf TRISA,RA2 ;(03) " C2IN+
BANKSEL ANSELA ;bank3
clrf ANSELA ;RB7:0 digital IO
bsf ANSELA,RA3 ;(02) Comp.2 analog C2IN-
bsf ANSELA,RA2 ;(03) " " " C2IN+
;--Komparator C2
BANKSEL CM2CON0 ;bank2 S.162ff, 170
movlw b'10100000' ;vgl. MACROS.INC
movwf CM2CON0
bsf CM2CON0,C2HYS ;Hysterese 65mV
;
movlw b'00000011' ;11 = C2VN connects to C12IN3- pin RA3
movwf CM2CON1
C1 2,2uF 680nF 100nF 22nF 1nF Cx*
fmin (Hz)ca. 15 34 377 675 15800 ?
fmax (Hz)ca. 18 60 418 1180 27700 460kHz
Cx* C1 ist die parasitäre Kapazität zwischen benachbarten
Steckbrettkontakten.
main:
bsf INTCON,GIE ;interrupt EIN
movlw b'00000000' ;b7-6=00/01 Tmr1 clock 1/4MHz DS.185
movwf T1CON ;b0=0 STOP
;
movlw LINE2+.17 ;Ausgabeadress ins DDRAM
CALL OutDDRAM_Addr
movlw "1" ;1 MHz
CALL OutLcd_Data ;TMR1 input Frequenz ausgeben
main_loop:
CALL Key_Fosc ;Tastenabfrage,Ausgabe fosc 1 oder 4 MHz
; ;T1CON,TMR1CS1:0 einstellen.
movlw b'11010000' ;b4=0 single pulse, Gate aktiv HIGH
movwf T1GCON ;b5=0 Toglemode disabled für single pulse
CALL TMR1_Gate
copy tmpTMR1H,H_Puls1 ;verwendet für Duty Cycle
copy tmpTMR1L,H_Puls0
movlw LINE1+.7 ;Ausgabe im LCD
movwf T1G_Addr
CALL Out_TMR1GM ;fos->fosc/4D zu Dezima, LCD-Ausgabe
;
movlw .10 ;1s waren bis zur nächsten Messung
CALL Delay100ms
goto main_loop:
movlw b'10110000' ;b5=0 single pulse
bsf T1GCON,TMR1GE ;Timer Gate Funktion einschalten
bcf T1GCON,T1GPOL ;Gate High-Low Aktive
bcf T1GCON,T1GTM ;Toggle mode aus
bsf T1GCON,T1GSPM ;Single Pule mode ein
bcf T1GCON,T1GGO ;fertig meldung ablöschen
bcf T1GCON,T1GVAL ;Status ablöschen
bsf T1GCON,T1GSS0 ;siehe auch T1CON
bsf T1GCON,T1GSS1 ;Timer1 Gate Source is (SYNCC2OUT