pic 18F4550 et convertisseur A/N ADC0820
La connection d' un convertisseur ADC0820 avec un pic 18F4550
le but du montage est de convertir une entrée analogique 0->5 volts en une valeur de 0->255
(8bits) et de le transférer vers un pc via la liaison RS232 affichage effectué avec Hyper terminal
configuré en 9600 bauds 1stop pas de contrôle de flux.
Le montage présenté : affiche "bonjour monde " (signal un reset)
affiche la convertion sous forme "000"->"255"
en fonction de la position du potentiomètre .
suivi d' un astérisque qui clignote à chaque rafraîchissement
(si il ne clignote plus la liaison est coupée)
la fréquence d'échantillonnage du signal sera au mini de 1,5µS voir data sheep de l'AD0820 qui est
cablé en "stand alone" et ne se sert pas de la sortie INT/
voir http://perso.ensad.fr/ari/davidov/elect/ADC0820.html
Le programme abondamment commenté pourra facilement être adapté à votre projet .
c'est le but !!
Ecrire le programme à la main permet de bien comprendre le fonctionnement .
si vous lisez ces lignes il serait sympa de me laisser un message ca fait toujours plaisir
si si soyez pas timide
le schéma
La suite
Le programme en asm (merci à JULLIETTA et ACETRONIC) pour le probleme avec PB5
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
; van haecke Hervé
;ce programme envoie la lecture d'un convertisseur A/N AD 0820
; 9600 bauds 8bits 1 stop
;
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
list P=18F4550
include <p18F4550.inc>
CONFIG LVP = OFF ;supprime la programmation basse tension libère PB 5
CONFIG PBADEN = OFF ; port b en numérique
CONFIG WDT = OFF
CONFIG FOSC = XT_XT ; HS oscillateur 4 Mhz
tempo1 EQU 0x10 ;variable 1 octet
tempo2 EQU 0x11 ;variable 2
var0 EQU 0x12
var1 EQU 0x13
var2 EQU 0x14
var3 EQU 0x15
var4 EQU 0x16
ORG 0 ;Le prg commence en 0000
;configure entrées sorties numériques
; ici pour le port A
CLRF PORTA ; met à 0 le PORTA LATCH
MOVLW 0Fh
MOVWF ADCON1 ; coupe les entrées A/N
MOVLW 07h
MOVLW CMCON ; coupe entrée du comparateur
bcf TRISA ,0 ; configure PA0 en sortie wr du convertisseur
;ici pour le portb
movlw 0xFF
movwf TRISB ;configure le portb en entrée
bcf INTCON2,RBPU ;mise en service des résistances tirage 5V portB pull-up
; configure port serie
bcf TRISC,6 ;mais le port bit 6 donc TX en sortie
bsf TRISC,7 ;mais le port bit 7 donc RX en entrée
movlw 19h ; 9600 baud quartz 4 MHZ
movwf SPBRG
bsf TXSTA,TXEN ; ouverture de TX
bsf TXSTA,BRGH ;fait partie de la sélection de vitesse avec SPBRG
bsf RCSTA,SPEN ; valide port série
bsf RCSTA,CREN ;;valide réception
;------------------------------------------------------------------------------------------------
; programme principal
;------------------------------------------------------------------------------------------------
BSF PORTA,0 ; mise a 1 DU PORT A BIT 0 donc WR\ =5V
call tempo ; pour éviter les rebonds suite reset
call tempo ;
call tempo
call bonjour ; affiche bonjour
;------------------------------------------------------------------------------------------------
main call lecture_ad ;lit la valeur convertie de AD 820 sur 1 octet
call octet_decimal_asc ;convertie l'octet en Hexa
call Affiche_pc ;envoie vers le pc via rs232
call tempo ; laisse le temps de voir la mesure
call tempo
call tempo
bra main
;------------------------------------------------------------------------------------------------
lecture_ad bcf PORTA,0 ; wr\ =0
nop; pose 1µs
nop
nop
nop
nop
bsf PORTA,0 ;wr\ =1
nop ; pose 1µs
nop
nop
nop
nop
nop
nop
nop
nop
movf PORTB,0 ;charge la conversion dans w
movwf var0 ; met la valeur dans var0
return
;-------------------------------------------------------------------------------------------------
; ce sous programme reçoit un octet en var0 renvoit la valeur décimale sous forme var1,var2,var3
;var3 chiffre des centaines ;var2 dizaines ,var1 unités
;-------------------------------------------------------------------------------------------------
octet_decimal_asc movlw '0' ;met la valeur ascii de 0 dans w
movwf var1 ; var1=valeur code ascii 0
movwf var2 ;
movwf var3 ;
debut1 movf var0,1 ;positionnent BIT Z
bz fin01 ; si var0= O finO1 return
decf var0
incf var1
movf var1,0
sublw '9'+1
bz suite1 ;var1>9
bra debut1
;-----------------------------------------------------------------------------------------------------
suite1 movlw '0'
movwf var1 ; remet var2 à la valeur ascii de "0"
incf var2
movf var2,0 ;charge var2 dans w
sublw '9'+1
bz suite2 ;var2>9
bra debut1
suite2 movlw '0'
movwf var2
incf var3
bra debut1
fin01 return
;--------------------------------------------------------------------------------------
Affiche_pc movlw 0x0D ; lf debut de ligne
call trans
movf var3,0 ; affiche centaine
call trans
movf var2,0 ; dizaine
call trans
movf var1,0
call trans ;unité de la valeur mesurée 0 255
incf var4
btfsc var4,0
goto aff2 ;gros bricolage pour faire clignoter un astérisque ;
; si il ne clignote le pc ne reçoit plus les données
movlw ' '
call trans
aff1 return
aff2 movlw '*'
call trans
goto aff1
;-------------------------------------------------
;envoie bonjour sur port serie
;--------------------------------------------------
bonjour movlw 0x0A ;vas en début de ligne
call trans
movlw 0x0D ; vas à la ligne suivante OA 0D code ascii 10 13
call trans
movlw 'B' ;code ascii B
call trans ;vas à trans
movlw 'o' ;
call trans
movlw 'n' ;
call trans
movlw 'j' ;
call trans
movlw 'o' ;
call trans
movlw 'u' ;
call trans
movlw 'r' ;
call trans
movlw ' ' ;
call trans
movlw 'M' ;
call trans
movlw 'o' ;
call trans
movlw 'n' ;
call trans
movlw 'd' ;
call trans
movlw 'e' ;
call trans
movlw ' ' ;
call trans
movlw 0x0D ; lf
call trans
movlw 0x0A ;cr
call trans
movlw ' ' ;
call trans
movlw '?' ;
call trans
movlw ' ' ;
call trans
return
;--------------------------------------------------------------------------------------------------
;transmission reception usart
trans btfss TXSTA,TRMT ;test TRMT si 0 usart est occupé
bra trans
movwf TXREG ;charge le registre de transmission
return
reception btfss PIR1,RCIF ;test RCIF si 0 PAS OCTET NOUVEAU DANS RCREG
bra reception
movf RCREG,W ;charge octet reçu par le port seri dans accumulateur
return
;----------------------------------------------------------------------------------------------------
;ici commence le fabuleux sous programme tempo
tempo movlw 0xFF
movwf tempo1 ;met 255 dans tempo1
ici movlw 0xFF
movwf tempo2 ;met 255 dans tempo2
ici1 decfsz tempo2 ;décrément tempo2 saut l' instruction suivante si tempo2=0
bra ici1
decfsz tempo1 ;décrément tempo1 saut l' instruction suivante si tempo2=0
bra ici
return
end ;fini si si
A+ Hervé