Boa noite.
Estou precisando de ajuda com um voltímetro duplo com o pic16f876a, onde uso 6 displays led, sendo que três no canal an0 para leitura de tensão e três no an1 também para leitura de tensão. Ocorre que quando uso um só canal no programa a conversão ocorre normal, tanto em an0 e an1, se uso os dois há uma mistura nos canais. Se an0 está com 3v e an1 com 0v os displays apresentam 043 e 000. segue o programa.
include<16f876a.h> #device ADC=10 #use delay( clock=8000000) #fuses HS,NOWDT,PUT,BROWNOUT,NOWDT
int clock=0; int16 d1, d2, d3, d4, d5, d6;
int digito[10]={
0b11000000 // 0 0b11111001 // 1 0b10100100 // 2 0b10110000 // 3 0b10011001 // 4 0b10010010 // 5 0b10000010 // 6 0b11111000 // 7 0b10000000 // 8 0b10010000 // 9 };
#INT_RTCC void trata_t0 ()
{ clock++; if (clock>6) clock=1;
switch(clock) { case 1: output_C(digito[d1]) | (0b01111111); output_C(digito[d1]); output_B(0b00000001); Break;
case 2: output_C(digito[d2]); output_B(0b00000010);
break;
case 3: output_C(digito [d3]); output_B(0b00000100); BREAK;
case 4: output_C(digito[d4]); output_B(0b00001000); BREAK;
case 5: output_C(digito[d5]); output_B(0b00010000); BREAK;
case 6: output_C(digito[d6]); output_B(0b00100000); BREAK; } SET_TIMER0(25);
} void volt (){ int32 adc; { SET_ADC_CHANNEL(0); adc=READ_ADC(); adc=(adc*2500)/1023; delay_us(10);
d1= adc/1000; d2= (adc/100)%10; d3= (adc/10)%10; delay_ms (10); } }
void amp () {int32 adc1;
{ SET_ADC_CHANNEL(1); adc1=READ_ADC(); adc1=(adc1*2500)/1023; delay_us(10);
d4= adc1/1000; d5= (adc1/100)%10; d6= (adc1/10)%10; delay_ms (10); }}
void main() { set_tris_A(0b00000011); set_tris_B(0b00000000); set_tris_C(0b00000000); ENABLE_INTERRUPTS(GLOBAL|INT_TIMER0); SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_16); SET_TIMER0(100);
setup_ADC_ports(AN0_AN1_AN3); setup_ADC(ADC_CLOCK_INTERNAL); delay_us(10);
while(true) {
volt(); delay_ms (500); amp(); delay_ms(500); } }