# Cronómetro PICBASIC 18F2550



## Abraham91 (Feb 23, 2015)

Buenas a todos. Antes de nada, un placer pertenecer a esta increíble comunidad.
Actualmente estoy realizando un proyecto que se trata de un "medidor de autonomía" de baterías.
El prototipo en sí mide él sólito el tiempo que tarda en descargarse una batería y lo muestra en una pantalla LCD, además de la posibilidad de exportar gráficas al PC.

Dentro de poco tiempo, actualizaré con todos los detalles y progresos que llevo.
El caso es que estoy a punto de terminar pero tengo un serio problema y es el siguiente: Al simular en ISIS, noto que el contador de tiempo o cronómetro se atrasa cada 10 segundos o así aproximadamente y me gustaría saber si hay alguna solución para este problema o a que se puede deber.

Ya no sé a quien o qué recurrir espero que podáis echarme una mano.

Aquí el código en PICBASIC:

```
DEFINE LCD_DREG PORTB
 DEFINE LCD_DBIT 4
 DEFINE LCD_RSREG PORTC
 DEFINE LCD_RSBIT 2
 DEFINE LCD_EREG PORTC
 DEFINE LCD_EBIT 0
 DEFINE LCD_BITS 4
 DEFINE LCD_LINES 2

 DEFINE OSC 4
 TRISA=1
 TRISB=0
 PORTA=0
 Segundos VAR Byte 
 Minutos  VAR Byte
 Horas    vAR Byte


PAUSE 100 ' PAUSA DE MEDIO SEGUNDO

LCDOUT $FE, 1, "   CRONOMETRO"   'ESCRIBIR EN LA PRIMER LÍNEA
Bucle:
LCDOUT $FE, $C4, Dec2 Horas ,":",Dec2 Minutos ,":",Dec2 Segundos 'ESCRIBIR EN LA SEGUNDA LÍNEA

PAUSE 1000                     'este es el tiempo exacto entre segundos, en ms
Segundos=Segundos+1
If Segundos>59 THEN Minutos=Minutos+1
IF Segundos>59 THEN Segundos=0

If Minutos>59 THEN Horas=Horas+1
IF Minutos>59 THEN Minutos=0

If Horas>59 THEN Horas=0
GOTO BUCLE


END
```


----------



## D@rkbytes (Feb 23, 2015)

Es mejor que uses alguno de los Timers del PIC.
Mencionas que es un cronómetro pero no estás definiendo ni mostrando los milisegundos.
Y con Pause 1000, va de segundo en segundo.

La simulación tiene retrasos, no debes fiarte en ello.


----------



## Nuyel (Feb 23, 2015)

El Pause NO es tiempo exacto, recomiendo agregar el timer, de ser posible usando el cristal de 32768Hz para que tengas más facilidad y lanzar la interrupción con el temporizador de 16bits en TIMER1, así lo disparas por temporizador cada segundo con precisión.

Cuando usas PAUSE el MCU inicia una cuenta y la espera antes de continuar con los procesos, ¿sabes cuantos ms toma lo demás?, ese error se va acumulando con el tiempo y te va a desplazar el reloj, por eso debes usar un timer, especialmente TIMER1 está pensado para usar el cristal de 32kHz que usan los relojes normales para dar la hora, con interrupciones la cuenta no se va a detener mientras el MCU realiza el resto de los procesos así que no pierde tanta precisión.


----------



## Abraham91 (Feb 28, 2015)

Bien muchas gracias por la información! Podrías pasarme algún ejemplo del uso del timer 1? Aunque sea en ensamblador da lo mismo. Necesito alguna buena referencia y por internet no encuentro lo que quiero


----------



## D@rkbytes (Feb 28, 2015)

Mira por aquí: _*Ejemplos con el Timer 1 en PBP*_


----------



## Abraham91 (Mar 1, 2015)

Ejemplos geniales Dark pero sigo sin ser capaz de conseguir un segundo exacto en picbasic ,,, que locura


----------



## D@rkbytes (Mar 1, 2015)

Con el Timer 1 y un cristal de 32768 Hz se puede hacer con mucha precisión.
También puedes generar otros retardos con los Timers, como; 100, 10 o 1 ms, hacer cuentas y obtener 1 segundo.

Si tienes dudas acerca de cómo usar el Timer 1, mira ahora este post: *Uso del Timer 1*


----------



## Rodry56 (Mar 1, 2015)

