LusoRobótica - Robótica em Português
Sistemas específicos => PIC => Tópico iniciado por: Dave em 09 de Outubro de 2010, 22:57
-
Olá a todos!
Sou um iniciante em PIC's e por isso espero que o registo neste fórum me dê uma ajuda nas minhas dúvidas...
Este é o meu problema:
Estou a treinar a minha programação de conversores ADC de PIC's.
Um circuito bastante simples é o de ligar um potenciómetro (como divisor de tensão) e quando a tensão de entrada no PIC é superior a 2,5V liga um led.
Simples... e até funciona no Proteus, mas na realidade não faz nada....
#include <16f88.h>
#device ADC=10
#use delay (clock=20000000)
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT
#use standard_IO (A)
main()
{
int valor;
setup_comparator(NC_NC_NC_NC);
setup_ADC(ADC_CLOCK_INTERNAL);
setup_ADC_ports(64|VSS_VDD);
set_adc_channel(6);
while (true)
{
valor=read_adc(7);
if(valor>500)
output_high(pin_A0);
else output_low(pin_A0);
delay_ms(500);
}
}
Quanto ao Vref (+ e -) não ligo a nada... pelo que penso que o pic "entende" como VSS_VDD.
Deixo aqui a imagem do simulador e os erros mostrados pelo mesmo, embora a simulação avance e consiga fazer o pretendido (acender led quando uma determinada porta está a mais de 2,5V).
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi473.photobucket.com%2Falbums%2Frr100%2Fdaviddmmartins%2Fproteus.jpg&hash=a30fd49f598775aa5e999ee195f9385495b0affe)
Amigos, onde está o meu erro?
Na montagem ou no código?
Alguma solução/explicação para isto?
Como já disse noutros tópicos, estou-me a iniciar com PIC's, mas tenho vontade em aprender mais!
PS: O compilador utilizado é o CCS.
Obrigado.
Cumps
-
Onde é que defines o tempo de aquisição/conversão ?
-
Peço desculpa, o código em cima não é o correcto...
Este é:
#include <16f88.h>
#device ADC=10
#use delay (clock=20000000)
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT
#use standard_IO(A)
void main()
{
int16 valor;
setup_ADC(ADC_CLOCK_DIV_64);
setup_ADC_ports(64);
set_adc_channel(6);
delay_ms(1);
while (true)
{
valor=read_adc();
delay_ms(10);
if(valor>500)
{
output_high(pin_A0);
delay_ms(100);
}
else output_low(pin_A0);
delay_ms(250);
Agora o problema é que só funciona tudo se tiver a tocar com o dedo na parte descarnada no fio positivo ou do fio negativo da fonte de alimentação.
Como fonte utilizo um circuito da velleman que mediante um potenciómetro permite-me variar a tensão de saída...
Para filtrar tenho na placa um condensador de 1uF, mas mesmo assim continua tudo sem funcionar... só quando toco com o dedo nos ditos fios....
Quando coloco simplesmente led's a piscar, tudo funciona bem sem grandes preocupações..
cumps
-
Será alguma coisa relacionada com os fuses?
Estou mesmo pasmado com isto...
cumps
-
Nao sei se sera o lugar indicado ... mas tenho uma duvida no proteus ... eu executo um programa blink normal ... mas demora muito a piscar...
-
Amigo, no meu funciona bem.... que tempos está a usar no pisca-pisca?
hug
-
Nao sei se sera o lugar indicado ... mas tenho uma duvida no proteus ... eu executo um programa blink normal ... mas demora muito a piscar...
Muitas vezes o proteus não corre em tempo real. Se la vires no proteus tens la um stopwatch.
Tens que te guiar por isso e nao pelo tempo que te parece a ti. Se leres os warnings do proteus, ele diz que não está a correr em tempo real devido a carga do cpu.
-
Mas ta ... so que o led nao me faz blink de 1 em 1 segundo ... demora
-
Na pasta exemplos do CCS tens lá exemplos de como configurar e usar a adc, usa esse programa e vê se funciona.
Estás a dar 5 volts estaveis ao teu micro, quanto ao Vref acho que o melhor é leres o datasheet do micro para saber como e onde o deves ligar para tudo funcionar.
-
OK. Vou experimentar.
No entanto, penso que algo se passa com a minha placa de testes... porque tudo funciona bem, mas só se o meu dedo estiver a tocar no circuito (polo positivo, polo negativo, AN6, reset, ...).
cumps
-
Mais uma conclusão...
Se ligar um fio do pólo negativo à chapinha protectora da breadboard (placa que fica na base) fica a funcionar bem... do que será isto? Haverá algum tipo de "carga" na placa que está a causar isto?
Curioso....
PS: AHAHAAH e não é que está a funcionar mesmo!!! Já desmontei e montei tudo outra vez e só funciona se o fio estiver ligado à chapa na base da placa de testes ;D :o :o
hug
-
Mostra o circuito em schematic...
-
Cá está.
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi473.photobucket.com%2Falbums%2Frr100%2Fdaviddmmartins%2Fproteus-1.jpg&hash=ef9c2261ac9a00b5aad84e19a09a50206bfe6297)
hug
-
troca de protoboard... daquelas só de plastico
temos q trabalhar com boas ferramentas, pq senao não sabemos se é do rabo ou das calças ;D
-
troca de protoboard... daquelas só de plastico
temos q trabalhar com boas ferramentas, pq senao não sabemos se é do rabo ou das calças ;D
Passo a explicar o motivo de tanta admiração da minha parte...
A minha placa é igual à da imagem. Muitos aqui devem ter uma igual... e por baixo tem uma película que cola e só depois a tal chapa...
Já me certifiquei e nada faz contacto com com essa chapinha... para isso o plástico da breadboard tinha de estar furado, assim como a fita aderente para depois algo tocar na base da placa.
O circuito está a funcionar... mas de tirar o fio que está a fazer contacto ente o pólo negativo da placa e a chapinha da base o circuito para, embora tenha alimentação....
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.scitoyscatalog.com%2FMerchant2%2Fgraphics%2F00000001%2Fsolderless_breadboard_300.jpg&hash=2e5cda4f54a22bc16b4389cdbdca207bbd841eff)
-
isso leva-me a crer q o PIC está com "antenas"... e por antenas eu quero dizer com pinos de entrada ligados a nada....
confirma isso...
-
floating? Tambem pareceme
-
isso leva-me a crer q o PIC está com "antenas"... e por antenas eu quero dizer com pinos de entrada ligados a nada....
confirma isso...
Quem sabe sabe!
Liguei todos os pinos não utilizados ao pólo negativo e... já está! Está tudo a funcionar bem e o meu dedo já não faz interferência com nada ;D ;D ;D ;D ;D.
Mais uma questão, esta é a forma correcta de configurar os pinos de saída no CCS?
OUTPUT_A(40|41|42|43|44|45|46|47);
OUTPUT_B(48|49|50|51|52|53|54);
Ou será algo deste tipo:
set_TRIS_A(0b10100011);
;)
-
Resolvido...
Obrigado a todos ;D ;D ;D
Cumps
-
Já experimentaste colocar 2 condensadores de 22pf do cristal à massa? (1 para cada pino)
-
Já experimentaste colocar 2 condensadores de 22pf do cristal à massa? (1 para cada pino)
Os condensadores já lá estão.... a situação ficou resolvida ;).
cumps