'********************************** PIC Entrenadora BASIC *********************************
'NOMBRE: 16F88_Pic_EBasic_LCD_Timer1_MidiendoTiempo_10
'VERSION: 1.0
'MICRO: PIC16F88
'Fecha/Autor: 5/07 By COS, PSI v7.41
'DESCRIPCION: Midiendo el tiempo que tardan ciertas rutinas en ejecutarse.
'Representación del tiempo por el hiperterminal.
'Programar el hyperterminal del Windows:
'Bits por segundo: 4800
'Bits de datos: 8
'Paridad: Ninguno
'Control de flujo: Ninguno
'LCD a 4 bit, sin bit de RW
'Valor por el display y por el hyperterminal
'************************************************************************************************
Define CONFIG = 0x2f50 'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc 'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 8 'Clock en Mhz
'Define SIMULATION_WAITMS_VALUE = 1 'Activar para simulación
'Configuración del LCD------------------------------------------------------
Define LCD_BITS = 4 'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA 'El bus de datos sera el puerto A
Define LCD_DBIT = 0 'El bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB 'El bit de control RS sera del puerto B
Define LCD_RSBIT = 7 'Se usara el RB7 como RS
Define LCD_EREG = PORTB 'El bit de control E sera del puerto B
Define LCD_EBIT = 6 'Se usara el RB6 como E
Define LCD_COMMANDUS = 2000 'Tiempo de espera despues de ejecutar un comando del lcd en uSeg., depende del lcd (este 500)
Define LCD_DATAUS = 50 'Tiempo de espera despues de enviar un dato al LCD en uSeg., depende de la respuesta del lcd
Define LCD_INITMS = 5 '50 'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'Asignación I/O y valores de inicio de las salidas---------------------
ANSEL = 0x00 'Los pin I/O digitales
CMCON = 0x07 'Comparador a off
OSCCON = 0x7e 'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00 'Puerto A como salidas
TRISB = 0x00 'Puerto B como salidas
TRISA.4 = 1 'Como entrada (RA4, adc)
TRISA.6 = 1 'Como entrada (RA6, tecla S1)
TRISA.5 = 1 'Como entrada (RA5, tecla S2)
'TRISB.5 = 0 'RB5(Tx, RS232)
TRISB.2 = 1 'RB2 (Rx, RS232)
PORTB.3 = 1 'Luz lcd a on (RB3)
PORTA.7 = 1 'Led amarillo a off
PORTB.0 = 1 'Led verde a off
'Configuración Timer1----------------------------------------------------------
T1CON.TMR1CS = 0 'Asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0 'Factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0 'Factor del preescales del timer1, 0
T1CON.TMR1ON = 0 'Parado el contador del TMR1
PIE1.TMR1IE = 0 'Desactiva las interrupciones del timer1
'INTCON.PEIE = 1 'Bit de habilitacion de interrupciones de perifericos
'Enable 'INTCON.GIE habilita todas las interrupciones globales
'---------------------------------------------------------------------------------------
Lcdinit 'inicializa el LCD sin cursor
'Asignacion de nombres
Symbol led_amarillo = PORTA.7 'led amarillo
Symbol led_verde = PORTB.0 'led verde
'Variables
DIM timer1
AS LONG 'Contendra el valor de los registros del timer1 y posterior valor a uSeg. aux = 0
'Cabecera LCD
'WaitMs 1000 'Pausa de 1Seg
Lcdout "16F88_LCD_TIMER1" 'Imprime en el LCD el literal
Lcdcmdout LcdLine2Home 'Selecciona linea y cursor al principio
Lcdout "MidiendoTiempo" 'Sscribe la cadena de literales en el lcd
'WaitMs 3000 'Pausa de 3Seg
'Main Programa---------------------------------------------------
main:
TMR1H = 0x00 'Borra el registro alto del timer1
TMR1L = 0x00 'Borra el registro bajo del timer1
T1CON.TMR1ON = 1 'Activa el contador del TMR1
'Rutina a medir en uSeg-----------------------------------
'WaitMs 15 'Tarda 14997 uS
'Lcdcmdout LcdClear '__Tarda 2930uS
'Lcdout "Hola TodoPic" '_
'aux = 100 '__________Tarda 1 uSeg
'If aux = 100 Then '_____Tarda 2 uSeg.
'Endif '______________
FOR aux = 0 TO 100 '____Tarda 457 uSeg.
NEXT aux '____________
'-------------------------------------------------------------------
'Lectura timer1
T1CON.TMR1ON = 0 'Para el contador del TMR1
timer1.HB = TMR1H 'Asigna registro de mas peso
timer1.LB = TMR1L 'Asigna registro de menos peso
IF timer1 > 0 THEN timer1 = timer1 - 1 'Se resta tiempo conocido
'Envia datos al LCD
Lcdcmdout LcdClear 'Borra el lcd y cursor linea 1
Lcdout "Timer1:", #timer1 'Datos por el lcd
'Envia datos al puerto serie
Serout PORTB.5, 4800, CrLf, "Timer1: ", #timer1, CrLf 'Puerto serie Tx, por soft
'Calcula usegundos
timer1 = (timer1 * 5) / 10 'En microsegundos
'Datos al Lcd
Lcdcmdout LcdLine2Home 'Cursor al principio de la linea 2 del lcd
Lcdout "Tiemp.:", #timer1, "uS." 'Datos por el lcd
'Datos al puerto serie
Serout PORTB.5, 4800, CrLf, "Tiempo: ", #timer1, " uSeg.", CrLf 'Puerto serie Tx, por soft