Además de lo que te dijeron de usar el timer. El proteus no simula en tiempo real, la unica forma de verlo en tiempo real es armando el circuito. 
Un tip que te puedo dar es que el proteus simula mas rapido si le cargas el hex. Pero no podras ver el codigo. Si cargas el cof podes ver el codigo pero a la maquina le cuesta mas simular.


----------



## Abraham91 (Mar 4, 2015)

Pues gracias de nuevo. Una vez resuelto esto surge otro problema y es que en el montaje real del circuito, el LCD muestra cuadraditos en la linea, como si estuviese saturado. Ya he probado a regular el contraste con potenciómetro, he revisado pines etc etc pero no hay manera de visualizar lo que es "00:00:00". He buscado bastante información sobre configuración del LCD para iniciarlo, que le de tiempo a recibir los datos y comandos y demás pero no hay manera. Tambien he cargado otro programa simple "Hola Mundo" en el PIC para ver si el LCD está estropeado (cosa que sería bastante extraño porque aguantan muchas virguerías) y funciona a la perfección. Alguna idea?


----------



## D@rkbytes (Mar 4, 2015)

Conexiones, el PIC, palabra de configuración, etc.
El PIC que estás usando "PIC18F2550", utiliza una palabra de configuración especial.
Si no estás usando la adecuada, el programa puede no funcionar o hacerlo en una frecuencia diferente.
Es mejor que adjuntes tu proyecto completo dentro de un archivo comprimido.


----------



## Abraham91 (Mar 4, 2015)

Archivo .hex y esquema en ISIS


----------



## D@rkbytes (Mar 4, 2015)

OK. Si estás usando MicroCode Studio con una versión inferior a la 2.60x, tendrás que hacer lo siguiente.
Debes modificar el archivo 18F2550.INC que se encuentra dentro de la carpeta de instalación de PBP.
Los fuses por defecto que verás en ese archivo, son los siguientes:

```
__CONFIG    _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
        __CONFIG    _CONFIG1H, _FOSC_HSPLL_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
        __CONFIG    _CONFIG2L, _PWRT_OFF_2L & _BOR_ON_2L & _BORV_3_2L & _VREGEN_ON_2L
        __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
        __CONFIG    _CONFIG3H, _CCP2MX_ON_3H & _PBADEN_OFF_3H & _LPT1OSC_OFF_3H & _MCLRE_ON_3H
        __CONFIG    _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _XINST_OFF_4L
```
Esta es la palabra de configuración que tiene ese archivo por defecto y es con la que estás grabando el PIC.
Por no ser la adecuada es obvio que tu programa no funcionará. 
Entonces necesitas eliminar o comentar esa palabra de configuración, cambiándola por la siguiente:

```
config FOSC = XT_XT, IESO = ON
        config PWRT = ON, WDT = OFF, PBADEN = OFF, LVP = OFF, BOR = OFF
```
Ésta es la palabra de configuración que requiere tu programa para que funcione con un cristal de 4 MHz. 
Cuando termines la edición del archivo 18F2550.INC, guardas los cambios y compilas.

Es de tener en cuenta que cuando se compila un programa para un PIC18 con PBP 2.60 o inferior u otro sistema operativo superior a Windows XP, se debe utilizar MPASM.

Si estuvieras usando MicroCode Studio con PBP3, entonces la palabra de configuración se puede escribir en la cabecera de programa y sería de esta forma:

```
#Config
    config FOSC = XT_XT, IESO = ON
    config PWRT = ON, WDT = OFF, PBADEN = OFF, LVP = OFF, BOR = OFF
#EndConfig
```
Otros detalles:
Para configurar los puertos con ADC en el PIC18F2550 como digitales, se debe colocar el valor 0x0F en el registro ADCON1.
En tu programa lo tienes con el valor 7 y ese valor no es correcto.
Más acerca de esto lo puedes encontrar en la hoja de datos.
Mira como se inicializan los puertos para que veas el valor que debe tener ADCON1.
También puedes mirar la tabla de valores del registro ADCON1 para cuando uses el ADC sepas que valor usar.

También te recomiendo que al inicio del programa limpies la RAM usando *Clear*
A continuación de esta instrucción puedes establecer valores iniciales a las variables si se requiere.

Si realizas lo que te mencioné, de forma correcta, tendrás funcionando tu programa. 

PD: El archivo de simulación que subiste, está en blanco.
Y anímate a hacerlo con el Timer 1. No es complicado. 
Este es el esquema que se debe seguir conforme a tu programación.


----------

