Ir ao conteúdo
  • Cadastre-se

Problema com programa p/ pic usando Mikroc.


aparecido-abg

Posts recomendados

Oi pessoal, estou fazendo um programa baseado no que está nesse link http://microcontrolandos.blogspot.com.br/2012/12/timer-utilizando-o-pic16f628a.html que utiliza um display lcd.

O display e os contadores estão funcionando corretamente, porém os pinos RA2 e RA3 ficam em nivel 1 depois que aciono as chaves correspondentes e não baixam o nivel, somente se reseto o pic. A saida RB6 não sobe o nível quando o valor da variavel encoder fica igual ou maior a variavel espiras.

Configurei algo errado ou é problema no código? O oscilador interno está configurado corretamente.

Segue abaixo o código:


// pinos do LCD
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

//VARIAVEIS
int velocidade;
char espiras, espiras2[4], encoder, encoder2[4];
bit start,incrementa,incrementa1,esquerda;


void main() {
//CONFIGURAÇÃO DOS REGISTROS
cmcon=0x07; // desabilita comparadores de tensão
intcon=0x00; // desabilita interrupções
CMCON =0b00000111
OPTION_REG=0b00000001; //configura timer0( prescaler 1:4 )
TRISA=0b00000011; //0 saida e 1 entrada
TRISB=0b11111110; //0 saida e 1 entrada
PORTA = 0x00; //Inicializa as portas
PORTB = 0x00; //Inicializa as portas


espiras=1;
encoder=0;
incrementa=0;
incrementa1=0;
esquerda=0;

//DEFINIÇÃO DE VALOR DAS VARIÁVEIS
//BITS DE STATUS
start=0;

Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
delay_ms(100);

while(1){

ByteToStr(espiras,espiras2);
ByteToStr(encoder,encoder2);

Lcd_Out(1, 1, "Espiras:");
Lcd_Out_Cp(espiras2);
Lcd_Out(2, 1, "Encoder:");
Lcd_Out_Cp(encoder2);

//--------------------------------------------------
//Botão espiras
if(PORTA.F2 == 1) //condição do botão 1
{
if(incrementa == 0)
{
espiras++;
incrementa=1;
}
}
else
{
incrementa=0;
} // end if


//--------------------------------------------------
//Leitura do encoder
if(PORTA.F3 == 1) //condição do botão 1
{
if(incrementa1 == 0)
{
encoder++;
incrementa1=1;
}
}
else
{
incrementa1=0;
} // end if


//--------------------------------------------------
//Compara se ja fez todas espiras
if(encoder >= espiras) //condição do botão 1
{
PORTB.F6 = 1; //se entrada falsa então led apaga
PORTA.F7 = 1; //se entrada verdadeira então led acende
}
else
{
PORTB.F6 = 0; //se entrada falsa então led apaga
PORTA.F7 = 0; //se entrada verdadeira então led acende
} // end if


//--------------------------------------------------
} //end while
} //end void main

Obrigado, até mais.

Link para o comentário
Compartilhar em outros sites

Amigo que PIC esta usando?? O mesmo do projeto(628A)?

De cara o que posso te dizer é que TODOS os pinos do portB exceto RB0 estão configurados como ENTRADA assim não dá para setar um pino configurado como entrada...hehe... Quanto ao port A não se esqueça que ele é Dreno Aberto, precisa de pull-up reveja a configuração para desabilitar o AN e os fuses (pois notei que você esta usando pinos que são usados para colocar o cristal ressonador, isso só é possível se você usar o Oscilador interno do PIC)...

Outra coisa, notei que você usa o comando Lcd_out_CP(); e se não me engano essa função escreve na posição atual do cursor do LCD (o mesmo cursor que você desabilitou no inicio do programa?).

Espero ter ajudado, Grato Luiz Gustavo.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para 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...