LusoRobótica - Robótica em Português
Sistemas específicos => PIC => Tópico iniciado por: Arknum em 14 de Julho de 2010, 00:07
-
Boas
Comecei a fazer experiencias num PIC16f877 e estava a correr tudo bem até que decidi ler uma entrada analogica.
Descobri este código na internet
#include <16F877.H>
#device adc=10
#include <STDLIB.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock= 8000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
//============================
void main()
{
int16 adc_value;
float volts;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
delay_us(20);
while(1)
{
output_high(pin_b2);
printf("Ola");
delay_us(10);
adc_value = read_adc();
volts = (float)(adc_value * 5)/1023.0;
printf( "%3.2f \n\r", volts);
printf("A/D value = %2x\n\r",adc_value );
delay_ms(500);
output_low(pin_b2);
printf("Fui");
delay_us(10);
}
}
Supostamente devolve o valor em volts e tambem o valor em decimal.
Digo supostamente porque não consigo obter nenhuns valores.
Coloquei um led a piscar e fiz uns printf() para ver se ele se mexia e nada, limita-se a acender o led e não envia informação nenhuma.
Estarei a esquecer-me de alguma coisa?
Cump
-
De onde vêm as funções para brincar com o adc?
Não falta nenhum include?
-
Boas
Segundo a ajuda da função não falta nenhum #include
Já lá está o #include<STDLIB.H>
As funções setup_adc_ports(); setup_adc() e set_adc_channel() servem para iniciar a leitura adc.
Não tenho a certeza, mas por aquilo que li, não falta nada, mas supostamente deveria dar.
Por isso a minha duvida. Onde estará a falhar?
cump
-
Este codigo foi feito para o ccs
#include <16F877A.H>
#device ADC=10
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 20000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
void main()
{
int16 a;
float v;
printf("Teste adc\r");
setup_adc_ports(all_analog);
setup_adc(ADC_CLOCK_INTERNAL);
while(1)
{
set_adc_channel(1);
delay_ms(150);
a=read_adc();
printf("a=%ld ",a);
v=(a*5.0/1023);
printf("v=%3.2f\r",v);
delay_ms(200);
}
}
-
Boas
Obrigado Jagsilva funciona 5* e pelo que vi bastava colocar a função setup_adc_channel dentro do loop.
Experimentei ligar a 0v e deu a=0 v= .00 e depopis a 5v e deu a=1023 v=5.00.
Depois tentei ligar o famoso QTR-8RC e deu-me sempre 0v não percebo porque?
Liguei a saida 1 do sensor directamente ao pino AN1 do PIC. A ligação está bem feita?
Como estou a utilizar PIC não consigo utilizar as bibliotecas que a polulu disponibiliza não é?
Agradecia que dessem umas luzes.
Cump
-
Confesso que não conhecia o "famoso".
No entanto o nosso amigo google encaminhou-me para o sitio certo e estive a passar os olhos no datasheet. Pelo que vi para ler o sensor usas um entrada digital e contas o tempo que a saída está activa. A saída do sensor não é analógica.
jagsilva
-
Boas
Pois tambem vi isso, mas pelo que vejo aqui no forum com o arduino eles ligam o sensor a uma entrada analogica e conseguem retirar valores analogicos (ex: Robo busca e salvamento), mas a polulu disponibiliza umas bibliotecas para o arduino com funções especificas.
Tambem fiz a experiencia de ligar um led ao pino 1 do sensor e ele tem um comportamento analogico, por isso acho que devo estar a liga-lo mal ao PIC, mas tambem não sei como ligar de outra maneira.
Em relação a ligar este sensor a pino digital já o consegui ligar com sucesso com a ajuda dos membros do forum.
Cump
-
Isso deve ser o pior sensor do mundo, é gente em tudo quanto é forum a atrofiar para o meter a trabalhar seja com o que for.
Mostra ai o teu esquema de ligações.
-
Boas
Aqui está o esquema de ligações.
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fa.imageshack.us%2Fimg143%2F7335%2Fqtr8rcpic16f877.png&hash=a85796e375864bbe53193d6d8329f98b0d575165) (http://img143.imageshack.us/i/qtr8rcpic16f877.png/)
Uploaded with ImageShack.us (http://imageshack.us)
-
Boas
É assim que vocês ligam ao arduino?
cump