Como conectar um microcontrolador PIC?

8

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:

O 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!

Shahmeer Navid
fonte
3
Por favor, por favor, use Fritzing . É gratuito, faz 90% do trabalho para você, e permite que os diagramas esquemáticos mais fácil de ler ..
Ignacio Vazquez-Abrams
7
Eu acho que ter uma conta por 10 dias e essa é a primeira pergunta de Shahmeer é uma desculpa para "despejar lixo como esse em nós". Certamente, a abordagem de Ignacio de pedir bem é mais provável de obter uma resposta positiva do que repreender o novo cara ... a menos que seu objetivo seja impedir que novas pessoas fiquem por perto.
precisa saber é
5
@ ajs410 - todos sabemos que essa é a irritação de Olin e, embora eu nem sempre concorde com o texto dele, concordo com o princípio dele. O fato de o OP pedir desculpas pelo horrendo (suas próprias palavras) "esquemático" significa que ele sabe bem que não está bem. Então, por que ele ainda publica essa coisa? Para mim, não precisa ser criado pela EDA, acho que prefiro ver um desenho de bloco e lápis.
Stevenvh
2
Ele é novo, como muitos outros novos membros aqui (inclusive eu). Dá um tempo. Shahmeer, experimente Fritzing. É agradável e fácil de usar, e ajudará você a explicar melhor sua pergunta. Em outra nota, sou contra a escolha de palavras de Ignacio.
capcom

Respostas:

11
  1. 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.

  2. 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:

    Conexões paralelas e em série

  3. 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.

  4. 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)

  5. Verifique se os LEDs estão na posição correta.

  6. 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)

Oli Glaser
fonte
Muito obrigado pelos comentários, eles foram realmente úteis. Todos esses aspectos, no entanto, eu deveria ter conectado o PIC de alguma outra maneira ou as adições listadas são tudo o que preciso?
Shahmeer Navid 30/08/2012
2
Outra coisa é que você provavelmente precisa de resistores de pulldown nos pinos dos botões, para garantir que o pino esteja na lógica baixa quando o botão não for pressionado (a menos que você tenha pulldowns internos, mas acho que o PIC só terá pullups disponíveis). difícil ter certeza das coisas com o esquema como ele é (por exemplo, símbolos fora do padrão, sem números / nomes de pinos, etc.) eu pegaria algum software de captura de esquemas / PCB (por exemplo, Eagle [popular / gratuito para não comercial], Kicad [popular / gratuito], Diptrace [barato], Altium [££££ 's, etc) e use isso no futuro.
Oli Glaser
1
6. Não se esqueça de um resistor pull-up no pino MCLR. Ou defina o bit de configuração que usa a pull-up interna, se disponível.
precisa saber é
2

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.

Scott Seidman
fonte
2
  1. 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

  2. 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

  3. 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.

Martelos
fonte
2

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

John
fonte
1

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

  • Acredite em mim,
  • leia sobre o problema "ler-modificar-gravar" ou
  • sofrer as consequências
Wouter van Ooijen
fonte