Ir ao conteúdo

Indicador de Velocidade com Pic16f84a


james freire

Posts recomendados

Postado

Ola galera,

Achei na internet um trabalho de uns garotos da UNIVERSIDADE DE CAXIAS DO SUL, com o titulo ,"INDICADOR DE VELOCIDADE", neste documento eles fornecem um código fonte, que serve para calcular a velocidade do móvel que passa por 2 sensores fotoelétrico.

Comecei a montar este sistema para ser usado no meu projeto da faculdade "carrinho com propulsão elástica", quero medir a velocidade desse meu carrinho, para comprovar com os cálculos. ( com o carrinho tudo bem)

Estou tentando simular no proteus, mas antes de tudo preciso escrever o programa, copilar para depois inserir no pic. Aqui esta o 1º problema, esta dando erro na hora de copilar.

Estou usando o pic-c copiler PCWHD.

veja imagem dos erros abaixo no rodape deste topico.

alguem pode me ajudar a rodar esse projetinho.

valeu galera

james

veja codigo fonte:

[color=Blue]#include <16F84A.h>           			// seleciona o microcontrolador alvo#fuses XT, NOWDT, NOPUT, NOPROTECT   //Seleciona osc CRISTAL, desativa WDT, PUT e PROTECT.#use delay(clock=4000000)     		//Seleciona osc de trabalho do cristal.#include <lcd.c>              			//Inclui biblioteca de manipulação de LCD.long int x, vel;              			//Variáveis 16 bits para contagem.static boolean back;          			//Variável lógico.int y;                        				//Variável 8 bits.
#separatevoid lcd_func()               			//Função de escrita em LCD.{   lcd_putc('\f');        				//Limpa o display.   delay_ms(5);   output_high(pin_a0);       			//Ativa saída RA0.   lcd_gotoxy(2,1);           			//Posiciona cursor em coluna 2 linha 1.   printf(lcd_putc,"%lukm/h", vel);    		//Escreve o valor da variável vel e Km/h.   lcd_gotoxy(2,2);          			//Posiciona cursor em coluna 2 linha 2.   printf(lcd_putc,"%lums", x);        		//Escreve o valor de x e ms.   if(vel > 50)               			//Se vel for maior de 50.      {         output_high(pin_a1); 			//Ativa saída RA1.         lcd_gotoxy(11,2);    			//Posiciona cursor em coluna 11 linha 2.         lcd_putc("<ex>");    			//Escreve "<ex>", como indicador de excesso de velocidade.      }   delay_ms(2000);            			//Aguarda 2 segundos.   vel = 0;                   				//Zera variável vel.   lcd_putc('\f');            			//Limpa o display.   output_low(pin_a1);       			//Desativa saída RA1.   lcd_gotoxy(4,1);           			//Posiciona cursor em coluna 4 linha 1.   lcd_putc("Espera....");    			//Escreve "Espera....".   return;}
#separatevoid le_tecla()               			//Função de leitura de tecla para ativar ou desativar backlight.{   if(!input(pin_a2))         			//Se tecla pino RA2 for pressionada.    {      delay_ms(200);          			//Aguarda 200ms para filtragem de ruído da tecla.      y = input(pin_a2);      		//Verifica se tecla foi realmente pressionada, se for verdadeira, y = 0.      if(y==0)                			//Se y = 0.      {        back = !back;         			//Inverte valor lógico de variável back.        output_bit(pin_b3, back);  		//Carrega saída RB3 com valor de back.        delay_ms(200);        			//Aguarda 200ms.      }   }   return;}
#separatevoid m_temp()		            		//Função de contagem de tempo.{   output_low(pin_a0);        			//Desativa saída pino RAO.   while(input (pin_a4))      			//Enquanto entrada não for acionada.		{      delay_ms(1);            			//Aguarda 1ms.   	x = x + 1;             	 		//Soma 1 em x.      }   vel = 36000 / x;           			//Calculo de velocidade em Km/h.   lcd_func();                			//Chama função de LCD.	return;}
#separatevoid lcd_func1()              			//Função inicial para amostragem de mensagem "Espera....".{   lcd_putc('\f');            			//Limpa o display.   lcd_gotoxy(4,1);           			//Posiciona o curso na coluna 4 linha 1 no display.    lcd_putc("Espera....");    			//Escreve "Espera....".   return;                    				//Retorna para função principal do programa.}
#separatevoid main()                   			//Função principal do programa.{   lcd_init();                				//Inicia a comunicação com LCD.   lcd_putc('\f');            			//Limpa o display.   x = 0;   vel = 0;   y = 0;   lcd_func1();               			//Chama função de amostragem.    while(true)   {      output_high(pin_a0);    			//Ativa pino RA0.      if(!input(pin_a3))      			//Se tecla de pino RA3 for pressionado.      {         x = 0;         m_temp();            			//Chama função de contagem de tempo.      }      le_tecla();             				//Chama função de leitura de tecla backlight   }}[/color]

