Discussione: Aiuto pic16f84
Visualizza messaggio singolo
Vecchio 09 novembre 05, 19:29   #7 (permalink)  Top
MSchiepp
User
 
L'avatar di MSchiepp
 
Data registr.: 21-01-2004
Residenza: Milano
Messaggi: 989
Segui il consiglio di RIVP6 e passa al 628: il vantaggio è che così hai a disposizione un contatore a 16 bit e rilevare la lunghezza dell'impulso diventa molto facile; in alternativa al codice che vedi qui, puoi usare il 16F84 con il timer0; devi però usare i seguenti accorgimenti:
1) azzerare il timer0 quando rilevi il fromte di salita (invece di dare lo start, dato che il timer0 non si può fermare ed avviare)
2) monitorare anche il flag di overflow e, quando lo trovi ad uno, incrementare la parte alta di un contatore a 16 bit di 1 quindi azzerare il flag di overflow
3) leggere il valore del timer0 ed il elativo flag di overflow quando rilevi il fronte negativo (fine impulso).
La stessa logica può essere utilizzata gestendo il punto 2 sotto interrupt.

Se invece usi il 628 diventa tutto molto più semplice...


;************************************************* ******************
; Descrizione bit PortA
;************************************************* ******************
;
#DEFINE Inp PORTA,0 ; input

#DEFINE Page_1 STATUS,RP0 ; Page 1 bank switch

;************************************************* ******************
; Start of code
;************************************************* ******************
;
ORG 0
goto Init


;************************************************* ******************
; Program init
;************************************************* ******************
;
Init movlw 0xFF ; xxOI IOOO Data dir
bsf Page_1 ; Set page 1
movwf TRISA ; I/O Port
movlw 0xC2 ; 1000 0010
movwf OPTION_REG ; Presc TMR0/4
bcf Page_1 ; Set page 0
clrf PORTA ; Clear output
movlw 0x07
movwf CMCON

;************************************************* ******************
; Main program start
;************************************************* ******************
;
Start movlw 0x00
movwf TMR1L
movwf TMR1H ; Azzera timer 1
bcf T1CON,0 ; Stop Timer1
CountLoop btfsc Inp
goto $-1 ; Attende linea bassa
btfss Inp
goto $-1 ; Inizio impulso
bsf T1CON,0 ; Start Timer1
btfsc Inp ; Fine impulso
goto $-1
bcf T1CON,0 ; Stop Timer1

END


Michele
__________________
__________________________________________________
The worst day flying is better than the best day working.
MSchiepp non è collegato   Rispondi citando