Lettura di un ingresso analogico (8 bit) con un PIC16F876#include <pic.h> setup()
{
// impostazione ADCON1
PCFG3=0; // 0000 tutti ingressi analogici
PCFG2=0;
PCFG1=0;
PCFG0=0;
ADFM=0; // risultato allineato a sinistra
TRISA=0b111111; // tutti i 6 pin sono ingressi
TRISB=0b00000000; // tutti gli 8 pin sono uscite
// impostazione ADCON0
ADON=1; // ADC acceso
ADCS1=0; // Frequenza conversione = Fosc/2
ADCS0=0;
}
unsigned char LeggiADC( unsigned char CanaleADC)
{
unsigned char j;
char RisultatoADC;
ADCON0 |= ADchannel << 3;
j=0;
while( j<=10 ) j++; // pausa di circa 20 usec
// richiesta prima di fare conversione
GO_nDONE = 1;
while(GO_nDONE);
RisultatoADC = ADRESH;
j=0;
while( j<=10) j++; // pausa di circa 20 usec
// richiesta prima di fare nuova acquisizione
return(RisultatoADC);
}
void loop(void)
{
if ( LeggiADC(0) > 127 ) RB0=1; else RB0=0;
}
void main (void)
{
setup();
while(1) loop();
}
SCHEDA TECNICA - CALCOLO TEMPI
j=0;
while( j<=15 ) j++; // pausa di circa 20 us
Come si calcola il tempo della pausa?
Ipotesi:
Frequenza Clock = 4 MHz
Periodo Clock = 0.25 us
Tempo Ciclo istruzioni = 0.25 x 4 = 1 us
Risultato della compilazione (istruzioni in linguaggio Assembly)
MOVLW 10 ; carica 10 nel registro Working - impiega 1us
MOVWF J ; carica il contenuto di Working nella cella J - impiega 1us
LOOP DECFSZ J,1 ; decrementa J e salta se è zero - impiega 1us
GOTO LOOP ; salta a LOOP - impiega 1us
Tempo totale = 1+1+2*10 = 22us
Lettura di ingressi analogici (8 bit) con un PIC16F876
setup(){ // impostazione ADCON1 PCFG3=0; // 0000 tutti ingressi analogici PCFG2=0; PCFG1=0; PCFG0=0; ADFM=0; // risultato allineato a sinistra TRISA=0b111111; // tutti i 6 pin sono ingressi TRISB=0b00000000; // tutti gli 8 pin sono uscite}unsigned char LeggiADC( unsigned char CanaleADC)
{
unsigned char j;
char RisultatoADC;
// impostazione ADCON0
ADON=1; // ADC acceso
ADCS1=0; // Frequenza conversione = Fosc/2
ADCS0=0;
ADCON0 |= CanaleADC << 3;
j=0;
while( j<=10 ) j++; // pausa 20 usec
// richiesta prima di fare conversione
GO_nDONE = 1;
while(GO_nDONE); RisultatoADC = ADRESH; j=0; while( j<=10) j++; // pausa 20 usec // richiesta prima di fare nuova acquisizione return(RisultatoADC); } void loop(void){ if ( LeggiADC(0) > 127 ) RB0=1; else RB0=0; if ( LeggiADC(4) > 127 ) RB1=1; else RB1=0;
}
void main (void)
{
setup();
while(1) loop();
}
Lettura di un ingresso analogico (10 bit) con un PIC16F877
#include <pic.h> setup(){ TRISA=0b111111; // tutti i 6 pin sono ingressi // impostazione ADCON1 PCFG3=0; // all analog inputs 0000 PCFG2=0; PCFG1=0; PCFG0=0; ADFM=1; // result right align
// impostazione ADCON0
ADON=1; // ADC acceso
ADCS1=0; // Frequenza conversione = Fosc/2
ADCS0=0;
}
void delayus(unsigned char j)
{
unsigned char i;
i=0;
while( i<=j ) i++;
}
void loop(void)
{
unsigned int j;
unsigned char a;
CHS2=0;
CHS1=0;
CHS0=0; // selezione canale
delayus(20); // pausa 20 usec
// richiesta prima di fare conversione
GO_nDONE=1; // inizia conversione
while(GO_nDONE) ; // attendi fine conversione
a=ADRESL; // leggi ADRESL
j=(ADRESH*256)+a; // somma ADRESH a ADRESL
if(j>=512) RB0=1; else RB0=0; // RB0 led on if RA0 over 512
delayus(20); // pausa 20 usec
// richiesta prima di fare nuova acquisizione
}
void main (void)
{
setup();
while(1) loop();
}