3 capteurs avec TIMER1: ; Appeler la fonction affiche_LCD
; Inclure les fichiers de définitions BANKSEL ADCON0 (hypothétique, remplacer par la
#include <[Link]> MOVLW 0x41 ; fonction réelle)
; Variables ADCS1:ADCS0=10, CHS=000, ADON=1 CALL affiche_LCD
CBLOCK 0x20 MOVWF ADCON0 ; Réinitialiser l'interruption ADC
SENSOR_INDEX ; Index du BCF PIR1, ADIF
capteur (0: température, 1: humidité, ; Initialisation du Timer1 RETFIE
2: vent) BANKSEL T1CON
SENSOR_VALUE ; Valeur lue MOVLW 0x31 ; TMR1ON=1, TIMER1_ISR
du capteur TMR1CS=0, T1CKPS=11 (1:8 Prescale) ; Démarrer une conversion ADC
ENDC MOVWF T1CON BSF ADCON0, GO_DONE
ORG 0x00 MOVLW D'3036' ; Charger la ; Réinitialiser l'interruption Timer1
GOTO INIT ; Aller à valeur de préchargement pour 135ms BCF PIR1, TMR1IF
l'initialisation MOVWF TMR1L ; Recharger Timer1 pour une
ORG 0x04 MOVWF TMR1H interruption après 135 ms
; Routine d'interruption ; Initialisation des interruptions MOVLW D'3036'
ISR BANKSEL PIE1 MOVWF TMR1L
BTFSC PIR1, ADIF BSF PIE1, ADIE ; Activer MOVWF TMR1H
GOTO ADC_ISR ; Gérer l'interruption de l'ADC RETFIE
l'interruption ADC BSF PIE1, TMR1IE ; Activer INIT
BTFSC PIR1, TMR1IF l'interruption de Timer1 ; Initialisation des registres
GOTO TIMER1_ISR ; Gérer BANKSEL ADCON1
l'interruption Timer1 BANKSEL INTCON MOVLW 0x80 ; ADFM=1,
RETFIE BSF INTCON, PEIE ; Activer les VCFG1:VCFG0=00,
ADC_ISR interruptions périphériques PCFG3:PCFG0=0110 (AN0 seulement)
; Lire la valeur de l'ADC BSF INTCON, GIE ; Activer les MOVWF ADCON1
MOVF ADRESH, W interruptions globales
MOVWF SENSOR_VALUE BANKSEL ADCON0
; Appeler la fonction affiche_LCD ; Initialisation des variables MOVLW 0x41 ;
CALL affiche_LCD CLRF SENSOR_INDEX ADCS1:ADCS0=10 (Fosc/32), CHS=000
; Avancer au prochain capteur (AN0), ADON=1
INCF SENSOR_INDEX, F ; Démarrer la première conversion MOVWF ADCON0
MOVLW 0x03 ADC
ANDWF SENSOR_INDEX, F ; BSF ADCON0, GO_DONE ; Initialisation du Timer1
SENSOR_INDEX = SENSOR_INDEX % 3 ; Boucle principale BANKSEL T1CON
; Sélectionner le prochain canal MAIN_LOOP MOVLW 0x31 ; TMR1ON=1,
ADC GOTO MAIN_LOOP TMR1CS=0 (source interne),
MOVF SENSOR_INDEX, W END T1CKPS=11 (1:8 Prescale)
CALL SELECT_ADC_CHANNEL 1 capteur avec TIMER1: MOVWF T1CON
; Réinitialiser l'interruption ADC ; Inclure les fichiers de définitions MOVLW D'3036' ; Charger la
BCF PIR1, ADIF #include <[Link]> valeur de préchargement pour 135ms
RETFIE MOVWF TMR1L
; Définir les variables MOVWF TMR1H
TIMER1_ISR CBLOCK 0x20 ; Initialisation des interruptions
; Démarrer une conversion ADC TEMP_VALUE_L ; Valeur lue du BANKSEL PIE1
BSF ADCON0, GO_DONE capteur de température (partie basse) BSF PIE1, ADIE ; Activer
; Réinitialiser le Timer1 TEMP_VALUE_H ; Valeur lue l'interruption de l'ADC
MOVLW D'3036' du capteur de température (partie BSF PIE1, TMR1IE ; Activer
MOVWF TMR1L haute) l'interruption de Timer1
MOVWF TMR1H ENDC
; Réinitialiser l'interruption Timer1 BANKSEL INTCON
BCF PIR1, TMR1IF ORG 0x00 BSF INTCON, PEIE ; Activer les
RETFIE GOTO INIT ; Aller à interruptions périphériques
l'initialisation BSF INTCON, GIE ; Activer les
SELECT_ADC_CHANNEL ORG 0x04 interruptions globales
; Sélectionner le canal ADC en ; Routine d'interruption ; Initialisation des variables
fonction de SENSOR_INDEX ISR CLRF TEMP_VALUE_L
MOVWF ADCON0, W BTFSC PIR1, ADIF CLRF TEMP_VALUE_H
ANDLW 0xF8 ; Masquer les GOTO ADC_ISR ; Gérer
bits de sélection de canal l'interruption ADC ; Démarrer la première conversion
ADDWF ADCON0, F ; Ajouter la BTFSC PIR1, TMR1IF ADC
valeur de SENSOR_INDEX pour GOTO TIMER1_ISR ; Gérer BSF ADCON0, GO_DONE
sélectionner le canal l'interruption Timer1 ; Boucle principale
RETURN RETFIE MAIN_LOOP
INIT GOTO MAIN_LOOP
; Initialisation des registres ADC_ISR END
BANKSEL ADCON1 ; Lire la valeur de l'ADC
MOVLW 0x80 ; ADFM=1, MOVF ADRESL, W
VCFG1:VCFG0=00, MOVWF TEMP_VALUE_L
PCFG3:PCFG0=0110 (AN0-AN2) MOVF ADRESH, W
MOVWF ADCON1 MOVWF TEMP_VALUE_H
1 capteur avec Timer2 MOVLW 0x07 ; Pré-diviseur =
; Inclure les fichiers de définitions ; Initialisation des interruptions 16, Post-diviseur = 10
#include <[Link]> BANKSEL PIE1 MOVWF T2CON
; Définir les variables BSF PIE1, ADIE ; Activer BSF T2CON, TMR2ON ; Activer
CBLOCK 0x20 l'interruption de l'ADC Timer2
TEMP_VALUE_L ; Valeur lue du BSF PIE1, TMR2IE ; Activer
capteur de température (partie basse) l'interruption de Timer2 ; Configuration des interruptions
TEMP_VALUE_H ; Valeur lue BSF INTCON, GIE ; GIE = 1
du capteur de température (partie BANKSEL INTCON (activer les interruptions globales)
haute) BSF INTCON, PEIE ; Activer les BSF INTCON, PEIE ; PEIE = 1
ENDC interruptions périphériques (activer les interruptions des
BSF INTCON, GIE ; Activer les périphériques)
ORG 0x00 interruptions globales BSF PIE1, ADIE ; ADIE = 1
GOTO INIT ; Aller à (activer les interruptions ADC)
l'initialisation ; Initialisation des variables BSF PIE1, TMR2IE ; TMR2IE = 1
CLRF TEMP_VALUE_L (activer les interruptions Timer2)
ORG 0x04 CLRF TEMP_VALUE_H
; Routine d'interruption ; Démarrer la première conversion ; Boucle principale
ISR ADC MAIN_LOOP:
BTFSC PIR1, ADIF BSF ADCON0, GO_DONE GOTO MAIN_LOOP
GOTO ADC_ISR ; Gérer ; Boucle principale
l'interruption ADC MAIN_LOOP ; Routine d'interruption
BTFSC PIR1, TMR2IF GOTO MAIN_LOOP ISR:
GOTO TIMER2_ISR ; Gérer END BTFSS PIR1, TMR2IF ; Vérifier
l'interruption Timer2 3 capteurs avec Timer2: l'interruption Timer2
RETFIE ; Inclure le fichier de définitions pour GOTO CHECK_ADC
le PIC16F877A BCF PIR1, TMR2IF ; Clear
ADC_ISR #include <[Link]> TMR2IF
; Lire la valeur de l'ADC
MOVF ADRESL, W ; Définition des variables ; Démarrer une conversion ADC
MOVWF TEMP_VALUE_L TEMP EQU 0x20 ; Adresse de la BSF ADCON0, GO ; Démarrer
MOVF ADRESH, W variable temporaire pour ADRESH l'ADC
MOVWF TEMP_VALUE_H TEMP_L EQU 0x21 ; Adresse de la
; Appeler la fonction affiche_LCD variable temporaire pour ADRESL ; Attendre la fin de conversion
(hypothétique, remplacer par la WAIT_ADC:
fonction réelle) ; Déclaration de l'étiquette de début BTFSC PIR1, ADIF ; Vérifier
CALL affiche_LCD ORG 0x00 l'interruption ADC
; Réinitialiser l'interruption ADC GOTO START GOTO WAIT_ADC
BCF PIR1, ADIF
RETFIE ; Vecteur d'interruption ; Lire le résultat de l'ADC
ORG 0x04 MOVF ADRESH, W
TIMER2_ISR GOTO ISR MOVWF TEMP ; Stocker la
; Démarrer une conversion ADC partie haute du résultat
BSF ADCON0, GO_DONE START: MOVF ADRESL, W
; Réinitialiser l'interruption Timer2 ; Configuration des ports MOVWF TEMP_L ; Stocker la
BCF PIR1, TMR2IF BSF STATUS, RP0 ; Sélectionner partie basse du résultat
RETFIE Bank 1
MOVLW 0x07 ; Configurer ; Appeler la fonction pour afficher
INIT RA0, RA1, RA2 comme entrées sur LCD
; Initialisation des registres analogiques CALL affiche_LCD
BANKSEL ADCON1 MOVWF TRISA
MOVLW 0x80 ; ADFM=1, MOVLW 0x00 ; Configurer ; Sélectionner le prochain canal
VCFG1:VCFG0=00, PORTD comme sortie ADC
PCFG3:PCFG0=0110 (AN0 seulement) MOVWF TRISD MOVLW 0x41
MOVWF ADCON1 BCF STATUS, RP0 ; Sélectionner ADDWF ADCON0, F
Bank 0 ANDLW 0xF1
BANKSEL ADCON0 MOVWF ADCON0
MOVLW 0x41 ; ; Configuration de l'ADC
ADCS1:ADCS0=10 (Fosc/32), CHS=000 MOVLW 0x80 ; Justification ; Retourner de l'interruption
(AN0), ADON=1 droite, Vref+ = Vdd, Vref- = Vss, AN0 à BCF PIR1, ADIF ; Clear ADIF
MOVWF ADCON0 AN2 analogiques RETFIE
MOVWF ADCON1
; Initialisation du Timer2 MOVLW 0x41 ; Sélectionner CHECK_ADC:
BANKSEL T2CON canal AN0, activer ADC RETFIE
MOVLW 0x7D ; Prescaler = 16, MOVWF ADCON0
Postscaler = 16, TMR2ON = 1 ; Définition de la fonction affiche_LCD
MOVWF T2CON ; Configuration de Timer2 ; (à compléter en fonction des
MOVLW 0xFF ; Période de MOVLW 0x69 ; PR2 = 105 spécificités de votre LCD)
Timer2 pour générer une interruption pour une période de 135 ms
toutes les 135ms MOVWF PR2 END
MOVWF PR2