#!/usr/local/bin/php
//Arlotto/Ferrer 2007 : Démonstration d'utilisation // du module convertisseur analogique numérique // sans interruption sur un 18F4520 // Attention la doc DS51297E est erronnée : // il faut spécifier les deux références dans le param2 // de OpenAdc : ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS !!! // On convertit la tension sur RA0 et on allume // 0,1,2 ou 3 led de la carte picdem2+ en fonction // de la valeur du résultat // Initialisation : // ADC_4_TAD : ici on ne change jamais de canal // le temps d'acquisition est donc peut important. // Sinon choisir TAD pour laisser le temps de charge à CHOLD // voir doc DS39631A ch 19.1 // ADC_FOSC_8 : Tad > 1.6us à 4Mhz Tosc=0.25us // Tad= K.Tosc = K.0.25us => K >1.6/0.25=6.4 // d'où K=8 et Tad = 8x0.25 = 2us // La conversion dure 12.Tad = 12x8x0.25 = 24us // Le temps d'acquisition vaut 4Tad = 4x2us = 8us // ADC_RIGHT_JUST : les 10 bits du resultat sont // les bit b0 à b9 d'un int // 14 : seule valeur possible sur la carte picdem2 avec PBADEN = OFF // pour pouvoir utiliser le lcd avec un 18F4520 // vérifer votre cablage en fonction de la combinaison choisie // ADC_CH0 : le canal 0 est sélectionné à l'init // ensuite on pourrait changer de canal par la fonction // SetChanADC() mais attention à attendre le temps // nécessaire à la charge de la capa d'acquisiton // avant de démarrer une conversion après changement de canal // Avec PBADEN = ON RB4:RB0 peuvent être utilisées comme // entrées analogiques supplémentaires (AN8 à AN12) #include <p18cxxx.h> #include <adc.h> // pour fonctions adc #include <delays.h> // configuration PICDEM2+ quartz #pragma config OSC = HS #pragma config WDT = OFF #pragma config LVP = OFF #pragma config PBADEN = OFF // Si PBADEN = ON RB4:RB0 sont analogiques au reset const rom char BARGRAF[5]={0x00,0x08,0x0C,0x0E,0x0F}; void main(void){ int result ; PORTB = 0 ; TRISB = 0 ; OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_4_TAD , ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS, // non définit dans la doc rev. E !! 14 ); Delay10TCYx(5); // temps d'attente // après le démarrage de l'adc for( ;; ) { ConvertADC(); while( BusyADC() ) ; // delais de Tacq+12Tad = 32us max result = ReadADC(); PORTB = BARGRAF[result/255]; } }