#!/usr/local/bin/php convertisseur_analogique_numerique_adc_module
//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];
}
}