🇩🇪
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