Ajuda com Programa em pic c compiler

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Ajuda com Programa em pic c compiler

Mensagempor macs » 09 Jun 2011 15:50

Boa tarde Pessoal.

Estou tentando compilar um programa em C para o Pic 16F628A de um site em espanhol, mas o mesmo da vários erros.
Não entendo de linguagem C, mas já deu para perceber que falta O que colocar nos INCLUDES. Também já observei que a necessidade de mudanças de pinos na biblioteca LCD.C.
Mesmo incluindo o Pic e, incluindo os drivers lcd.c e kbd.c, fazendo as alterações, ainda da erros como, por exemplo: undefined identifier ..lcd_enviar.
Ficaria grato se alguém pudesse ajudar.

Abraços.

Sergio.


O programa segue abaixo e o link do programa é esse: http://www.micropic.es/index.php?opt...ctos&Itemid=62


Programa:

// Debe recordarse que las líneas RA0-RA2 actúan ahora como salida de señales de control
// hacia el LCD. Al estar conectadas con sendos interruptores en la MicroPIC Trainer,
// estos deben estar a nivel lógico "1" permanentemente, es decir en la posicion
//marcada como 0 en la placa
//Datos del LCD conectado al puerto B
// Teclado conectado al puerto B: Columna 0,1,2 a B5,B6 y B7. Fila 0,1,2 y 3 a B1, B2,B3 y B4
//RA3 conecto la salida para el motor. En un principi funciona como salida de enable. Se puede
//estudiar posibilidad de implementar un control PWM para la velocidad.
//RA4 entrada para el Timer0
#include
#include




#FUSES NOWDT //No Watch Dog Timer
#FUSES XT
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT
#use delay(clock=4000000)

#use fast_io(A)
#use fast_io(B)

#include
#include

#bit puertoA3 = 5.3 //Usado para control on/off motor

void menu1(void);
void menu2 (void);
int16 contar(void);
int16 introducir_valor(void);

char cadena1[]={"\f1-Contar Vuelt\n2-Introd. Vuelt"};
int desbordamiento=0;

void main()
{


char caracter;



port_b_pullups(TRUE);
lcd_init();
kbd_init();
set_tris_a(0x10); //A4 como entrada
puertoA3=0; //inicializo motor con 0

//lcd_enviar(LCD_COMANDO,LCD_CURSOR_BLINK); No activo cursor ni blinker

setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);

printf (lcd_putc,"Contador de Pulsos\n By Rober ",);

do
caracter=kbd_getc();
while (caracter=='\0');

printf(lcd_putc,"%s",cadena1);
while (1)
{
caracter=kbd_getc();

switch (caracter)
{
case '1':
desbordamiento=0;
set_timer0(0);
menu1();
printf(lcd_putc,"%s",cadena1);
break;
case '2':
desbordamiento=0;
set_timer0(0);
menu2();
printf(lcd_putc,"%s",cadena1);
break;
case '*':
printf(lcd_putc,"\f BY BY");
sleep();
}
};

}

int16 contar()
{
int cuenta=0;
int16 n;


cuenta=get_timer0();

if (cuenta==255)
{
set_timer0(0);
desbordamiento++;
}
n=256*desbordamiento+cuenta;

lcd_gotoxy(10,2);
printf(LCD_PUTC,"%Lu",n);

return(n);
}



void menu1()
{
char caracter;
int contador_parcial=0;
int motor_off=1;
int tecla_enter=0; //control de la tecla asterisco pulsada primera vez=1, pulsada outra vez =0
printf(lcd_putc,"\f* Motor On/off\n# salir");

do
{
caracter=kbd_getc();

switch (caracter)
{
case '*':
if (tecla_enter==0)
{
printf(lcd_putc,"\fMotor ON\n cuenta:");
set_timer0(contador_parcial);
tecla_enter=1;
motor_off=0;
set_tris_a(0x10);
puertoA3=1; //activo motor
}
else
{
lcd_gotoxy(1,1);
contador_parcial=get_timer0();
printf(lcd_putc,"Motor OFF");
motor_off=1;
tecla_enter=0;
set_tris_a(0x10);
puertoA3=0; // motor apagado
}
break;
case '#':
tecla_enter=0;
motor_off=1;
set_tris_a(0x10);
puertoA3=0;
break;
}

if (tecla_enter)
contar();
}while (caracter!='#');
}