post-480080-13884957431895_thumb.jpg

post-480080-13884957431895_thumb.jpg

Postado

Opa, bão?

Mais um q aparece e está com a mesmo problema. Vamos lá, copiei seu código e mandei compilar no CCS C. Minha versão é a 4.057. Deu 3 erros.

O problema é que o PIC q você usa, o 16f84A não funciona com a biblioteca LCD.C que vem junto do compilador. Porq? Simples. Se você abrir o arquivo LCD.C observará q ele necessita do PortD para funcionar. E o 16F84A não possui.

Solução? Sim! tenho duas.

1ª) Usar um PIC maior e mais moderno com mais RAM e mais pinos. Desvantagem: você terá q na maioria das vezes adequar seu código ao novo PIC e ele custará mais.

2ª) Usar uma biblioteca LCD diferente, uma q você possa escolher os pinos a serem usados. Onde encontrar uma biblioteca tão versátil? Logo abaixo :D

Modo de usar. Copiar o código abaixo e salvar na pasta Drivers do compilador. Só salvar, não precisa compilar. Uso como LCD_Flex.c. você abre o arquivo lcd_flex.c e muda no inicio do código os pinos de acordo com a sua necessidade. Não se esqueça de fazer um #include <LCD_Flex.c> no seu código.



// These pins are for the Microchip PicDem2-Plus board,
// which is what I used to test the driver. Change these
// pins to fit your own board.

#define LCD_DB4 PIN_B0
#define LCD_DB5 PIN_B1
#define LCD_DB6 PIN_B2
#define LCD_DB7 PIN_B3

#define LCD_E PIN_A1
#define LCD_RS PIN_A3
#define LCD_RW PIN_A2

// If you only want a 6-pin interface to your LCD, then
// connect the R/W pin on the LCD to ground, and comment
// out the following line.

#define USE_LCD_RW 1

//========================================

#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the 2nd line


int8 const LCD_INIT_STRING[4] =
{
0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
0xc, // Display on
1, // Clear display
6 // Increment cursor
};


//-------------------------------------
void lcd_send_nibble(int8 nibble)
{
// Note: !! converts an integer expression
// to a boolean (1 or 0).
output_bit(LCD_DB4, !!(nibble & 1));
output_bit(LCD_DB5, !!(nibble & 2));
output_bit(LCD_DB6, !!(nibble & 4));
output_bit(LCD_DB7, !!(nibble & 8));

delay_cycles(1);
output_high(LCD_E);
delay_us(2);
output_low(LCD_E);
}

//-----------------------------------
// This sub-routine is only called by lcd_read_byte().
// It's not a stand-alone routine. For example, the
// R/W signal is set high by lcd_read_byte() before
// this routine is called.

#ifdef USE_LCD_RW
int8 lcd_read_nibble(void)
{
int8 retval;
// Create bit variables so that we can easily set
// individual bits in the retval variable.
#bit retval_0 = retval.0
#bit retval_1 = retval.1
#bit retval_2 = retval.2
#bit retval_3 = retval.3

retval = 0;

output_high(LCD_E);
delay_cycles(1);

retval_0 = input(LCD_DB4);
retval_1 = input(LCD_DB5);
retval_2 = input(LCD_DB6);
retval_3 = input(LCD_DB7);

output_low(LCD_E);

return(retval);
}
#endif

//---------------------------------------
// Read a byte from the LCD and return it.

#ifdef USE_LCD_RW
int8 lcd_read_byte(void)
{
int8 low;
int8 high;

output_high(LCD_RW);
delay_cycles(1);

high = lcd_read_nibble();

low = lcd_read_nibble();

return( (high<<4) | low);
}
#endif

