Newsgroup: it.hobby.elettronica.digitale
Titolo: PIC16F877 ADC e CCS compiler

Salve
Avrei bisogno, per cortesia, di un aiuto sul seguente listato in CCS c 
compiler:
--------------------------------------------------------
#include <16F877A.h>
#device adc=16
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) 
(>10mhz for PCD)
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or 
B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES RESERVED                 //Used to set the reserved FUSE bits
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#define FWD  0
#define REV  1
int read_ADC_Chann1(unsigned char chnum)
{
   unsigned int16 val1;      //Variabili locali Unsigned int16
   float volt1;              //Variabili locali float
   set_adc_channel(chnum);    //Selezione il canale  dell'ADC (AN0/AN1)
   delay_us(20);     //20 microsecondi per set livelli hardware
   val1=read_adc();  //Start conversione - leggo valori registri
   volt1=val1*0.0000764;  //Casting val1
//   printf("\r\n %lu ",val1);
   printf("\r\n volt %3.2f",volt1);  // scrive correttamente i volt all' 
ingresso dei canali 0 e 1 rispettivamente
   return(volt1);
}
void main()
{
float direct;
float reverse;
   setup_adc_ports(ALL_ANALOG);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
while (true)
{
   direct=read_ADC_Chann1(FWD);
   printf("\r\n FWD %3.3f",direct); //  a seconda del voltaggio di ingresso 
segna sempre o zero o uno
   delay_ms(2000);
   reverse=read_ADC_Chann1(REV);
   printf("\r\n REV %3.3f",reverse); //  a seconda del voltaggio di ingresso 
segna sempre o zero o uno
   delay_ms(2000);
}
}
Come si intuisce semplicemente il funzionamento e' il seguente :
con  la funzione (read_ADC_Chann1) legge rispettivamente ed alternativamente 
il canale 0 e 1
nella stessa funzione ritorna valori esatti per val1 e volt1
con il comando return dovrebbe ritornare il valore volt1 alla variabile 
(direct=read_ADC_Chann1(FWD); )
invece segna sempre o zero o uno a seconda del voltaggio di ingresso
con ingresso minore di 1 volt segna 0
con ingresso maggiore di 1 volto segna 1
Evidentemente in alternativa potrei usare due funzioni diverse, ma sono 
curioso di  sapere perche' cosi'
non funziona.
Grazie per gli eventuali aiuti.
Jac 

    return(volt1);}
la lariabile volt1 contiene il valore
volt1=val1*0.0000764; Il pic16f877 ha un adc a 10bit (numero massimo
rappresentabile 1023) che tu poi moltiplichi per 0.0000764; il numero
massimo che otterrai è 0.0782 -un float!!-) che tra conversione tra
float ed int dovrebbe rimanere sempre uno bel 0.
Sicchè se dichiari
float read_ADC_Chann1(unsigned char chnum);
dovrebbe funzionarti tutto (occhio che lavorare con i float  rallenta
tutto moltissimo).
Ciao!

 ha scritto nel messaggio 
news:bd1821d2-a191-43c4...@j8g2000yqd.googlegroups.com...