int16 introducir_valor()
{
char caracter;
char numeros[6];
int contador_caracter=0;
int16 vueltas;

printf(lcd_putc,"\fN. Vueltas (4cifras)\n ");

lcd_enviar(LCD_COMANDO,LCD_CURSOR_ON); // activo cursor y blinker

do
{

caracter=kbd_getc();

if (caracter!='\0')
{
printf(lcd_putc,"%c"caracter);
numeros[contador_caracter]=caracter;
contador_caracter++;
}
}
while (caracter!='#'&amp;&amp;contador_caracter<=4);
numeros[contador_caracter]='\0';
vueltas=atol(numeros);

lcd_enviar(LCD_COMANDO,LCD_CLEAR);
lcd_enviar(LCD_COMANDO,LCD_HOME);

printf(lcd_putc,"\f* Motor On/off\n# salir");
return (vueltas);
}


void menu2()
{
char caracter;
int16 vueltas;
int motor_off=1;
int tecla_enter=0; //*es la tecla enter y asi controlo si la he pulsado 1 o ninguna vez

int16 n;

vueltas=introducir_valor();

do
{
caracter=kbd_getc();

switch (caracter)
{
case '*':
if (tecla_enter==0)
{
tecla_enter=1;
motor_off=0;
printf(lcd_putc,"\fON Fin: %Lu\ncuenta:",vueltas);
set_tris_a(0x10);
puertoA3=1; //Activo motor
}
else
{
lcd_gotoxy(1,1);
printf(lcd_putc,"Off Fin: %Lu\n cuenta:",vueltas);
motor_off=1;
tecla_enter=0;
set_tris_a(0x10);
puertoA3=0; //motor apagado
}
break;
case '#':
tecla_enter=0;
motor_off=1;
set_tris_a(0x10);
puertoA3=0; //motor apagado
break;
}

if (tecla_enter)
{
n=contar();

if (vueltas==n) /*debo parar motor*/
{
motor_off=2; /*Usado para salir de la función*/
set_tris_a(0x10);
puertoA3=0; //apago motor
}
}
}while (caracter!='#'&amp;&amp;motor_off!=2);
if (motor_off==2)
{
printf(lcd_putc,"\fSe han Bobinado: \n %Lu Vueltas",n);
do
caracter=kbd_getc();
while (caracter=='\0');
}
}
macs
 
Mensagens: 3
Registrado em: 23 Dez 2006 20:16

Mensagempor mastk » 09 Jun 2011 19:18

odeio espanhol.

primeiro de tudo, nao ha indentacao nenhuma nesse codigo, assim nunca ira funcionar.

acho melhor que vc mesmo faca o codigo. procurar coisas pronta na internet eh cagada.
Avatar do usuário
mastk
Dword
 
Mensagens: 4407
Registrado em: 14 Out 2006 20:43

Mensagempor Jorge_Francisco » 09 Jun 2011 19:25

mastk escreveu:odeio espanhol.

primeiro de tudo, nao ha indentacao nenhuma nesse codigo, assim nunca ira funcionar.

acho melhor que vc mesmo faca o codigo. procurar coisas pronta na internet eh cagada.


Usa o botão CODE aqui do fórum quando for posta um código. Outra coisa, o compilador para ser o CCS.
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor andre_luis » 09 Jun 2011 20:25

macs,

Informa aqui o 1o erro que aparece na compilação.
Boa parte dos erros seguintes são geralmente decorrentes desse.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor _blackmore_ » 09 Jun 2011 23:30

olha ... enquanto ninguém postar nadas nos outros topicos criados involuntariamente por vc, ainda dá tempo de apagá-los ...

abraço!
Ouça mais classic rock
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor Jorge_Francisco » 09 Jun 2011 23:54