//----------------------------------------
// Send a byte to the LCD.
void lcd_send_byte(int8 address, int8 n)
{
output_low(LCD_RS);

#ifdef USE_LCD_RW
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60);
#endif

if(address)
output_high(LCD_RS);
else
output_low(LCD_RS);

delay_cycles(1);

#ifdef USE_LCD_RW
output_low(LCD_RW);
delay_cycles(1);
#endif

output_low(LCD_E);

lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}

//----------------------------
void lcd_init(void)
{
int8 i;

output_low(LCD_RS);

#ifdef USE_LCD_RW
output_low(LCD_RW);
#endif

output_low(LCD_E);

delay_ms(15);

for(i=0 ;i < 3; i++)
{
lcd_send_nibble(0x03);
delay_ms(5);
}

lcd_send_nibble(0x02);

for(i=0; i < sizeof(LCD_INIT_STRING); i++)
{
lcd_send_byte(0, LCD_INIT_STRING[i]);

// If the R/W signal is not used, then
// the busy bit can't be polled. One of
// the init commands takes longer than
// the hard-coded delay of 60 us, so in
// that case, lets just do a 5 ms delay
// after all four of them.
#ifndef USE_LCD_RW
delay_ms(5);
#endif
}

}

//----------------------------

void lcd_gotoxy(int8 x, int8 y)
{
int8 address;

if(y != 1)
address = lcd_line_two;
else
address=0;

address += x-1;
lcd_send_byte(0, 0x80 | address);
}

//-----------------------------
void lcd_putc(char c)
{
switch(c)
{
case '\f':
lcd_send_byte(0,1);
delay_ms(2);
break;

case '\n':
lcd_gotoxy(1,2);
break;

case '\b':
lcd_send_byte(0,0x10);
break;

default:
lcd_send_byte(1,c);
break;
}
}

//------------------------------
#ifdef USE_LCD_RW
char lcd_getc(int8 x, int8 y)
{
char value;

lcd_gotoxy(x,y);

// Wait until busy flag is low.
while(bit_test(lcd_read_byte(),7));

output_high(LCD_RS);
value = lcd_read_byte();
output_low(lcd_RS);

return(value);
}
#endif
// flex_lcd.c

Fora o erro do LCD, aqui compilou certinho. Não verifiquei seu código se existem erros.

Falou

Postado

fala Matheus, beleza mano.

Olha so, desculpa, mas acho que não estou nesse nível ainda de criar bibliotecas e tal, tentei mas apareceu 12 erros.

sei que e chato pedir as coisas prontas, mas como você entende bem disso, tem como você quebrar esse galho pra mim, acaba sendo decepcionante pra mim, tento tento tento e nada sai. rs rs rs rs e cruel!!

o único pic que fiz funcionar foi no proteus e ele piscava dois leds. rs rs rs.

Na verdade eu não seu qual pic usar, qual código e como montar o circuito.

como deu certo para os caras la do sul??

quebra essa pra mim Matheus. obrigado!!!!

cara a coisa mais decepcionante e', você tentar fazer algo, e não conseguir. estou pedindo a ajuda de vocês pois não tenho nem ideia de como fazer isso, todos os programas que indicam não funciona, código fonte com erros. não sei pra onde correr.

por favor me ajudem.

qual e o melhor pic para fazer um cronometro??

essa e a minha primeira duvida.

qual a linguagem para escrever um cronometro??

essa e a minha segunda duvida.

qual programa uso para copilar esse pic ou esse código?

essa e a minha terceira duvida.

como deve ser o circuito pra ligação no display?

essa e a minha quarta duvida.

não tenho ideia de que lado ir, tudo que vejo me confunde mais.

valeu

Postado

Na biblioteca LCD.C, basta trocar o pinagem para a porta B antes de incluir a biblioteca.

#define LCD_ENABLE_PIN  PIN_B1            //Define os pinos onde conectaremos o display LCD#define LCD_RW_PIN      PIN_B2#define LCD_RS_PIN      PIN_B3#define LCD_DATA4       PIN_B4#define LCD_DATA5       PIN_B5#define LCD_DATA6       PIN_B6#define LCD_DATA7       PIN_B7
#include <Lcd.c>

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!