Sou completamente novo no mundo dos microcontroladores PIC e da engenharia elétrica, por isso, vá com calma :)
De qualquer forma, consegui programar meu PIC 16f627 para ligar três LEDs quando o botão (botão gatilho) é pressionado e iniciar uma sequência de desligamento (basicamente cada LED desliga um após o outro com um atraso de 5 segundos no meio) quando outro botão é pressionado. pressionado (botão de reset). Tenho testado isso no quadro de programadores / experimentações P80 K8048 da Velleman. Os PINs RA0 e RA2 são as entradas dos botões de acionamento e redefinição, respectivamente, enquanto os pinos RB0, RB1 e RB2 são os pinos de saída dos LEDs.
Trabalhar com o painel de experimentação é ótimo, mas eu quero mudar isso para um circuito real. O problema é que não tenho idéia por onde começar. Comprei 3 LEDs (3,3 Volts cada), alguns botões e fios e construí o seguinte circuito:
(desculpe pelo esquema horrendo)
No circuito que construí, testei pela primeira vez para ver se os LEDs funcionariam com 3 pilhas AA de 1,5 volts e funcionaram bem, então imaginei que resistores não seriam necessários.
Isso não funciona, no entanto, e estou totalmente perdido. Para referência, aqui está o meu código para o PIC. É escrito em C usando MikroC. Funciona no painel de experimentação, então não acho que seja um problema
void main() {
TRISB.RB0 = 0;
TRISB.RB1 = 0;
TRISB.RB2 = 0;
PORTB.RB0 = 0;
PORTB.RB1 = 0;
PORTB.RB2 = 0;
CMCON = 0x07;
TRISA = 255;
for(;;){
if(PORTA.RA0 == 1 && PORTB.RB0 == 1 && PORTB.RB1 == 1 && PORTB.RB2 == 1){
delay_ms(5000);
PORTB.RB0 = 0;
delay_ms(5000);
PORTB.RB1 = 0;
delay_ms(5000);
PORTB.RB2 = 0;
}
if(PORTA.RA2 == 1){
PORTB.RB0 = 1;
PORTB.RB1 = 1;
PORTB.RB2 = 1;
}
}
}
Qualquer ajuda seria muito apreciada. Obrigado!
fonte
Respostas:
Primeiro, você sempre precisa de resistores em série com os LEDs quando acionados a partir de uma fonte de tensão (por exemplo, bateria, alimentação CC, etc.)
Isso ocorre porque os LEDs têm uma curva IV não linear, que parece uma alta impedância até a tensão limiar do O LED aumenta muito acentuadamente, o que significa que, com uma ligeira mudança de tensão, a corrente muda muito, tornando quase impossível definir a corrente para um valor estável dessa maneira.
Ao usar os resistores da série de valores corretos, você garante que a corrente não possa subir o suficiente para danificar o LED.
Para calcular o valor do resistor, você precisa conhecer a tensão direta do LED (Vf) e subtrair Vf da tensão de alimentação e dividir pela corrente desejada, por exemplo, para uma fonte de 5V, 2V Vf e 15mA:
(5V - 2V) / 0,020A = 200Ω (o valor padrão de 220Ω serve - se você não tiver isso, procure algo entre 150Ω e 600Ω para uma faixa de 20mA a 5mA)
Isso pressupõe um LED típico de 5 mm ou 3 mm Corrente operacional máxima de 20mA.
Embora esteja escrito "Bateria de 3 x 1,5V em série" no esquema, as baterias parecem estar conectadas em paralelo. Para confirmar, é necessário conectar as baterias ponta a ponta, como no diagrama inferior desta imagem:
Você precisa desacoplar os capacitores presentes entre o microcontrolador Vdd e o terra. Não vou entrar em detalhes (pesquise aqui, existem muitas boas respostas sobre esse assunto), mas eles basicamente fornecem ao microcontrolador uma reserva de energia local de baixa impedância para demanda de corrente de alta frequência, que a fonte de alimentação não pode responder rapidamente o suficiente.
Idealmente, você deve colocar um (cerâmica de 100nF ou 1uF é bastante padrão) entre os pinos de alimentação e terra, o mais próximo possível dos pinos.
Verifique se você está usando o oscilador interno se não houver cristal presente. Seu código não mostra as configurações do bit de configuração. Se você as deixou de fora, é necessário adicioná-las para garantir que o microcontrolador esteja configurado corretamente. O manual do CCS deve informar como fazer isso. Também nos bits de configuração, verifique se o Watchdog Timer está desativado; caso contrário, seu micro será redefinido continuamente (a menos que você chame o comando WDT clear regularmente)
Verifique se os LEDs estão na posição correta.
Verifique se o pino do MCLR está alto, caso contrário, seu PIC será mantido em redefinição (a menos que você desligue o MCLR nos bits de configuração). Isso geralmente é feito com um resistor para Vdd, com valor em torno de 10kΩ. A folha de dados terá um exemplo disso na seção de redefinição. (obrigado a ajs410 por mencionar isso)
fonte
Eu recomendo o livro da série O'Reilly "Designing Embedded Systems", de John Catsoulis, para alguém em sua posição. Há um capítulo "Eletrônica 101" que o levará à velocidade funcional rapidamente e outro na construção prática.
fonte
Não exceda 5V, seu PIC pode se queimar acima do nível de tensão de 5V. Você pode usar baterias de 9V ou adaptador AC / DC com um regulador de tensão linear como o LM7805 para produzir 5V para o seu circuito. Como ligar:
http://stuff.nekhbet.ro/2006/06/18/how-to-build-a-5v-regulator-using-78l05-7805.html
Como quase tudo dito: Não esqueça de fornecer ao pino MCLR um resistor serial. Você pode usar a configuração pull-up para redefinir seu PIC. Aqui está o link para o esquema: http://www.mcuexamples.com/push-buttons-and-switch-debouncing-with-PIC.php
Sempre use um resistor serial antes de um led. Isso evita que o led seja queimado e diminui o consumo de energia. Para 3.3V leds 220 ou 330 ohms seria bom.
fonte
A função do botão é simples. Quando pressionamos um botão, dois contatos são unidos e a conexão é feita. Ainda assim, não é tão simples assim. O problema está na natureza da tensão como dimensão elétrica e na imperfeição dos contatos mecânicos. Ou seja, antes que o contato seja feito ou cortado, há um curto período de tempo em que a vibração (oscilação) pode ocorrer como resultado de irregularidades dos contatos mecânicos ou como resultado da velocidade diferente de pressionar um botão (isso depende pessoa que aperta o botão). O termo dado a esse fenômeno é chamado DESEMBOLSO DE INTERRUPTOR (CONTATO). Se isso for ignorado quando o programa for gravado, poderá ocorrer um erro ou o programa poderá produzir mais de um pulso de saída para um único pressionamento de botão. Para evitar isso, podemos introduzir um pequeno atraso quando detectamos o fechamento de um contato. Isso garantirá que o toque de um botão seja interpretado como um único pulso. O atraso de debounce é produzido em software e a duração do atraso depende do botão e da finalidade do botão. O problema pode ser parcialmente resolvido com a adição de um capacitor no botão, mas um programa bem projetado é uma resposta muito melhor. O programa pode ser ajustado até que a detecção falsa seja completamente eliminada. A imagem abaixo mostra o que realmente acontece quando o botão é pressionado. O programa pode ser ajustado até que a detecção falsa seja completamente eliminada. A imagem abaixo mostra o que realmente acontece quando o botão é pressionado. O programa pode ser ajustado até que a detecção falsa seja completamente eliminada. A imagem abaixo mostra o que realmente acontece quando o botão é pressionado.
Leia mais: http://romux.com/tutorials/pic-tutorial/push-buttons#ixzz43cAbVcWR
fonte
Além do que os outros escreveram: não atribua a pinos de saída PIC individuais, como por exemplo "PORTB.RB0 = 1;". Em vez disso, faça a alteração do bit em uma variável do tamanho de byte e, em seguida, grave essa variável na porta.
Você também pode
fonte