Seguinte, coloquei os includes que estavam faltando. Deve dar erro ao compilar no CCS, porque tem que descomentar o uso de PORTB nas bibliotecas kbd.c e lcd.c. Além disso o código não enviará nada para o LCD, já que tem um função que o programador fez para enviar dados para o LCD, chama-se lcd_enviar(), e eu comentei estas linhas.

Coloquei aqui no notepad++ e ele identou de forma automática :

Código: Selecionar todos
// Debe recordarse que las líneas RA0-RA2 actúan ahora como salida de señales de control
// hacia el LCD. Al estar conectadas con sendos interruptores en la MicroPIC Trainer,
// estos deben estar a nivel lógico "1" permanentemente, es decir en la posicion
//marcada como 0 en la placa
//Datos del LCD conectado al puerto B
// Teclado conectado al puerto B: Columna 0,1,2 a B5,B6 y B7. Fila 0,1,2 y 3 a B1, B2,B3 y B4
//RA3 conecto la salida para el motor. En un principi funciona como salida de enable. Se puede
//estudiar posibilidad de implementar un control PWM para la velocidad.
//RA4 entrada para el Timer0

#include <16F628A.>

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT
#use delay(clock=4000000)

#use fast_io(A)
#use fast_io(B)

#include <lcd.c>
#include <kbd.c>
#include <stdlib.h>

#bit puertoA3 = 5.3 //Usado para control on/off motor

void menu1(void);
void menu2 (void);

int16 contar(void);
int16 introducir_valor(void);

char cadena1[]={"\f1-Contar Vuelt\n2-Introd. Vuelt"};
int desbordamiento=0;

void main()
{
   char caracter;

   port_b_pullups(TRUE);
   lcd_init();
   kbd_init();
   set_tris_a(0x10); //A4 como entrada
   puertoA3=0; //inicializo motor con 0

   //lcd_enviar(LCD_COMANDO,LCD_CURSOR_BLINK); No activo cursor ni blinker

   setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);

   printf (lcd_putc,"Contador de Pulsos\n By Rober ");

   do
   caracter = kbd_getc();
   while ( caracter == '\0' );

   printf(lcd_putc,"%s",cadena1);
   
   while (1)
   {
      caracter = kbd_getc();

      switch (caracter)
      {
      case '1':
         desbordamiento=0;
         set_timer0(0);
         menu1();
         printf(lcd_putc,"%s",cadena1);
         break;
      case '2':
         desbordamiento=0;
         set_timer0(0);
         menu2();
         printf(lcd_putc,"%s",cadena1);
         break;
      case '*':
         printf(lcd_putc,"\f BY BY");
         sleep();
      }
   };

}

int16 contar()
{
   int cuenta = 0;
   int16 n;


   cuenta = get_timer0();

   if (cuenta == 255)
   {
      set_timer0(0);
      desbordamiento++;
   }
   n = 256 * desbordamiento+cuenta;

   lcd_gotoxy(10,2);
   printf(LCD_PUTC,"%Lu",n);

   return(n);
}

void menu1()
{
   char caracter;
   int contador_parcial=0;
   int motor_off=1;
   int tecla_enter=0; //control de la tecla asterisco pulsada primera vez=1, pulsada outra vez =0
   printf(lcd_putc,"\f* Motor On/off\n# salir");

   do
   {
      caracter = kbd_getc();

      switch (caracter)
      {
      case '*':
         if (tecla_enter==0)
         {
            printf(lcd_putc,"\fMotor ON\n cuenta:");
            set_timer0(contador_parcial);
            tecla_enter=1;
            motor_off=0;
            set_tris_a(0x10);
            puertoA3=1; //activo motor
         }
         else
         {
            lcd_gotoxy(1,1);
            contador_parcial=get_timer0();
            printf(lcd_putc,"Motor OFF");
            motor_off=1;
            tecla_enter=0;
            set_tris_a(0x10);
            puertoA3=0; // motor apagado
         }
         break;
      case '#':
         tecla_enter=0;
         motor_off=1;
         set_tris_a(0x10);
         puertoA3=0;
         break;
      }

      if (tecla_enter)
      contar();
   }while (caracter!='#');
}

