Define CONF_WORD = 0x31c4 'Palabra de configuración Bit (Fuses)
Define CLOCK_FREQUENCY = 4 'Frecuencia del reloj 4 Mhz
'**********************************************************************
'NOMBRE: 12F675_OSCCAL_TIMER1_RS232_ICSP
'MICRO: PIC12F675, 4Mhz Interno
'DESCRIPCION: Circuito para la calibración del oscilador interno OSCCAL
'FECHA/AUTOR: By COS, 01/08
'Versión 1.1
'Lectura de una entrada digital
'Uso del timer1 como contador
'Habilitación de un puerto RS232 optoacoplado, por software (simulación)
'Configuración del hyperterminal del PC: Bit por segundo -> 2400, Bits de datos -> 8,
'Paridad ->Ninguna, Bits de parada -> 1, Control de flujo -> Ninguno
'Programación del microcontrolador en placa (ICSP)
'**********************************************************************
Define SEROUT_DELAYUS = 0 'Serout sin demoras entre bytes
'************************ Declaración de variables *************************
DIM db_timer1
AS Word
'Tiempo en uSeg., periodo de la señal 50hz/2 DIM timer1
AS Word
'Contendrá el valor de los registros del timer1 DIM m_timer1
AS Word
'Variable auxiliar DIM m1_timer1
AS Word
'Variable auxiliar DIM vosccal
AS Byte
'Valor a programar en el registro OSCCAL DIM m_vosccal
AS Byte
'Variable auxiliar DIM flag
AS Byte
'Variable auxiliar '******************* Asignación de valores a las variables *******************
db_timer1 = 10000 'Periodo/2
vosccal = 0 'Valor inicial de OSCCAL
flag = 0 'según su valor cambia el flujo del programa
'**************** Configuración módulos generales (E/S) *******************
CMCON = 0x07 'comparator off
VRCON = 0x00 'vref off, comparador
ANSEL = %00000000 'pin digitales
OSCCAL = vosccal '91 'calibración del oscilador interno
TRISIO = 0xff 'tri-state pins, entradas
TRISIO.4 = 0 'GP4 pin, como salida, Tx puerto serie
TRISIO.5 = 1 'GP5 pin, como entrada
'********************* Configuración del Timer1 **************************
T1CON.TMR1CS = 0 'bit de selección de reloj para el timer1, interno Fosc/4
T1CON.T1CKPS0 = 0 'bit de selección del prescaler para el reloj del timer1
T1CON.T1CKPS1 = 0 'bit de selección del prescaler para el reloj del timer1
T1CON.TMR1ON = 0 'parado el contador del TMR1
PIE1.TMR1IE = 0 'desactiva las interrupciones del timer1
'--------------------------------------Main Programa ------------------------------
WaitMs 5000 'espera 5Seg.
main: 'Rutina del programa principal (inicio)
IF GPIO.2 = 0 THEN GOSUB microchip_osccal 'Si pulsa tecla salto y retorno
TMR1H = 0x00 'borro el registro alto del timer1
TMR1L = 0x00 'borro el registro bajo del timer1
'Sincronizamos la señal externa con la rutina de lectura del programa___
WHILE GPIO.5 = 1 'mientras GPIO.5 este en estado alto no hago nada
WEND 'Acota el bucle While, anterior
WHILE GPIO.5 = 0 'mientras GPIO.5 este en estado bajo no hago nada
WEND 'Acota el bucle While, anterior
'_______________________________________________________________
T1CON.TMR1ON = 1 'activa el contador del TMR1
WHILE GPIO.5 = 1 'mientras GPIO.5 esta en estado alto no hacemos nada.
WEND 'Acota el bucle While, anterior
T1CON.TMR1ON = 0 'para el contador del TMR1
timer1.HB = TMR1H 'Carga byte alto con valor alto del registro del timer1
timer1.LB = TMR1L 'Carga byte bajo con valor byte low del reg. timer1
GOSUB ser_out 'Salto con retorno a la subrutina ser_out
IF flag > 1 THEN WaitMs 1000 'Lento prog. cuando conoce valor OSCCAL
IF flag < 2 THEN 'Permite paso 2 del calculo de OSCCAL
IF timer1 > db_timer1 THEN
flag = 2 'Indica que termina el paso 2
timer1 = timer1 - db_timer1 'Se almacena el error del timer1
IF timer1 > m_timer1 THEN vosccal = vosccal - 1 'comprar. errores últimos
IF timer1 <= m_timer1 THEN vosccal = vosccal 'comparan errores últimos
Endif 'Acota if, según tabulado
Endif 'Acota if, según tabulado
IF flag < 1 THEN 'Paso uno del calculo de OSCCAL
IF timer1 < db_timer1 THEN 'Si se da la condición
vosccal = vosccal + 1 'incrementamos vosccal
m_timer1 = db_timer1 - timer1 'Se almacena el error del timer1
Endif 'Acota if, según tabulado
Endif 'Acota if, según tabulado
OSCCAL = vosccal 'Escribe el valor de la variable vosccal en el registro OSCCAL
GOTO main 'Redirecciona el flujo del programa al inicio
'****************************************************************************
ser_out: 'Simulación de puerto serie por software
'Envía los datos al puerto serie (literales, variables y carácter de control)
Serout GPIO.4, 2400, CrLf, "Timer1: ", #timer1, " OSCCAL: ", #vosccal, CrLf
'CrLf, Avance de línea y retorno de carro para el hyperterminal del PC
RETURN 'Acota la rutina y retorna después del salto
microchip_osccal: 'Carga OSCCAL con el valor de microchip
ASM: bsf status,rp0
ASM: CALL 3ffh
ASM: movwf vosccal
ASM: bcf status,rp0
OSCCAL = vosccal 'Carga el registro con el valor de vosccal
flag = 2 'Indica que se encontró el valor de OSCCAL
RETURN 'Acota la rutina y retorna después del salto