Ir ao conteúdo
  • Cadastre-se

PIC16F628A- Gravador de Sequências


Posts recomendados

Boa noite a todos. Estou realizando um projeto com o pic16f628a e na simulação (no  proteus) funciona de acordo com o esperado. Porém, ao montar o circuito físico, notei que a porta 10 do pic precisou ser aterrada para que funcionasse de acordo com o esperado. Não sei explicar o porque desta situação. Alguém pode me ajudar? Desde já sou grato! Peço perdão pela desorganização, ainda estou comentando o código. Abraços!

Segue a função principal:

 

 

void main()
{
 TRISA= 1;
 PORTA=0;
 TRISB = 0B00000001;
 PORTB = 0x00;
 CMCON=7; //comparadores Desativados
 INTCON.GIE = 1;
 INTCON.PEIE = 1;
 INTCON.INTE = 1;
 INTCON.TMR0IE = 1;
 OPTION_REG.INTEDG = 1;
 OPTION_REG = 0b10000001;
 TMR0 = 0;

 while(1)
 {
   record();
   play();
 }
}

 

 

Link para o comentário
Compartilhar em outros sites

Coloquei como saída, apanas o RB0 como entrada. Lembrando que no simulado está correto. Apenas no Físico que tenho que aterrar o Rb4 para que funcione. 

segue o código completo:

 


int i=0,j=0,k=0, l=0;                            // Variáveis incrementais dos contadores
int vetor[10];                                  // Declaração do vetor que armazena a sequencia das entradas

void temp1()
{
    contagem = 0;
    while (contagem <= 1000)
    {
    }
}
void temp2()
{
    contagem = 0;
    while (contagem <= 500)
    {
    }
}
void limpavetor()
{
i=0;
j=0;
k=0;
l=0;

for (l=0;l<=9;l++)
{
    vetor[l] = 0;
}
}

void interrupt()                            // Função de interrupção
{
    if(INTCON.TMR0IF ==1)
    {
      contagem++;                             //para cada interrpção do TMR0 incrementa a variável contagem
      TMR0 = 0;
      INTCON.TMR0IF = 0;                      //limpa o overflow.
    }

    if(INTCON.INTF == 1)                  // Verificação de nível lógico alto da porta RB0(flag INTF)
    {
      limpavetor();
      portb.rb6 = 1;
      delay_ms(1000);
      portb.rb6 = 0;
      INTCON.INTF = 0;
    }
}

void record()
{
    limpavetor();
    while (porta.ra4 != 1)
    {
      if(porta.RA1== 1 )
      {
         while(porta.RA1==1)
         {
         }
         vetor= 10;
         i=i+1;
         temp2();
  //delay_ms(500);
       }
      if(porta.RA2== 1 )
      {
         while(porta.RA2 == 1)
         {
         }
         vetor= 20;
         i=i+1;
         temp2();
  //delay_ms(500);
       }
       if(porta.RA3 == 1)
       {
         while(porta.RA3 == 1)
         {
         }
         vetor=30;
         i=i+1;
         temp2();
  //delay_ms(500);
       }
    }
}
void play()
{
    portb.rb5 = 1;
    temp1();
    portb.rb5=0;
    temp1();
    for(j = 0;j <= 9;j++)
    {
        if(vetor[j] == 10)
        {
          portb.rb1=1;
          temp1();
          portb.rb1=0;
          temp1();
        }
        if(vetor[j] == 20)
        {
          portb.rb2=1;
          temp1();
          portb.rb2=0;
          temp1();
        }
        if(vetor[j] == 30)
        {
          portb.rb3=1;
          temp1();
          portb.rb3=0;
          temp1();
        }
    }
        limpavetor();
}

void main()
{
 TRISA= 1;
 PORTA=0;
 TRISB = 0B00000001;
 PORTB = 0x00;
 CMCON=7; //comparadores Desativados
 INTCON.GIE = 1;
 INTCON.PEIE = 1;
 INTCON.INTE = 1;
 INTCON.TMR0IE = 1;
 OPTION_REG.INTEDG = 1;
 OPTION_REG = 0b10000001;
 TMR0 = 0;

 while(1)
 {  
   record();
   play();
 }
}

Link para o comentário
Compartilhar em outros sites

Agora já to com dúvida no teu código uhauhauhaahu

Coloquei aqui no mkroC Pro e está dando erro em "contagem" pois não foi declarado. Resolvi declarando no início ele como int.

Depois está dando Asssigning to non-lvalue para "vetor=10;", "vetor=20" e "vetor =30".

 

Realmente você colou rb0 como entrada e o resto da porta B como saída.

 

Sobre o circuito:

Não estou vendo erro. Só falta ver teu circuito real... 

adicionado 4 minutos depois

@Raphael Nazário

Aqui um projeto Parecido com o teu.

AQUI

 

Pelo que to vendo tem que ter uma referencia e um positivo ... acho que não teve referencia no teu circuito e quando você colocou o pino você conseguiu isso...

adicionado 55 minutos depois

@Raphael Nazário

Acho que achei a resposta

 

"The PIC16F628A has a PGM pin that it uses in LVP (Low Voltage Programming) mode. It shares the same pin as RB4. The PGM pin must be tied to ground under normal operation and pulled high during programming (your programmer should pull it high during a programming sequence). If the PGM pin is left floating, the chip will randomly reset for no explicable reason. Or just not run at all."

 

FONTE

 

Então o pino 10 tem que estar aterrado ou em valor alto se não corre o risco de dar resete randomicamente.

 

 

Link para o comentário
Compartilhar em outros sites

Adicionando finalmente esse PGM não está nessa simulação... só achei porque dei uma pesquisada na net sobre esse pic. Então pela simulação não dá para achar nada estranho mesmo ^^

Enfim.... boa tarde ^^ e fuizzzzzzzzzzzzzzzzz

Link para o comentário
Compartilhar em outros sites

Bommu, muito obrigado pela ajuda e por ter achado a explicação! Muito obrigado mesmo. 
Então é isso mesmo, tenho realmente que aterrar o pino 10! Independente do proteus estar funcionando ou não.
Novamente, Grato pela Fineza.
Abç

 

adicionado 1 minuto depois
3 horas atrás, Bommu Perneta disse:

Agora já to com dúvida no teu código uhauhauhaahu

Coloquei aqui no mkroC Pro e está dando erro em "contagem" pois não foi declarado. Resolvi declarando no início ele como int.

Depois está dando Asssigning to non-lvalue para "vetor=10;", "vetor=20" e "vetor =30".

 

Realmente você colou rb0 como entrada e o resto da porta B como saída.

 

Sobre o circuito:

Não estou vendo erro. Só falta ver teu circuito real... 

adicionado 4 minutos depois

@Raphael Nazário

Aqui um projeto Parecido com o teu.

AQUI

 

Pelo que to vendo tem que ter uma referencia e um positivo ... acho que não teve referencia no teu circuito e quando você colocou o pino você conseguiu isso...

adicionado 55 minutos depois

@Raphael Nazário

Acho que achei a resposta

 

"The PIC16F628A has a PGM pin that it uses in LVP (Low Voltage Programming) mode. It shares the same pin as RB4. The PGM pin must be tied to ground under normal operation and pulled high during programming (your programmer should pull it high during a programming sequence). If the PGM pin is left floating, the chip will randomly reset for no explicable reason. Or just not run at all."

 

FONTE

 

Então o pino 10 tem que estar aterrado ou em valor alto se não corre o risco de dar resete randomicamente.

 

 

Valeu mesmo! 

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...