Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
microblog
microblog
Publicité
Archives
3 mars 2009

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

Schema_rs232

La suite

ADC01

Le programme en asm (merci à JULLIETTA et ACETRONIC) pour le probleme avec PB5

sur WWW.abcelectronique.com

  ;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é

Publicité
Publicité
Commentaires
Publicité