LusoRobótica - Robótica em Português
Software => C/C++ => Tópico iniciado por: paulogudes em 04 de Janeiro de 2012, 20:12
-
Preciso acender uma sequencia de 7 leds com delay de 500ms que estão na porta b ao precionar uma chave e assim que VOLTAR a precioná-la, apagá-los na sequência inversa á que foram acesos.O pic que estou usando é o 16f873 Alguém pode me ajudar? Desde já agradeço
-
Quais são as duvidas em concreto que tens? O que é que já experimentaste fazer? Tens alguma experiência na programação de microcontroladores?
-
Um botão chega perfeitamente para isso, e o código é tambem muito simples, já tentas-te começar a escrever alguma coisa?
É que isto aqui não é os discos pedidos, e ninguem te vai dar um programa completo só porque sim, mostra o que já fizeste, e nós ajudamos-te a completar o teu programa.
-
Entendi. Bom segue o que consegui fazer
#INCLUDE 16F887.H
#USE DELAY(CLOCK=8000000)
#FUSES HS, NOWDT, PUT, BROWNOUT, NOLVP
#USE FAST_IO(B)
#USE FAST_IO(D)
VOID MAIN()
{
SET_TRIS_B(0B00000001);
SET_TRIS_D(0B00000000);
OUTPUT_D(0B00000000);
WHILE(TRUE)
{
IF(!INPUT(PIN_B0))
{
OUTPUT_TOGGLE(PIN_D0);
DELAY_MS(500);
OUTPUT_TOGGLE(PIN_D1);
DELAY_MS(500);
OUTPUT_TOGGLE(PIN_D2);
DELAY_MS(500);
OUTPUT_TOGGLE(PIN_D3);
DELAY_MS(500);
}
}
}
-
Olá paulogudes,
antes de mais, k compilador é esse?
eis a minha ideia:
porque nao crias uma tabela onde tens a sequência dos leds a acender.
depois fazes por exemplo
PORTD=tabela[ i ];
quanto ao subir e descer era só incrementar ou decrementar o i (com as devidas proteções de máximos e minimos).
podes usar um timer, porque se não, só podes verificar o estado do botão de 500 em 500 milisegundos.
por outro lado como o botão esta ligado ao RB0 podes usar a interrupção externa.
Cumps, Mauro.
-
Estou usando o copilador ccs e quanto a esta tabela, me parece interessante. Como posso criá-la e usar já que a desconhecia até esta momento? Fico até constrangido pq apesar estar me interessando muito esta linguagem, ainda tenho muito a aprender.
-
a tabela é simples é algo do género
unsigned char tabela[4]; em que 4 é o numero de elementos
depois podes inicializar com por exemplo
tabela[0] = 0b00000001;
tabela[1] = 0b00000010;
tabela[2] = 0b00000100;
tabela[3] = 0b00001000;
pelo que percebi é só um led (nao mantem acesos os anteriores) outra opção é fazeres shifts:
por exemplo
PORTD=0b00000001;
while(1){
PORTD=PORTD<<1;
}
isto não é para ser um programa funcional nem coisa que se pareça, mas pode-te dar ideias, existe shift para a esquerda e para a direita.
Cumps, Mauro.
-
Nossa! Muito bom mesmo. E no caso da chave, como posso usá-la tanto pra acender quanto pra apagar neste caso?
-
nao percebi Paulo, podes reformular sff?
-
Sim, como posso usar o botão ligado a PORTB0 tanto pra acender quanto pra apagar os leds?Pode me dar um exemplo?
-
A primeira coisa que deves fazer antes de começar a programar é pegar numa folha de papel ou abrir o notepad ou o que gostares mais e pensares como é que o teu programa tem de funcionar, neste caso será algo assim:
inicio de loop infinito
ler botão e usar uma variavel para guardar o ultimo estado dos leds, se era acender ou apagar
se (acender)
acende
se não apaga
voltar ao inicio do loop infinito
-
Obrigado pela ajuda e em especial pela paciência. Me ajudou muito
-
Consegui resolver e esta funcionando 100%. Obrigado pela ajuda e agradeço os esclarecimentos. me ajudaram muito
-
Ainda bem Paulo, já agora, qual a solução implementada?
Cumps, Mauro.
-
Na verdade era bem mais simples que imaginei. Apenas criei uma variável y e dei o valor "0" a ela. As condições eram, "se B0 for "0" e y for "0" os leds deverão se acesos sequencialmente a partir de D0 e fazer y=1 e se B0 for "0" e y for "1" os leds deverão se apagar sequencialmente a partir de D0 e fazer y=0." Sei que pra vcs que tem muita esperiência com isso é moleza, mas confeso que foi meio complicado pra mim com 2 semanas de curso. Valeu pela ajuda