Boa noite pessoal, é minha primeira vez por aqui e já venho pedindo ajuda, vamos ao pedido, estou montando um contado de voltas para uma maquina de enrolar transformador, ele é muito interessante, tem a opção de programar a quantidade de espiras para desligar o motos apos atingir o numero programado, ou contar direto sem programação, toda programação ta funcionando muito bem, o que ta acontecendo é o seguinte, ele conta normalmente em qualquer velocidade até 254, ai pula para 256, ai segue normal até 510, ai pula para 512, ou seja, ele pula 1 a cada multiplo de 255, segue a baixo o código fonte.
// 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 <16f877a.h>
#include <stdlib.h>
#include <stdio.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT
#use delay(clock=4000000)
//#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_B1,RCV=PIN_B2)
#define use_portb_kbd TRUE // para evitar error (undefined identifier --set_tris_d)
//#define use_portb_lcd TRUE // para evitar error (undefined identifier --set_tris_d)
#include <LCD2.c>
#include <KBD.c>
#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. Vaelt"};
int desbordamiento=0;
int amp=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);
// delay_us(1000);
printf (lcd_putc,"Contador de Pulsos\n By Rober ",);
// delay_us(1000);
do
caracter=kbd_getc();
while (caracter=='\0');
// delay_us(1000);
printf(lcd_putc,"%s",cadena1);
// delay_us(1000);
while (1)
{
caracter=kbd_getc();
switch (caracter)
{
case '1':
desbordamiento=0;
set_timer0(0);
menu1();
// delay_us(1000);
printf(lcd_putc,"%s",cadena1);
// delay_us(1000);
break;
case '2':
desbordamiento=0;
set_timer0(0);
menu2();
// delay_us(1000);
printf(lcd_putc,"%s",cadena1);
// delay_us(1000);
break;
case '*':
printf(lcd_putc,"\f BY BY");
// delay_us(1000);
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);
// delay_us(1000);
printf(LCD_PUTC,"%Lu",n);
// delay_us(1000);
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 otra vez =0
// delay_us(1000);
printf(lcd_putc,"\f* Motor On/off\n# salir");
// delay_us(1000);
do
{
caracter=kbd_getc();
switch (caracter)
{
case '*':
if (tecla_enter==0)
{
// delay_us(1000);
printf(lcd_putc,"\fMotor ON\n cuenta:");
// delay_us(1000);
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();
// delay_us(1000);
printf(lcd_putc,"Motor OFF");
// delay_us(1000);
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;
// delay_us(1000);
printf(lcd_putc,"\fN. Vueltas (4cifras)\n ");
// delay_us(1000);
//lcd_send_byte(LCD_COMANDO,LCD_CURSOR_ON); // activo cursor y blinker
lcd_enviar(LCD_COMANDO,LCD_CURSOR_ON); // activo cursor y blinker
// delay_us(1000);
do
{
caracter=kbd_getc();
if (caracter!='\0')
{
// delay_us(1000);
//printf(lcd_putc,"%c"caracter);
printf(lcd_putc,"%c",caracter); // aqui faltaba la coma antes de la palabra caracter
// delay_us(1000);
numeros[contador_caracter]=caracter;
contador_caracter++;
}
}
//while (caracter!='#'&,&contador_caracter<=4); //Cambiar los punto y coma por coma como en la siguiente linea
while (caracter!='#'&,&,contador_caracter<=4);
numeros[contador_caracter]='\0';
vueltas=atol(numeros);
// delay_us(1000);
lcd_enviar(LCD_COMANDO,LCD_CLEAR);
// delay_us(1000);
lcd_enviar(LCD_COMANDO,LCD_HOME);
// delay_us(1000);
printf(lcd_putc,"\f* Motor On/off\n# salir");
// delay_us(1000);
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;
// delay_us(1000);
printf(lcd_putc,"\fON Fin: %Lu\ncuenta:",vueltas);
// delay_us(1000);
set_tris_a(0x10);
puertoA3=1; //Activo motor
}
else
{
// delay_us(1000);
lcd_gotoxy(1,1);
printf(lcd_putc,"Off Fin: %Lu\n cuenta:",vueltas);
// delay_us(1000);
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); //Cambiar los punto y coma por coma como en la siguiente linea
}while (caracter!='#'&,&,motor_off!=2);
if (motor_off==2)
{
// delay_us(1000);
printf(lcd_putc,"\fSe han Bobinado: \n %Lu Vueltas",n);
// delay_us(1000);
do
caracter=kbd_getc();
while (caracter=='\0');
}
}