Funziona.
Chiaramente bisogna utilizzare una variabile a 16 bit per totalizzare la somma.
Moderatore:
Paolino


bè tornando a noi.. così facendo ( con il sensore all'ingresso) la visualizzazione non è stabile, mentre con il partitore l'uscita binaria era stabile...
ed invece ho dei banali BPW34 per la luminosità e un lm35 per la temperatura..devo trovare il sistema per non avere una sovrapporizione delle letture... dici che devo mettere un ritardo davidde?
COUNT_1 EQU 20H ; REGISTRO Ton DEL PWM
COUNT_2 EQU 21H ; REGISTRO Toff DEL PWM
COUNT_3 EQU 22H ; REGISTRO DI RITARDO
COUNT_TIME EQU 23H ; REGISTRO DURATA SEGNALE
ADCON0 EQU 1FH
ADCON1 EQU 9FH
ADRESH EQU 1EH
C1 EQU 2DH ;INDIRIZZO REGISTRO PRIMO CONTATORESTART_ADC
BCF 03H,07H
BSF 03H,05H
MOVLW 0EH
MOVWF ADCON1
BCF 03H,07H
BCF 03H,05H
MOVLW 81H ;IN W CODICE FOSC/32, CANALE, A\D ON
MOVWF ADCON0 ;SPOSTA IL CODICE IN ADCON0 BANCO 0
CALL DELAY ;CHAMA LA ROUTINE DI RITARDOSTART_ADC BCF STATUS,7
BSF STATUS,5
MOVLW B'00001110'
MOVWF ADCON1
BCF STATUS,7
BCF STATUS,5
MOVLW B'10000001' ;IN W CODICE FOSC/32, CANALE, A\D ON
MOVWF ADCON0 ;SPOSTA IL CODICE IN ADCON0 BANCO 0
CALL DELAY ;CHAMA LA ROUTINE DI RITARDONUOVA BSF ADCON0,2 ;PONE AD UNO BIT 2 DI ADCON0 E AVVIA CONV.
LOOP BTFSC ADCON0,2 ;TEST BIT2 DI ADCON, SE 0 SALTA ISTRUZIONE SUCCESSIVA
GOTO LOOP ;SE BIT2 è 1 ESEGUI NUOVO CONTROLLO
MOVF ADRESH,0 ;CARCA IN W PARTE DEL RISULTATO
MOVWF 07NUOVA BSF ADCON0,2 ;PONE AD UNO BIT 2 DI ADCON0 E AVVIA CONV.
BTFSC ADCON0,2 ;TEST BIT2 DI ADCON, SE 0 SALTA ISTRUZIONE SUCCESSIVA
GOTO $-1 ;SE BIT2 è 1 ESEGUI NUOVO CONTROLLO
MOVF ADRESH,0 ;CARCA IN W PARTE DEL RISULTATO
MOVWF 07 ;USCITA SU PORTC.VISUALIZZA DATO CONVERTITOgiozambi ha scritto:il ritardo se lo metto però va ad influenzarmi anche il controllo PWM..che testerà i pulsanti solo dopo il ritardo..
davidde ha scritto: faccia soltanto l' aggiornamento della PORTC
giozambi ha scritto:però non ho capito perché dici che non è semplice interfacciare quei sensori.. perché alla fine saranno quelli che andranno a fornire il dato da convertire... io credevo che con un circuito di condizionamento mediante opamp si risolvesse tutto ed avrei avuto in uscita una tensione da 0 a 5V..trasformata poi in digitale.
davidde ha scritto:quindi lui continua come è adesso però il dato lo pone in uscita solo (per esempio) ogni mezzo secondo?
BANKSEL TRISB ; CONFIGURA RB3,RB4,RB5 COME IN. GLI ALTRI COME USCITE
MOVLW B'00111001'
MOVWF TRISB
BANKSEL PORTB ; CONFIGURA LE OUT DELLA PORTB A LIVELLO LOGICO BASSO
MOVLW B'00000000'
MOVWF PORTB NUOVA: BSF ADCON0,2 ;PONE AD UNO BIT 2 DI ADCON0 E AVVIA CONV.
BTFSC ADCON0,2 ;TEST BIT2 DI ADCON, SE 0 SALTA ISTR. SUCC.
GOTO $-1 ;SE BIT2 è 1 ESEGUI NUOVO CONTROLLO
BTFSS PORTB,0
GOTO VISVIS: MOVF ADRESH,0 ;CARICA IN W PARTE DEL RISULTATO
MOVWF 07 ;USCITA SU PORTC.VISUALIZZA DATO CONVERTITO
MOVLW D'255'
VIS_DELAY MOVWF C2
DECFSZ C2
GOTO $-2
CLRF PORTC
RETURN
; FUNZIONE: 3 pulsanti comandano 3 posizioni definite di un servocomando
; E CONVERTE UNA TENSIONE ANALOGICA 0-5V IN DATO DIGITALE A 8 BIT SU PORTC,
; ALLINEAMENTO A SINISTRA, CONVERTE IN CONTINUAZIONE.
; ZAMBON GIOSUE 27/02/2011
#include P16F876A.INC
__CONFIG 3F72H
COUNT_1 EQU 20H ; REGISTRO Ton DEL PWM
COUNT_2 EQU 21H ; REGISTRO Toff DEL PWM
COUNT_3 EQU 22H ; REGISTRO DI RITARDO
COUNT_TIME EQU 23H ; REGISTRO DURATA SEGNALE
C2 EQU 24H
C1 EQU 25H ;INDIRIZZO REGISTRO PRIMO CONTATORE
BANKSEL TRISA ; CONFIGURA RA0 COME INGRESSO GLI ALTRI COME USCITE
MOVLW B'00000001'
MOVWF TRISA
BANKSEL PORTA ; CONFIGURA LE USCITE DELLA PORTA A LIVELLO LOGICO BASSO
MOVLW B'00000000'
MOVWF PORTA
BANKSEL TRISB ; CONFIGURA RB0,RB3,RB4,RB5 COME INGRESSI GLI ALTRI COME USCITE
MOVLW B'00111001'
MOVWF TRISB
BANKSEL PORTB ; CONFIGURA LE USCITE DELLA PORTB A LIVELLO LOGICO BASSO
MOVLW B'00000000'
MOVWF PORTB
BANKSEL OPTION_REG ; RESISTENZE DI PULL-UP INTERNE SU RB0,RB3,RB4 E RB5
BCF OPTION_REG,7
BANKSEL TRISC ; CONFIGURA TRISC COME TUTTE USCITE
MOVLW B'00000000'
MOVWF TRISC
BANKSEL PORTC ; CONFIGURA LE USCITE DELLA PORTC A LIVELLO LOGICO BASSO
MOVLW B'00000000'
MOVWF PORTC
ORG 40H
MOVLW D'30' ; PRECARICA IL CONTATORE COUNT_TIME
MOVWF COUNT_TIME
START_ADC:
BCF STATUS,7
BSF STATUS,5
MOVLW B'00001110'
MOVWF ADCON1
BCF STATUS,7
BCF STATUS,5
MOVLW B'10000001' ;IN W CODICE FOSC/32, CANALE, A\D ON
MOVWF ADCON0 ;SPOSTA IL CODICE IN ADCON0 BANCO 0
CALL DELAY ;CHAMA LA ROUTINE DI RITARDO
NUOVA: BSF ADCON0,2 ;PONE AD UNO BIT 2 DI ADCON0 E AVVIA CONV.
BTFSC ADCON0,2 ;TEST BIT2 DI ADCON, SE 0 SALTA ISTRUZIONE SUCCESSIVA
GOTO $-1 ;SE BIT2 è 1 ESEGUI NUOVO CONTROLLO
BTFSS PORTB,0
GOTO VIS
START_PWM:
BTFSS PORTB,4 ;TESTA PULSANTE COLLEGATO A RB4
GOTO SET1
BTFSS PORTB,5 ;TESTA PULSANTE COLLEGATO A RB5
GOTO SET2
BTFSS PORTB,3 ;TESTA PULSANTE COLLEGATO A RB3
GOTO SET3
GOTO NUOVA ;ESEGUI NUOVAMENTE CONTROLLI
SET1: MOVLW D'8' ; PRECARICA IL CONTATORE COUNT_1
MOVWF COUNT_1
MOVLW D'247' ; PRECARICA IL CONTATORE COUNT_2
MOVWF COUNT_2
MOVLW D'51' ; PRECARICA IL CONTATORE COUNT_3
MOVWF COUNT_3
GOTO POSIZIONE1
; POSIZIONE1: genera il segnale PWM con frequenza di 50Hz e Ton =0,6ms
; si attiva alla pressione del pulsante collegato a RB4.
; Per variare la posizione assunta dal servocomando quando si preme RB4
; variare i valori di ricarica dei contatori COUNT_1 e COUNT_2 facendo
; attenzione che la loro somma deve sempre risultare 255.
; Il COUNT_TIME serve per generare il segnale di pilotaggio del servocomando
; per il tempo necessario all' albero per compiere la rotazione voluta.
POSIZIONE1: BSF PORTA,5 ; SETTA A LIVELLO LOCICO ALTO RA5
CALL DELAY_ON ; CHIAMA LA ROUTINE DI RITARDO DEL Ton DEL PWM
MOVLW D'8' ; RICARICA IL CONTATORE COUNT_1
MOVWF COUNT_1
BCF PORTA,5 ; SETTA A LIVELLO LOGICO BASSO RA5
CALL DELAY_OFF ; CHIAMA LA ROUTINE DI RITARDO DEL Toff DEL PWM
MOVLW D'247' ; RICARICA IL CONTATORE COUNT_2
MOVWF COUNT_2
DECFSZ COUNT_TIME ; DECREMENTA IL COUNT_TIME
GOTO POSIZIONE1
MOVLW D'30' ; RICARICA IL COUNT_TIME
MOVWF COUNT_TIME
GOTO NUOVA
SET2: MOVLW D'28' ; PRECARICA IL CONTATORE COUNT_1
MOVWF COUNT_1
MOVLW D'227' ; PRECARICA IL CONTATORE COUNT_2
MOVWF COUNT_2
MOVLW D'51' ; PRECARICA IL CONTATORE COUNT_3
MOVWF COUNT_3
GOTO POSIZIONE2
; POSIZIONE2: genera il segnale PWM con frequenza di 50Hz e Ton =2.4ms
; si attiva alla pressione del pulsante collegato a RB5.
; Per variare la posizione assunta dal servocomando quando si preme RB5
; variare i valori di ricarica dei contatori COUNT_1 e COUNT_2 facendo
; attenzione che la loro somma deve sempre risultare 255.
; Il COUNT_TIME serve per generare il segnale di pilotaggio del servocomando
; per il tempo necessario all' albero per compiere la rotazione voluta.
POSIZIONE2: BSF PORTA,5 ; SETTA A LIVELLO LOCICO ALTO RA5
CALL DELAY_ON ; CHIAMA LA ROUTINE DI RITARDO DEL Ton DEL PWM
MOVLW D'28' ; RICARICA IL CONTATORE COUNT_1
MOVWF COUNT_1
BCF PORTA,5 ; SETTA A LIVELLO LOGICO BASSO RA5
CALL DELAY_OFF ; CHIAMA LA ROUTINE DI RITARDO DEL Toff DEL PWM
MOVLW D'227' ; RICARICA IL CONTATORE COUNT_2
MOVWF COUNT_2
DECFSZ COUNT_TIME ; DECREMENTA IL COUNT_TIME
GOTO POSIZIONE2
MOVLW D'30' ; RICARICA IL COUNT_TIME
MOVWF COUNT_TIME
GOTO NUOVA
SET3: MOVLW D'18' ; PRECARICA IL CONTATORE COUNT_1
MOVWF COUNT_1
MOVLW D'237' ; PRECARICA IL CONTATORE COUNT_2
MOVWF COUNT_2
MOVLW D'51' ; PRECARICA IL CONTATORE COUNT_3
MOVWF COUNT_3
GOTO POSIZIONE3
; POSIZIONE3: genera il segnale PWM con frequenza di 50Hz e Ton =1,6ms)
; si attiva alla pressione del pulsante collegato a RB5.
; Per variare la posizione assunta dal servocomando quando si preme RB5
; variare i valori di ricarica dei contatori COUNT_1 e COUNT_2 facendo
; attenzione che la loro somma deve sempre risultare 255.
; Il COUNT_TIME serve per generare il segnale di pilotaggio del servocomando
; per il tempo necessario all' albero per compiere la rotazione voluta.
POSIZIONE3: BSF PORTA,5 ; SETTA A LIVELLO LOCICO ALTO RA5
CALL DELAY_ON ; CHIAMA LA ROUTINE DI RITARDO DEL Ton DEL PWM
MOVLW D'18' ; RICARICA IL CONTATORE COUNT_1
MOVWF COUNT_1
BCF PORTA,5 ; SETTA A LIVELLO LOGICO BASSO RA5
CALL DELAY_OFF ; CHIAMA LA ROUTINE DI RITARDO DEL Toff DEL PWM
MOVLW D'237' ; RICARICA IL CONTATORE COUNT_2
MOVWF COUNT_2
DECFSZ COUNT_TIME ; DECREMENTA IL COUNT_TIME
GOTO POSIZIONE3
MOVLW D'30' ; RICARICA IL COUNT_TIME
MOVWF COUNT_TIME
GOTO NUOVA
DELAY: MOVLW 0FH
MOVWF C1
LOOP1: DECFSZ C1,1 ;DECR.REG.E SALTA ISTRUZ. SUCCESSIVA SE è 0
GOTO LOOP1
RETURN
DELAY_ON: DECFSZ COUNT_3
GOTO DELAY_ON
MOVLW D'51' ; RICARICA IL CONTATORE COUNT_3
MOVWF COUNT_3
DECFSZ COUNT_1 ; DECREMENTA IL COUNT_1
GOTO DELAY_ON
RETURN
DELAY_OFF: DECFSZ COUNT_3
GOTO DELAY_OFF
MOVLW D'51' ; PRECARICA IL CONTATORE COUNT_3
MOVWF COUNT_3
DECFSZ COUNT_2 ; DECREMENTA IL COUNT_2
GOTO DELAY_OFF
RETURN
VIS: MOVF ADRESH,0 ;CARICA IN W PARTE DEL RISULTATO
MOVWF 07 ;USCITA SU PORTC.VISUALIZZA DATO CONVERTITO
MOVLW D'255'
VIS_DELAY MOVWF C2
DECFSZ C2
GOTO $-2
CLRF PORTC
RETURN
END
Torna a Realizzazioni, interfacciamento e nozioni generali.
Visitano il forum: Nessuno e 13 ospiti