0% ont trouvé ce document utile (0 vote)
6 vues2 pages

Capteurs avec TIMER1 et TIMER2

Transféré par

salmaseart
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
6 vues2 pages

Capteurs avec TIMER1 et TIMER2

Transféré par

salmaseart
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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

Vous aimerez peut-être aussi