Bonjour tout le monde,
Depuis mon dernier post où je demandais de l'aide pour afficher sur des 7 segments j'ai un peu avancé tant bien que mal...
Si mon code est correcte, mes 7 segments devraient afficher correctement mon information (je ne peux pas encore le tester, mon pic ayant rendu l'ame j'en ai recommandé un autre et je l'attends toujours)
LIST p=18F2525
#include <p18F2525.inc>
CONFIG OSC = INTIO67
CONFIG FCMEN = OFF
CONFIG IESO = OFF
CONFIG PWRT = OFF
CONFIG BOREN = OFF
CONFIG WDT = OFF
CONFIG MCLRE = OFF
CONFIG LPT1OSC = OFF
CONFIG PBADEN = OFF
CONFIG DEBUG = OFF
;*********************************************************************
; Masques *
; *
;*********************************************************************
MASK_ADCON0 EQU B'00000000' ; la conversion analogique n'est pas autorise?e
MASK_ADCON1 EQU B'00001110' ; Le voltage de re?fe?rence pour la conversion e?tant comme ;VSS et VDD
MASK_ADCON2 EQU B'10001100' ; de?finie la justification par la droite ou gauche
MASK_TRISA EQU B'00000011' ; les pins 2 et 3 sont configure?es comme des entre?es
; et 4,5,6,7,9 et 10 comme des sorties
MASK_TRISB EQU B'00000000' ; Toutes les pins PORTB sont configure?es comme des ;sorties
MASK_TRISC EQU B'01000000' ; Toutes les pins PORTC sont configure?es en sortie sauf ;RC6 qui sera utilise? pour l'USART
MASK_T0CONOFF EQU B'00000111' ; le timer n'est pas enclenche?
MASK_T0CONON EQU B'10000111' ; le timer est enclenche?
MASK_INTCONOFF EQU B'00000000' ; interdire les interruptions
MASK_INTCONON EQU B'10100000' ; autorise uniquement l'interruption du timer 0
;*********************************************************************
; DEFINITION *
;*********************************************************************
#DEFINE bouton PORTA,2 ; Bouton permettant de mettre sous tension
#DEFINE a PORTB,0 ; Afficheur de la barre a
#DEFINE b PORTB,1 ; Afficheur de la barre b
#DEFINE c PORTB,2 ; Afficheur de la barre c
#DEFINE d PORTB,3 ; Afficheur de la barre d
#DEFINE e PORTB,4 ; Afficheur de la barre e
#DEFINE f PORTB,5 ; Afficheur de la barre f
#DEFINE g PORTB,6 ; Afficheur de la barre g
#DEFINE dp PORTB,7 ; Afficheur de la barre dp
#DEFINE Ones PORTC,0 ; Allume le 7 segments des unite?s
#DEFINE Tens PORTC,1 ; allume le 7 segments des dixaines
;*********************************************************************
; TABLE 7 segments *
;Cette table permet le stockage d'informations concernant l'affichage*
; des 7 segments. Elle contient les adresses qui permettent d'affiher*
;tel ou tel chiffre. Les adresses suivantes sont attribue?es *
;respectivement a` 0,1,2,3,4,5,6,7,8,9,10 *
;*********************************************************************
tabl_segment EQU 0x0001000
org tabl_segment
db 0x3F,0x06,0x5B,0X4F
db 0x26,0x6D,0x7D,0x07
db 0x7F,0x6F,0x00
;*********************************************************************
; VARIABLES *
;*********************************************************************
CBLOCK 0x000
cmptac : 1 ; Temps ne?cessaire a` la charge du convertisseur pour l'
; acquisition
cmptac50 : 1
cmptmoy : 1 ; compteur permettant d'avoir 8 e?chantillons et d'en faire
; la moyenne
accumL : 1
accumH : 1
moyenneL : 1 ; 8 premiers octets de la moyenne
moyenneH : 1 ; 8 derniers octets de la moyenne
ones : 1 ; variables des unite?s pour 7-segments
tens : 1 ; variables des dixaines pour 7-segments
casel : 1 ; permet de se?lectionner quel cadran allumer
ENDC
;*********************************************************************
; INITIALISATION *
;*********************************************************************
init
movlw MASK_ADCON1 ; ANO = entre?e analogique. Vref = Vss et Vdd
movwf ADCON1
movlw MASK_ADCON0 ; AN0 se?lectionne?e, pas de conversion en cours
movwf ADCON0
movlw MASK_ADCON2 ; Justification par la droite, Acquisition time = 2Tad
movwf ADCON2
movlw MASK_TRISA ; Configurer Pin 2 et 3 comme des entre?es
movwf TRISA
clrf PORTB
movlw MASK_TRISB ; Configurer toutes les pins PORTB comme des sorties
movwf TRISB
clrf PORTC
movlw MASK_TRISC ; configurer les pins 11,12,13,14,15,16,18 en sortie et 17 en entre?e
movwf TRISC
bra MAIN
;ATTENTION JE NE COMPRENDS PAS CE QU'A FAIT A-S
;*********************************************************************
; SOUS ROUTINE *
;*********************************************************************
; calculer la moyenne
;**********************************************************************
MOYENNE
RRCF accumH ; divise RRNCF et RRCF par 2
RRNCF accumL
RRCF accumH ; Divise encore par 2
RRNCF accumL
RRCF accumH ; divise encore par 2 donc finalement on a par 8
RRNCF accumL
bra CHIFFRE
;*********************************************************************
; CHIFFRES *
;*********************************************************************
CHIFFRE
clrf ones ; Effacer "ones" et "tens"
clrf tens
DIXAINE
movlw 0xA ; Charger 10 dans w pour savoir
; combien de dixaine il y a dans notre moyenne
subwf accumL,1,0 ; pour se faire, on soustrait 10 a` accumL et on laisse
; le re?sultat dans accumL jusqu'a` obtenir un ne?gatif
movlw 0x0
subwfb accumH,1,0 ; sousraire le Report de soustraction si il y en a
bn NEGATIF ; si le re?sultat < 0 alors N du reg status vaut 1
; Donc on va direct a` NEGATIF. Si > 0
incf tens ; alors on incre?mente de 1 la variable tens
BZ FIN_CHIFFRE ; si le re?sultat = 0 alors plus de reste donc termine?
bra DIXAINE ; Si le re?sultat est possitif alors on recommence.
NEGATIF
movlw 0xA ; on rajoute les 10 dans accumL pour retrouver un chiffre positif
addwf accumL,1,0 ; et les passer dans la variable ones
UNITE
movff accumL,ones
FIN_CHIFFRE
bra AFFICHAGE
;*********************************************************************
; AFFICHAGE *
;*********************************************************************
AFFICHAGE
movlw UPPER(tabl_segment) ; charger bits 16 a` 21 de l'adresse
movwf TBLPTRU ; dans pointeur UPPER
movlw HIGH(tabl_segment) ; charger bits 8 a` 15 de l'adresse
movwf TBLPTRH ; dans pointeur HIGH
movlw LOW(tabl_segment) ; charger bits 0 a` 7 de l'adresse
movwf TBLPTRL ; dans pointeur LOW
BCF PORTC,0 ; On configure RC0 et RC1 en sortie
BCF PORTC,1
movlw 0x01 ; on met 1 dans w
movwf casel ; on charge 1 dans casel
cpfseq casel,0 ; comparer casel a` w, et sauter s'ils sont e?gaux
bra AFITENS ; si diffe?rent alors on va afficher les dixaines
movf ones,w,0 ; mettre le nombre d'unite? dans w
addwf TBLPTRL,1,0 ; ajouter ones dans le pointeur de la table L
tblrd * ; lire la table a` l'adresse du pointeur
movf TABLAT,w ; mettre le re?sultat de la table dans w
movwf PORTB ; envoyer la valeur de la table vers l'afficheur 7 segments
BSF PORTC,0,0 ; allumer uniquement le cadran des unite?s
BRA NVCASEL ; aller a` NVCASEL de fac?on a` se?lectionner un nouveau cadran
AFITENS
movlw 0x02 ; charger 2 dans w
cpfseq casel,0 ; comparer si casel est e?gal a` deux
; si oui alors sauter l'instruction suivante
bra NVCASEL ; sinon aller a` NVCASEL
movf tens,w,0 ; charger les tens dans w
addwf TBLPTRL,1,0 ; Ajouter les tens dans le pointeur de la table
tblrd * ; lire la table
movf TABLAT,w ; charger la valeur de la table pointer dans w
movwf PORTB ; envoyer la valeur vers l'afficheur
BSF PORTC,1,0 ; allumer uniquement le cadran des dixaines
NVCASEL
RLNCF casel,1,0 ; faire une rotation de bit vers la gauche
movlw 0x02 ; si casel > 2 alors le remettre a` 1
cpfsgt casel,0 ; si = a` 2 alors retourner pour afficher les dixaines
bra AFITENS
bra MAIN
;*********************************************************************
; PROGRAMME PRINCIPALE *
;*********************************************************************
MAIN
CONVERSION
clrf accumL
clrf accumH ; re?initialiser accum a` 0
movlw MASK_INTCONOFF ; Interdire les interruptions
movwf INTCON,0
bsf ADCON0,ADON ; autoriser la conversion analogique
movlw 0xFA ; charger le registre W a` 250
movwf cmptac ; charger la variable cmpt1 pour obtenir un e?chantillon toutes les 25ms
movlw 0x8 ; charger le w a` 8 pour obtenir 8 e?chantillons
movwf cmptmoy ; charger cmptmoy a` 8
BOUCLE
; toutes les 50ms prendre un e?chantillon
movlw 0x02 ; charger 2 dans w
movwf cmptac50
BOUCLE50MS
decfsz cmptac ; de?cre?menter cmptac
bra BOUCLE50MS ; =/ 0 boucle1
bsf ADCON0,GO_DONE ; lancer la conversion analogique/digitale
decfsz cmptac50
bra BOUCLE50MS
BOUCLECONV
btfsc ADCON0,GO/DONE ; tester si = 0 alors conversion finie
; une fois la conversion finie, le re?sultat
; vient se mettre dans deux registres : ADRESL et ADRESH
bra BOUCLECONV ; =/0 donc boucle2
movlw 0x07 ; simuler une acquisition
movwf ADRESL
movlw 0x01 ; simuler une acquisition
movwf ADRESH
; STOCKER LES ECHANTILLONS POUR FAIRE LA MOYENNE
;*********************************************************************
movf ADRESL,w ; charger la conversion ADRESL dans registre w
addwf accumL ; additionner la pre?ce?dente conversion avec la valeur de add8v0
movf ADRESH,w ; charger la conversion ADRESH dans registre w
addwfc accumH ; additionner la pre?ce?dente conversion avec la valeur de add8v1
; retour a` la prise d'e?chantillons
;*********************************************************************
BOUCLEMOY
decfsz cmptmoy ; de?cre?menter le registre cmptmoy de 1
bra BOUCLE ; si =/ 0 alors retour a` BOUCLE 1
bra MOYENNE
END
Seulement si je suis ma logique, mon PIC va faire toutes les 50ms une conversion au bout de 8 conversions il va faire la moyenne des 8 puis afficher cette moyenne sur les 7 segments. Et recommencer en boucle jusqu'à l'arrêt de l'alimentation.
Seulement un pb persiste, j'aimerai qu'il affiche également pendant 400ms. C'est à dire pendant que le PIC prépare la prochaine moyenne (fais les 8 conversions) j'aimerai qu'il affiche celle qu'il a calculé juste avant.
Or là si je comprends bien ma logique il va faire ça :
Lancer la conversion --> Calculer la moyenne --> Allumer les cadrans --> afficher la moyenne --> éteindre les cadrans --> nouvelle conversion etc...
Or je veux :
(1) Lancer la conversion --> (2) calculer la moyenne --> (3) allumer les cadrans --> afficher la moyenne pendant 400ms
Et pendant ces 400 ms d'affichage refaire (1)(2)(3) (sachant que 1 - 2 - 3 dure environ 400ms)
Quelq'un aurai une idée ?
Je tiens à préciser que je touche à la programmation depuis moins d'un mois et que tout ce travail a été fait grâce au cours de Bigonoff... Donc soyez indulgent avec moi
Merci de votre aide