int16 introducir_valor()
{
   char caracter;
   char numeros[6];
   int contador_caracter=0;
   int16 vueltas;

   printf(lcd_putc,"\fN. Vueltas (4cifras)\n ");

   //lcd_enviar(LCD_COMANDO,LCD_CURSOR_ON); // activo cursor y blinker

   do
   {
      caracter = kbd_getc();

      if (caracter!='\0')
      {
         printf(lcd_putc,"%c",caracter);
         numeros[contador_caracter]=caracter;
         contador_caracter++;
      }
   }
   while (caracter!='#' && contador_caracter<=4);
   
   numeros[contador_caracter] = '\0';
   
   vueltas = atol(numeros);

   //lcd_enviar(LCD_COMANDO,LCD_CLEAR);
   //lcd_enviar(LCD_COMANDO,LCD_HOME);

   printf(lcd_putc,"\f* Motor On/off\n# salir");
   return (vueltas);
}


void menu2()
{
   char caracter;
   int16 vueltas;
   int motor_off=1;
   int tecla_enter=0; //*es la tecla enter y asi controlo si la he pulsado 1 o ninguna vez

   int16 n;

   vueltas=introducir_valor();

   do
   {
      caracter = kbd_getc();

      switch (caracter)
      {
      case '*':
         if (tecla_enter == 0)
         {
            tecla_enter = 1;
            motor_off = 0;
             
            printf(lcd_putc,"\fON Fin: %Lu\ncuenta:",vueltas);
             
            set_tris_a(0x10);
             
            puertoA3=1; //Activo motor
         }
         else
         {
            lcd_gotoxy(1,1);
             
            printf(lcd_putc,"Off Fin: %Lu\n cuenta:",vueltas);
             
            motor_off=1;
            tecla_enter=0;
             
            set_tris_a(0x10);
             
            puertoA3=0; //motor apagado
         }
         break;
      case '#':
         tecla_enter = 0;
         motor_off = 1;
         
         set_tris_a(0x10);
         
         puertoA3 = 0; //motor apagado
         break;
      }

      if (tecla_enter)
      {
         n = contar();

         if (vueltas == n) /*debo parar motor*/
         {
            motor_off = 2; /*Usado para salir de la función*/
             
            set_tris_a(0x10);
             
            puertoA3 = 0; //apago motor
         }
      }
   }while (caracter!='#' && motor_off!=2);
   
   if (motor_off == 2)
   {
      printf(lcd_putc,"\fSe han Bobinado: \n %Lu Vueltas",n);
       
      do
      caracter = kbd_getc();
      while (caracter == '\0');
   }
}
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor macs » 12 Jun 2011 18:50

Olá Pessoal.

Primeiramente peço desculpas pelos vários tópicos com o mesmo assunto e de não ter postado o código adequadamente. Foi realmente involuntário.
Algum moderador já apagou os outros pelo que percebi...Obrigado.
Agradeço a todos e em especial ao Jorge_Francisco pela dica.
O programa esta compilando sem erro, inclusive com a função lcd_enviar(), e já aparece à mensagem de entrada no lcd, simulando no Proteus.
Não entendo nada de linguagem C, mas já estou pegando o jeito. Se fosse em basic ou mesmo em asm seria um pouco mais fácil para mim. Modifiquei a biblioteca kbd e encontrei uma lcd para oito vias que deu certinho.
A compilação agora só está dando um aviso que o laço while da linha 60 esta sempre na condição verdadeira (se alguem poder ajudar??).

Abraços.
macs
 
Mensagens: 3
Registrado em: 23 Dez 2006 20:16

Mensagempor macs » 12 Jun 2011 21:26

Olá outra vez.

O aviso do laço while é irrelevante, pois agora no proteus tudo funciona perfeitamente.

Abraços
macs
 
Mensagens: 3
Registrado em: 23 Dez 2006 20:16


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

x