Autor Tema: PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)  (Leído 859380 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #60 en: 15 de Diciembre de 2006, 20:28:39 »
Comprobado hasta ahora:

LCD
Retroiluminacion
y los I/O, leds
Contraste

Dejo unas fotos de como me quedo
me queda por llegar el zocalo de la pila y el reloj I2C



« Última modificación: 15 de Diciembre de 2006, 20:43:55 por dogflu66 »
Saludos desde Granada, España.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #61 en: 15 de Diciembre de 2006, 20:47:41 »
Ha quedado de maravillas....y en tiempo record!
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #62 en: 15 de Diciembre de 2006, 22:52:12 »
Hola:

Maestro entre maestros, te quedo muy chevere y muy compacta, esta como para hacerce una al instante  :D

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #63 en: 15 de Diciembre de 2006, 23:26:25 »
Ya termine de probar el resto:
pin I/O, teclas
el adc
puerto serie

todo correcto a la primera...   :-)

en las pruebas del rs232, pude recibir mis propios datos (uni los pin tx con rx)
y visualizarlos en el lcd...  :D

pos listo voy a publicar la correccion de los tornillos.
Saludos desde Granada, España.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #64 en: 16 de Diciembre de 2006, 02:45:56 »
todo correcto a la primera...   :-)

¡Qué raro!, a mí eso no me pasa nunca. Bueno, en honor a la verdad me pasó una vez y pensé: ¿qué habre hecho mal para que funcione a la primera?

Felicidades Carlos, está muy chula.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #65 en: 16 de Diciembre de 2006, 16:23:02 »
Si jeje, pura suerte...  :D

La nueva version de la plaquita:

http://www.mytempdir.com/1118866

Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #66 en: 19 de Diciembre de 2006, 19:08:30 »
Me indican que publique de nuevo la parte inferior de PCB como sigue:

    1º Todas las masas solidas
    2º Mayor separacion de pista de la isleta inferior del DB9

http://www.mytempdir.com/1124543

Color de los led:
    led amarillo RA7 (LED1)
    led verde RB0 (LED2)
    led Rojo del RTC (LED3)
« Última modificación: 19 de Diciembre de 2006, 22:46:41 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #67 en: 19 de Diciembre de 2006, 19:16:01 »
Ejemplo que utiliza el LCD y el ADC (utilizando el comando ADCIN):

Código: [Seleccionar]
'********************************** PIC Entrenadora BASIC (PicEBasic)**************************
'NOMBRE: 16F88_LCD_ADC_Decimales_01
'VERSION: 1.0
'MICRO: PIC16f88A
'FECHA/AUTOR: 12/06 - By COS, PSI v7.41
'DESCRIPCION:
'Muestra en el display el valor de la entrada analogica con dos decimales y en voltios
'*****************************************************************************************
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
'-------------------------------------Puertos del LCD-----------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd será de 4bit
Define LCD_DREG = PORTA  'el bus de datos será el puerto A
Define LCD_DBIT = 0  'el bus de datos serán los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS será del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E será del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTx  'el bit de control RW será del puerto x(no se usa)
'Define LCD_RWBIT = n  'se usara el Rxn como RW (no se usa)
Define LCD_COMMANDUS = 2000  'Tiempo de espera después de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera después de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera después de inicializar el Display, solo se ejecuta una vez en mSeg.
'**************************************DEFINICION DE PUERTOS*****************************
'----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
ANSEL = %00010000  'Los pin I/O digitales y RA4 analógico
Define ADC_SAMPLEUS = 10  'Configuración del ADC
Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, mínimo permitido por el micro 1.5uSeg, configuración ADC
'_______________registros afectados por Define ADC_CLOCK y ADCIN________________
'ANSEL = %00010000  'los pin I/O digitales y RA4 analógico
'ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (mínimo 1.uSeg), channel RA4
'ADCON1 = %01000000  'voltage reference (AVdd/AVss) y selección de escala división clock/2 ADCON1.ADCS2=1
'_______________________________________________________________________________
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)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off
PORTB.0 = 1  'led verde a off
Lcdinit  'inicializa el lcd sin cursor
'Variables del ADC y Rutina división------------------------------
Dim num_1 As Word  'valor del adc y retorna la parte entera
Dim num_2 As Word  'factor de la escala y retorna el primer decimal
Dim num_3 As Word  'segundo decimal
Dim dvdo As Word  'dividendo operación
Dim dvsor As Word  'divisor operación
'-------------------------------------------------------------------
WaitMs 1000  'espera 1Seg
Lcdout "16f88_LCD_ADC"  'escribe en el lcd
Lcdcmdout LcdLine2Home  'selecciona la línea dos como próxima para escritura
Lcdout "Pruebas con ADC"  'escribe en el lcd
WaitMs 3000  'espera 3Seg
'--------------------------------------Main Programa-----------------------------------------------
main:
Gosub lee_adc  'salto con retorno, rutina de lectura de la entrada ADC
Gosub division_dos_decimales  'salto con retorno, rutina de conversión de valor adc a voltios
Gosub print_lcd  'salto con retorno, rutina que imprime los valores en el lcd
WaitMs 100  'hace una pausa de 100mSeg
Goto main
End                                               
'--------------------------------------FIN DEL MAIN---------------------------------------------
'**************************************Subrutinas**********************************************
'--------------------------------------Subrutina lectura ADC, división y LCD
lee_adc:  '_______________________lee la entrada analógica
Dim aux As Long
Adcin 4, num_1  'lee el valor de la entrada analógica y lo carga en num_1
aux = (500 * num_1) / 1023  'Pasa a formato de parte entera con dos decimales integrados
num_1 = aux
Return                                           
division_dos_decimales:  '________Rutina división con dos decimales
Dim resto As Word
dvdo = num_1  'asigna dividendo
dvsor = 100  'asigna divisor (dos decimales)
num_1 = dvdo / dvsor
resto = dvdo Mod dvsor
'Si resto es 0 se asignan valores
If resto = 0 Then
num_2 = 0
num_3 = 0
Endif
If resto = 0 Then Return  'Se sale de la subrutina
'Primer decimal
num_2 = resto * 10
num_2 = num_2 / dvsor
'Segundo decimal
num_3 = resto - (num_2 * 10)
Return                                           
print_lcd:  '____________________Muestra los datos por el display
Lcdcmdout LcdLine1Home  'Primera línea y cursor al principio
Lcdout "ENTR. ADC ", #num_1, ".", #num_2, #num_3, "V"  'Muestra los datos en el lcd
Lcdcmdout LcdLine2Home  'Segunda línea y cursor al principio
Lcdout "Lectura Pin RA4"  'muestra los datos en el lcd
Return                                       
« Última modificación: 15 de Junio de 2016, 09:00:14 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #68 en: 19 de Diciembre de 2006, 22:42:49 »
Otro ejemplo, ahora para practicar con las teclas y los led.

Código: [Seleccionar]
'********************************** PIC Entrenadora BASIC (PicEBasic)******************************
'NOMBRE: 16F88_LCD_I/O_01
'VERSION: 1.0
'MICRO: PIC16f88A
'FECHA/AUTOR: 12/06 - By COS, PSI v7.41
'DESCRIPCION: MUESTRA EN EL DISPLAY EL ESTADO DE LA TECLA ACTIVANDO EL LED ASOCIADO
'***************************************************************************************************
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
'-------------------------------------Puertos 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_RWREG = PORTx  'el bit de control RW sera del puerto x(no se usa)
'Define LCD_RWBIT = n  'se usara el Rxn como RW (no se usa)
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'**************************************DEFINICION DE PUERTOS*************************************
'----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
ANSEL = %00000000  '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)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off
PORTB.0 = 1  'led verde a off
Lcdinit  'inicializa el lcd sin cursor
'***********************************DEFINICION DE VARIABLES**************************************
'--------------------------------------Variables Programa----------------------------------------
Dim tecla_s1 As Byte  'guarda el estado de la tecla hasta terminar la maniobra
Dim tecla_s2 As Byte  'guarda el estado de la tecla hasta terminar la maniobra
'------------------------------------------ASIGNACIONES------------------------------------------
tecla_s1 = 0
tecla_s2 = 0
WaitMs 1000  'espera 1Seg
Lcdout "16f88_LCD_I/O"  'escribe en el lcd
Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
Lcdout "Pruebas con I/O"  'escribe en el lcd
WaitMs 3000  'espera 3Seg
'--------------------------------------Main Programa-----------------------------------------------
main:
If RA6 = 0 Then tecla_s1 = 1  'lee el estado de la tecla S1
If RA5 = 0 Then tecla_s2 = 1  'lee el estado de la tecla S2
Gosub print_lcd  'salto con retorno, rutina que imprime los valores en el lcd
WaitMs 100
If tecla_s1 = 1 Then  'si la tecla S1 fue pulsada
Toggle RA7  'invierte el estado de RA7, led amarillo
tecla_s1 = 0  'tecla queda en reposo
Endif
If tecla_s2 = 1 Then  'si la tecla S2 fue pulsada
Toggle RB0  'Invierte el estado de RB0, led verde
tecla_s2 = 0  'tecla queda en reposo
Endif
WaitMs 100  'hace una pausa de 100mSeg
Goto main
End                                               
'--------------------------------------FIN DEL MAIN---------------------------------------------
'**************************************Subrrutinas**********************************************
print_lcd:  '____________________Muestra los datos por el display
Lcdcmdout LcdLine1Home  'Primera linea y cursor al principio
Lcdout "  S1 ", #tecla_s1, " -- S2 ", #tecla_s2  'imprime en el lcd
Lcdcmdout LcdLine2Home  'Segunda linea y cursor al principio
Lcdout "----------------"  'Muestra los datos en el lcd
Return
« Última modificación: 15 de Junio de 2016, 09:01:35 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #69 en: 23 de Diciembre de 2006, 13:12:02 »
Bien, ya termine de probar el Reloj (DS1307) y todo ok.

Proximamete cuando termine de sanear el programa de ejemplo del RS232 y del RTC, los publico.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #70 en: 23 de Diciembre de 2006, 13:14:14 »
Y por supuesto un ejemplo para asociar la resistencia ajustable de la entrada analogica al control de iluminaicon del display por PWM...  :mrgreen:
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #71 en: 24 de Diciembre de 2006, 23:21:27 »
El programita que sirve para probar el reloj:


Código: [Seleccionar]
'************************* PIC Entrenadora BASIC (PicEBasic)******************************
'NOMBRE: 16F88_LCD_RTC
'VERSION: 1.0
'MICRO: PIC16f88A
'FECHA/AUTOR: 12/06 - By COS, PSI v7.41
'Descripcion: muestra en el display la fecha y la hora.
'Para transferir la hora al reloj dejar pulsada la tecla S1
'***************************************************************************************************
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
'-------------------------------------Puertos 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_RWREG = PORTA 'el bit de control RW sera del puerto A
'Define LCD_RWBIT = 5 'se usara el RA5 como RW
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'Asignacion de I/O y valores de inicio de las salidas
ANSEL = %00000000  '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)
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off
PORTB.0 = 1  'Led verde a off
'------------------------------------------------------------------------
Lcdinit  'Inicializa el lcd sin cursor
WaitMs 1000  'Espera 1Seg
Lcdout "16f88LCD_RTC/I2C"  'Escribe en el lcd
Lcdcmdout LcdLine2Home  'Selecciona la linea dos como proxima para escritura
Lcdout "Pruebas con I2C"  'Escribe en el lcd
WaitMs 3000  'Espera 3Seg
Lcdcmdout LcdClear
'Puerto I2C ---------------------------------------------------------
Symbol sda = PORTB.1  'Asignamos nombre al pin que hara de sda del puerto i2c
Symbol scl = PORTB.4  'Asignamos nombre al pin que hara de SCL del puerto I2C
'Variables Generales -------------------------------------------
Dim aux_4h As Byte  'Contendra el nibble alto del dato leido por el I2C
Dim aux_4l As Byte  'Contendra el nibble bajo del dato leido por el I2C
Dim i As Byte  'Variable indice
Dim reg(7) As Byte  'Contendra los valores finales de fecha y hora en el sistema decimal
'Inicializacion del reloj -------------------------------------------
'Aqui escribimos los valores para cargar al RTC ------
If RA6 = 0 Then  'Si la tecla S1 esta pulsada pasaremos los datos al reloj
I2CWrite sda, scl, 0xd0, 0, 0x00  'Segundos, escrito en hex, porque coincide en este caso con BCD del RTC
I2CWrite sda, scl, 0xd0, 1, 0x59  'Minutos
I2CWrite sda, scl, 0xd0, 2, 0x23  'Horas
I2CWrite sda, scl, 0xd0, 3, 0x01  'Dia de la semana
I2CWrite sda, scl, 0xd0, 4, 0x31  'Dia del mes
I2CWrite sda, scl, 0xd0, 5, 0x12  'Mes
I2CWrite sda, scl, 0xd0, 6, 0x06  'Año
I2CWrite sda, scl, 0xd0, 7, 0x10  'Salida a 1hz
Endif
'Bucle principal -----------------------------------------------------
main:
Gosub print_lcd  'Actualiza la hora
WaitMs 100  'Pausa de 100mSeg.
Goto main
End                                               
'**************************************Subrutinas**********************************************
print_lcd:  'Lee la hora del RTC, la pasa a decimal y la envia al lcd
i = 0
While i <= 6  'Se repite el codigo comprendido entre while y wend, mientras i sea menor o igual a 6
I2CRead sda, scl, 0xd0, i, reg(i)  'Lectura de la direccion de memoria indicada del RTC, formato BCD
aux_4l = reg(i) And %00001111  'Eliminamos los bit de configuracion del RTC y dejamos solo el nibble bajo
If i = 0 Then aux_4h = reg(i) And %01110000  'Segundos, borrado de bit configuracion y almacena nibble alto
If i = 1 Then aux_4h = reg(i) And %11110000  'Minutos, almacena nibble alto
If i = 2 Then aux_4h = reg(i) And %10110000  'Horas, borrado de bit configuracion y almacena nibble alto
If i = 3 Then aux_4h = reg(i) And %11110000  'Dia_semana, almacena nibble alto
If i = 4 Then aux_4h = reg(i) And %11110000  'Dia_mes, almacena nibble alto
If i = 5 Then aux_4h = reg(i) And %11110000  'Mes, almacena el nibble alto
If i = 6 Then aux_4h = reg(i) And %11110000  'Año, almacena el nibble alto
aux_4h = ShiftRight(aux_4h, 4)  'Convierte el nibble alto en bajo
reg(i) = (aux_4h * 10) + aux_4l  'Fusiona los nibbles alto y bajo en una sola variable en formato decimal
i = i + 1  'Incrementa la variable indice con cada repeticion del bucle While/Wend
Wend  'Fin del bucle y salta a While
Lcdcmdout LcdLine1Home  'Cursor del lcd a la izquierda en la linea 1
If reg(2) < 10 Then Lcdout "0"  'Si horas es inferior a 10 escribe el cero delante
Lcdout #reg(2), ":"  'Escribe la hora y el separador
If reg(1) < 10 Then Lcdout "0"  'Si minutos es inferior a 10 escribe el cero delante
Lcdout #reg(1), ":"  'Escribe los minutos y el separador
If reg(0) < 10 Then Lcdout "0"  'Si segundos es inferior a 10 escribe el cerodelante
Lcdout #reg(0)  'Escribe los segundos
Lcdcmdout LcdLine2Home  'Cursor del lcd a la izquierda en la linea 2
If reg(3) = 1 Then Lcdout "Dom"  'Asigna el literal al dia de la semana
If reg(3) = 2 Then Lcdout "Lun"
If reg(3) = 3 Then Lcdout "Mar"
If reg(3) = 4 Then Lcdout "Mie"
If reg(3) = 5 Then Lcdout "Jue"
If reg(3) = 6 Then Lcdout "Vie"
If reg(3) = 7 Then Lcdout "Sab"
Lcdout "/"  'Escribe separador
If reg(4) < 10 Then Lcdout "0"  'Si dia del mes es inferior a 10 escribe cero
Lcdout #reg(4), "/"  'Escribe el dia del mes y el separador
If reg(5) < 10 Then Lcdout "0"  'Si mes es inferior a 10 escribe cero
Lcdout #reg(5), "/20"  'Escribe el mes, separador y los dos primeros digitos del año de 4 digitos
If reg(6) < 10 Then Lcdout "0"  'Si año es inferior a 10 escribe primero el cero
Lcdout #reg(6)  'Escribe el año
Return

PD: Recuerdo que los registros del RTC DS1307 se programan y se leen en BCD.

PD: 03/06/08
      I2CWrite sda, scl, 0xd0, x, x
      I2CRead sda, scl, 0xd1, x, x
      0xd0 = %11010000 => Seleccion del chip DS1307 y modo escritura
      0xd1 = %11010001 => Seleccion del chip DS1307 y modo lectura
      %1101000x (direccion de seleccion del chip %1101000) siendo "x" el bit indicador de Write/Read. Este bit menos significativo lo controla directamente la funcion I2CWrite y I2CRead, por lo que su valor
      es indiferente, la funcion I2CWrite lo pondra a valor "0" de forma automatica y al ser compilada tambien I2CRead lo colocara a 1.
« Última modificación: 20 de Junio de 2016, 20:16:04 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #72 en: 01 de Enero de 2007, 17:00:09 »
Aquí esta el ejemplo para practicar con el puerto físico RS232 del microcontrolador
es un poco largo pero he intentado aclararlo lo máximo posible con los comentarios en programa.

Este programa requiere mucha velocidad de clock, yo lo utilizo normalmente a 20Mhz



Código: [Seleccionar]
'********************************** PIC Entrenadora BASIC ***************************************
'NOMBRE: 16F88_LCD_RS232_01
'VERSION: 1.0
'MICRO: PIC16F88
'Fecha/Autor: 1/07, By COS, PSI v7.41
'DESCRIPCION: MUESTRA EN EL DISPLAY DE 16x2, LOS CARACTERES RECIBIDOS POR RS232 Y ENVIA OTRA CADENA FIJA
'tiempo de lectura entre byte y byte del puerto serie 10mseg maximo si no hay datos
'************************************************************************************************
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
'Puertos 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_RWREG = PORTA 'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
'Define LCD_RWBIT = 5 'se usara el RA5 como RW (si se suprime el compilador no protesta)
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'**************************************DEFINICION DE PUERTOS*************************************
'Asignacion de 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
'------------------------------------INICIO DEL PUERTO SERIE, TIMER E INTERRUPCIONES------------------
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
TMR1H = 0xf8  'carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x30  'carga el registro del contador para que desborde cada 1mSeg, byte bajo
T1CON.TMR1ON = 1  'habilitacion del TMR1, comienza a incrementarce
PIE1.TMR1IE = 1  'activa las interrupciones del timer1
PIE1.RCIE = 1  'Activa la interrupcion de la USART en modo rx
INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
Lcdinit  'inicializa el LCD sin cursor
Hseropen 4800  'Velocidad del puerto serie e inicializa los comandos de bajo nivel que controlan la USART
'Reasignacion de nombres---------------------------------------
Symbol led_amarillo = PORTA.7  'led amarillo
Symbol led_verde = PORTB.0  'led verde
'--------------------------------------Declaracion DE VARIABLES-------------------------------------
'Variables subrutinas del puerto serie-----------------------------------
Dim assi As Byte  'Contiene el valor de lectura del puerto serie
Dim n_usart As Byte  'Numero de datos del USART y del bufer IMAGEN de control
Dim usart As Byte  'Variable indice que apunta al ultimo dato adquirido por la USART
Dim aux_usart As Byte  'Auxiliar de la variable indice usart del USART
Dim c_serial As Byte  'Como USART pero para la lectura de control del bufer IMAGEN
Dim bufer As Byte  'Indica si hay datos por leer en el bufer USART
Dim w_posrx As Byte  'Tiempo entre lectura y lectura del bufer
Dim n_aux As Byte  'contador para borrar el bufer_soft
'Variables de los timer---------------------------------------------------
Dim aux_pause As Word  'variable auxiiar el PAUSE
Dim pause As Word  'contiene el valor para simular el comando Waitms
Dim timer_1ms As Byte  'base de tiempos se incrementa cada 1mSeg, timer del PAUSE
Dim timer_base As Byte  'tiempo referencia para los timer por soft del programa
Dim timer_base_tiempo As Byte  'contiene el valor del tiempo del timer_base
Dim timer1_ms As Word  'base de tiempos en ms
Dim timer2_ms As Word  'base de tiempos en ms
Dim timer3_ms As Word  'base de tiempos en ms
Dim timer1_100ms As Byte  'base de tiempos msx100
Dim timer2_100ms As Byte  'base de tiempos msx100
Dim timer3_100ms As Byte  'base de tiempos msx100
Dim timer1_ms_tiempo As Word  'contiene el valor del tiempo del timer1_ms
Dim timer2_ms_tiempo As Word  'contiene el valor del tiempo del timer2_ms
Dim timer3_ms_tiempo As Word  'contiene el valor del tiempo del timer3_ms
Dim timer1_100ms_tiempo As Byte  'contiene el valor del tiempo del timer1_100ms
Dim timer2_100ms_tiempo As Byte  'contiene el valor del tiempo del timer2_100ms
Dim timer3_100ms_tiempo As Byte  'contiene el valor del tiempo del timer3_100ms
'Variables rutina muestra datos en el LCD
Dim n As Byte  'se utiliza para posicionar caracter en el lcd
Dim flag As Byte  'controla la alternancia para imprimir en el lcd el caracter "(" o el ")"
Dim flag_1 As Byte  'controla la alternacia entre secuencia 1 y 2, tramas tx
'Variables tipo array puerto serie----------------------------------
Dim usart_imagen(91) As Byte  'Componen el bufer IMAGEN para control del bufer USART
Dim usart_bufer(91) As Byte  'Componen el bufer de la USART de bajo nivel
'ASIGNACIONES-----------------------------------------------
'Variables del contador del TIMER1------------------------------
timer_base = 0
aux_pause = 0
pause = 0
timer_1ms = 0
timer1_ms = 0
timer2_ms = 0
timer3_ms = 0
timer1_100ms = 0
timer2_100ms = 0
timer3_100ms = 0
timer_base_tiempo = 100  'cuenta 100mSeg
timer1_ms_tiempo = 5  'cuenta 5mSeg.
timer2_ms_tiempo = 100  'cuenta 0.1Seg
timer3_ms_tiempo = 100  'cuenta 0.1Seg
timer1_100ms_tiempo = 10  'cuenta 1Seg.
timer2_100ms_tiempo = 5  'temporiza 0.5Seg
timer3_100ms_tiempo = 5  'temporiza 0.5seg
'-------------------------------------Asigna valores a las variables de la rutina del puerto serie--
usart = 0
aux_usart = 0
c_serial = 0
bufer = 0
n_usart = 90
assi = 0
w_posrx = 10  '10mSeg rf, se espera un maximo de tiempo antes de leer el bufer si no hay datos
n_aux = 0
'-------------------------------------AsignA valores a las variables del TIMER1---------------------
'--------------------------------------asignacion de valores generales-----------------------------
n = 0
flag = 0
flag_1 = 0
'----------------------------------------------------------------
'Enable  'INTCON.GIE habilita las interrupciones globales
Gosub clear_bufer  'Borra el BUFFER IMAGEN y por lo tanto tambien al USART, OBLIGATORIO POR LO MENOS UNA VEZ
Enable  'INTCON.GIE habilita todas las interrupciones globales
pause = 1000  'prepara una pausa de 1Seg
Gosub pause_ms  'espera el tiempo que indica pause
Lcdout "18F88_LCD_RS232"  'imprime en el LCD el literal
Lcdcmdout LcdLine2Home  'selecciona linea y cursor al principio
Lcdout "RS232-4800Baud."  'escribe la cadena de literales en el lcd
Hserout CrLf, CrLf, "VER. 1.0 - TX/RX", CrLf, "TX -> PRUEBAS RS232", CrLf, "By COS", CrLf, CrLf  'envia presentacion al RS232
Gosub clear_bufer  'Borra el BUFFER IMAGEN y por lo tanto tambien al USART, OBLIGATORIO POR LO MENOS UNA VEZ
pause = 3000  'prepara una pausa de 3Seg.
Gosub pause_ms  'hace una pausa de tiempo indicado por pause
Lcdcmdout LcdClear  'borra el display
'--------------------------------------Main Programa----------------------------------------------------
main:
If timer2_100ms >= timer2_100ms_tiempo And flag_1 = 0 Then  'determina cuando emitir la secuencia_1
Gosub secuencia_1
timer2_100ms = 0
flag_1 = 1  'activa la alternancia entre secuencia_1 y la 2
Endif
If timer2_100ms >= timer2_100ms_tiempo And flag_1 = 1 Then  'determina cuando emitir la secuencia_2
Gosub secuencia_2
timer2_100ms = 0
flag_1 = 0  'activa la alternancia entre secuencia_1 y la 2
Endif
Gosub lcd_control
Goto main
End                                               
'--------------------------------------FIN DEL MAIN-------------------------------------------
'--------------------------------------Subrutinas Programa-----------------------------------------------
secuencia_1:  'envia la trama por el puerto serie
Hserout "@Hola Amigos de TODOPIC", CrLf
Return                                           
secuencia_2:  'envia la trama por el puerto serie
Hserout "@Ejemplo de Trabajo con RS232", CrLf
Return                                           
pause_ms:  'rutina de espera, rutina tipo Waitms, pause establese el tiempo total en mSeg
aux_pause = 0  'variable auxiliar lleva la cuenta de los ms
timer_1ms = 0  'al borrar el contador se activa y comienza la cuenta de 1mSeg
While aux_pause <= pause  'tiempo en mSeg maximos a contar
aux_pause = aux_pause + 1  'variable auxiliar lleva la cuenta de los ms
If timer_1ms > 0 Then timer_1ms = 0  'al borrar el contador se activa y cuenta 1mSeg
While timer_1ms < 1  'espera un miliesegundo
Wend
Wend
Return                                           
pause_ms_rx:  'rutina de espera antes de leer el bufer, w_posrx establese el tiempo total en mSeg
If bufer < 1 Then
aux_pause = 0  'variable auxiliar lleva la cuenta de los ms
timer_1ms = 0  'al borrar el contador se activa y comienza la cuenta de 1mSeg
While aux_pause <= w_posrx  'tiempo en mSeg maximos a contar
If bufer > 0 Then aux_pause = w_posrx  'si entran datos en el bufer se termina el contaje
aux_pause = aux_pause + 1  'variable auxiliar lleva la cuenta de los ms
If timer_1ms > 0 Then timer_1ms = 0  'al borrar el contador se acitva y cuenta 1mSeg
While timer_1ms < 1  'espera un miliesegundo
Wend
Wend
Endif
Return                                           
'------------------------------ rutinas para el control del bufer del puerto serie-------------
readserial:
'RUTINA DE LECTURA DEL BUFFER DEL PUERTO SERIE (ASSI)
Gosub pause_ms_rx  'valor de entrada en mSeg de espera definido por w_posrx
assi = 0  'se borra el valor de assi, no se debe de utilizar cero como un valor de control
If bufer = 1 Then  'si bufer tiene datos
assi = usart_bufer(c_serial)  'se lee el valor del bufer y se asigna assi
usart_imagen(c_serial) = 0  'se marca como leida para que pueda ser llenada de nuevo
c_serial = c_serial + 1  'se incrementa el indice del bufer
If c_serial >= n_usart Then c_serial = 0  'se verifica si se llego al final del bufer
If usart_imagen(c_serial) = 0 Then bufer = 0  'si no quedan mas datos en el bufer se marca como vacio
Endif
Return                                           
clear_bufer:  'inicializa el bufer imagen y borra error del puerto fisico en modo Rx
'_________________________Borra el error del puerto serie en Rx
RCSTA.OERR = 0
RCSTA.CREN = 0
RCSTA.CREN = 1
'_________________________Borra e inicializa el bufer imagan del puerto serie
c_serial = 0
While c_serial <= n_usart  'se ejecuta tantas veces como variables tiene el bufer
usart_imagen(c_serial) = 0  'borra el indicador de variable del bufer con datos
c_serial = c_serial + 1
Wend
c_serial = 0  'variables de control del bufer
usart = 0
bufer = 0
assi = 0
Return                                           
'--------------------------------------SIBRUTINAS ESPECIALES---------------------------------------------
On Interrupt  'desactiva las interrupciones
Save System  'Guarda los valores del sistema
'*****************************base de tiempos********************************************
If PIR1.TMR1IF = 1 Then  'comprueba que la interrupcion la proboco el timer1
timer_base = timer_base + 1  'base patron
If timer_1ms < 1 Then timer_1ms = timer_1ms + timer_1ms + 1  'contador para control del timer_1ms
If timer1_ms < timer1_ms_tiempo Then timer1_ms = timer1_ms + 1  'contador para control del timer1_ms
If timer2_ms < timer2_ms_tiempo Then timer2_ms = timer2_ms + 1  'contador para control del timer2_ms
If timer3_ms < timer3_ms_tiempo Then timer3_ms = timer3_ms + 1  'contador para control del timer3_ms
If timer_base >= timer_base_tiempo Then  'usa la base patron para retrazar la rutina 100mSeg.
If timer1_100ms < timer1_100ms_tiempo Then timer1_100ms = timer1_100ms + 1  'contador para control...
If timer2_100ms < timer2_100ms_tiempo Then timer2_100ms = timer2_100ms + 1  'contador para control...
If timer3_100ms < timer3_100ms_tiempo Then timer3_100ms = timer3_100ms + 1  'contador para control...
timer_base = 0  'reset a la base timer
Endif
TMR1H = 0xf8  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
TMR1L = 0x30  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
Endif
'*****************************Fin base de tiempos****************************************
'*****************************BUFFER PUERTO SERIE****************************************
If PIR1.RCIF = 1 Then  'comprueba que es esta la interrupcion activa del modulo USAR
If usart < n_usart Then  'comprueba que el bufer de entrada no esta lleno
If usart_imagen(usart) = 0 Then  'comprueba que la posicion esta vacia
aux_usart = usart  'retiene la posicion antigua del bufer
usart = usart + 1  'indica cual sera la posicion siguiente del bufer
usart_imagen(aux_usart) = 1  'indica que hay dato en el bufer de entrada
bufer = 1  'indica que el bufer tine datos
Hserget usart_bufer(aux_usart)  'carga el dato en el bufer
Else
Hserget usart_bufer(n_usart)  'descarga la usart para que no se bloquee porque el bufer de entrada esta lleno
Endif
Else
If usart_imagen(0) = 0 Then  'comprueba que esta vacia la primera posicion del bufer
usart_imagen(0) = 1  'marca que hay dato en esa posicion del bufer
bufer = 1  'marca que el bufer tiene datos
usart = 1  'establece la proxima posicion del bufer
Hserget usart_bufer(0)  'lee la usart y guarda el dato en el bufer
Else
Hserget usart_bufer(n_usart)  'descarga la usart porque el bufer esta lleno
Endif
Endif
Endif
'_________________________Borra el error del puerto serie en Rx
If RCSTA.OERR = 1 Then
RCSTA.OERR = 0
RCSTA.CREN = 0
RCSTA.CREN = 1
'_________________________Borra e inicializa el bufer imagan del puerto serie
c_serial = 0
While c_serial <= n_usart  'se ejecuta tantas veces como variables tiene el bufer
usart_imagen(c_serial) = 0  'borra el indicador de variable del bufer con datos
c_serial = c_serial + 1
Wend
c_serial = 0  'variables de control del bufer
usart = 0
bufer = 0
assi = 0
Endif  '____________________
If PIR1.TMR1IF = 1 Then PIR1.TMR1IF = 0  'borra el bit de salto del timer1
If PIR1.RCIF = 1 Then PIR1.RCIF = 0  'borra el bit de salto del Rx
Resume  'activa las interrupciones y retorna al curso normal del programa antes del salto
lcd_control:  'rutina que imprime los valores recibidos por el puerto serie en el display
'parte 1 de la rutina, sincroniza e imprime los caracteres recibidos por el puerto serie
If bufer = 1 Then  'la rutina se ejecuta si hay datos en el bufer
timer1_100ms = 0  'hay datos hace reset al timer1_100ms
Gosub readserial  'salta a la rutina de lectura del bufer serie
If assi = "@" Then  'caracter de sincronismo de la trama
n = 0  'possicion del display
Lcdcmdout LcdClear  'borra el display y posiciona el cursor superior izquierda
Endif
n = n + 1  'incrementa la posicion para escribir el siguiente caracter en le display
If assi > 31 And assi < 128 And assi <> "@" Then  'filtra los caracteres a imprimir
Lcdout assi  'escribe el caracter del bufer en el display
Endif
If n = 16 Then  'detecta fin de la linea primera
Lcdcmdout LcdLine2Home  'situa el cursor al principio de la siguiente linea
Endif
If n >= 32 Then  'detecta fin de la segunda linea
n = 0  'inicializa la posicion del proximo caracter a imprimir en el display
Lcdcmdout LcdHome  'a inicio de linea
Endif
Endif
'parte 2 de la rutina, cuando no se reciben datos imprime en el display "(" y ")" de forma alterna
If timer1_100ms >= timer1_100ms_tiempo Then  'produce un retrazo inicial a la ejecucion de la rutina
If bufer = 0 Then  'si no hay datos en el bufer
If timer1_ms >= timer1_ms_tiempo Then  'produce un retrazo cada vez que se intenta imprimir en el lcd
timer1_ms = 0  'resetea el timer1_ms para que cuente de nuevo
If flag = 0 Then  'produce la alternancia para escribir "("
n = n + 1
Lcdout "("
If n = 16 Then
Lcdcmdout LcdLine2Home
Endif
If n >= 32 Then
n = 0
flag = 1
Lcdcmdout LcdHome
Endif
Endif
If flag = 1 Then  'produce la alternancia para escribir ")"
n = n + 1
Lcdout ")"
If n = 16 Then
Lcdcmdout LcdLine2Home
Endif
If n >= 32 Then
n = 0
flag = 0
Lcdcmdout LcdHome
Endif
Endif
Endif
Endif
Endif
Return


PD: donde decia:
"Symbol led_amarillo = PORTA.7 'led amarillo a off", es "Symbol led_amarillo = PORTA.7 'led amarillo"
"Symbol led_verde = PORTB.0 'led verde a off", es "Symbol led_verde = PORTB.0 'led verde"
"timer2_100ms_tiempo = 5 'temporiza 1Seg", es "timer2_100ms_tiempo = 5 'temporiza 0.5Seg",
"timer3_100ms_tiempo = 5 'temporiza 1seg", es "timer3_100ms_tiempo = 5 'temporiza 0.5Seg",

Errores de usar "COPY y PASTE" del editor del compilador del basic... :mrgreen:

« Última modificación: 12 de Junio de 2016, 13:59:24 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #73 en: 01 de Enero de 2007, 22:41:54 »
Y ahora mezclando rutinas anteriores mediante la variación de la resistencia ajustable
de la placa, vario la iluminación del lcd.
La señal generara para el control de la iluminación es un PWM de un periodo de 20mSeg.
basado en las bases de tiempos generadas por el Timer1.

Código: [Seleccionar]
'***************** Placa Entrenadora (PIC EBadic) ***************************************
'NOMBRE:16F88_LCD_Timer1_ADC_PWM_01
'MICRO: PIC16F88/8Mhz reloj interno
'Versión: 1.0
'Fecha/Autor: 1/07, By COS, PSI v7.41
'Uso del LCD con bus de datos a 4Bit y sin pin de RW
'Activación del Timer1 por rebose cada 1mSeg.
'implementación de bases de tiempos por soft, basadas en el Timer1
'lectura de entrada analógica y conversión a voltaje con dos decimales
'Implementacion de PWM con periodo de 20mseg. para el control de la luz del lcd por medio de la entrada adc
'***********************************************************************************
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
'-------------------------------------Puertos del LCD-------------------------------------
Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display.
'------------------------------------Definición de puertos------------------------------------------
ANSEL = %00010000  'Los pin I/O digitales y RA4 analogico
Define ADC_SAMPLEUS = 10  'Configuracion del ADC
Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg, configuracion ADC
'_______________Registros afectados por Define ADC_CLOCK y ADCIN________________
'ANSEL = %00010000  'Los pin I/O digitales y RA4 analogico
'ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
'ADCON1 = %01000000  'Voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1
'_______________________________________________________________________________
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
CMCON = 0x07  'Comparador a off
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)
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off, negado
PORTB.0 = 1  'Led verde a off, negado
'Inicialización de Interrupciones-----------------------------
T1CON.TMR1CS = 0  'Asigna el reloj interno al timer1, se incrementa cada ciclo de instrucción
T1CON.T1CKPS0 = 0  'Factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0  'Factor del preescales del timer1, 0
TMR1H = 0xf8  'Carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x30  'Carga el registro del contador para que desborde cada 1mSeg, byte bajo
T1CON.TMR1ON = 1  'Habilitación del TMR1, comienza a incrementarse
PIE1.TMR1IE = 1  'Activa las interrupciones del timer1
INTCON.PEIE = 1  'Bit de habilitacion de interrupciones de perifericos
'Enable  'INTCON.GIE habilita todas las interrupciones globales
'Inicio-------------------------------------------------------
Lcdinit  'Inicializa el lcd sin cursor
WaitMs 500  'Pausa para estabilizar
'Reasignación de nombres---------------------------------------
Symbol led_amarillo = PORTA.7  'Led amarillo
Symbol led_verde = PORTB.0  'Led verde
Symbol luz_lcd = PORTB.3  'Retroiluminacion del lcd
'Declaracion de variables --------------------------------------
'Variables de los timer -----------------------------------------
Dim timer_base As Byte  'Tiempo referencia para los timer por soft del programa
Dim timer_base_tiempo As Byte  'Contiene el valor del tiempo del timer_base
Dim timer1_ms As Word  'Base de tiempos en ms
Dim timer2_ms As Word  'Base de tiempos en ms
Dim timer3_ms As Word  'Base de tiempos en ms
Dim timer1_100ms As Byte  'Base de tiempos msx100
Dim timer2_100ms As Byte  'Base de tiempos msx100
Dim timer3_100ms As Byte  'Base de tiempos msx100
Dim timer1_ms_tiempo As Word  'Contiene el valor del tiempo del timer1_ms
Dim timer2_ms_tiempo As Word  'Contiene el valor del tiempo del timer2_ms
Dim timer3_ms_tiempo As Word  'Contiene el valor del tiempo del timer3_ms
Dim timer1_100ms_tiempo As Byte  'Contiene el valor del tiempo del timer1_100ms
Dim timer2_100ms_tiempo As Byte  'Contiene el valor del tiempo del timer2_100ms
Dim timer3_100ms_tiempo As Byte  'Contiene el valor del tiempo del timer3_100ms
'Variables del ADC y Rutina division------------------------------
Dim num_1 As Word  'Valor del adc y retorna la parte entera
Dim num_2 As Word  'Factor de la escala y retorna el primer decimal
Dim num_3 As Word  'Segundo decimal
'Variables generales-----------------------------------------------
Dim flag_1 As Byte  'Determina si la luz del lcd estará a on o a off
Dim adc_4 As Word  'Contiene el valor de la entrada ADC
'Asignacion de valores a las variables--------------------------
timer_base = 0
timer1_ms = 0
timer2_ms = 0
timer3_ms = 0
timer1_100ms = 0
timer2_100ms = 0
timer3_100ms = 0
timer_base_tiempo = 100  'Cuenta 100mSeg
timer1_ms_tiempo = 1  'Cuenta 1mSeg.
timer2_ms_tiempo = 19  'Cuenta 19mSeg
timer3_ms_tiempo = 5  'Cuenta 5mSeg
timer1_100ms_tiempo = 10  'Cuenta 1 Seg.
timer2_100ms_tiempo = 20  'Temporiza 2Seg
timer3_100ms_tiempo = 1  'Temporiza 0.1seg
flag_1 = 0
adc_4 = 0
Enable  'INTCON.GIE habilita todas las interrupciones globales
'Rutinas Pricipal----------------------
main:
If timer1_100ms >= timer1_100ms_tiempo Then  'Cambio de estado el pin RA7 cada timer1_100ms_tiempo
Toggle led_amarillo
timer1_100ms = 0  'Reinicio el timer1_ms
Endif
If timer2_100ms >= timer2_100ms_tiempo Then  'Cambio de estado el pin RB0 cada timer2_100ms_tiempo
Toggle led_verde
timer2_100ms = 0  'Reinicio el timer2_100ms
Endif
If timer3_100ms >= timer3_100ms_tiempo Then
Gosub lee_adc  'Salto con retorno, rutina de lectura de la entrada ADC
Gosub division_dos_decimales  'Salto con retorno, rutina de conversion de valor adc a voltios
Gosub print_lcd  'Salto con retorno, rutina que imprime los valores en el lcd
timer3_100ms = 0
'__________Control de los tiempos del PWM con un periodo de 20mSeg segun el valor de adc_4
timer2_ms_tiempo = (adc_4 * 20) / 1023  'Controla el tiempo del PWM en estado alto, periodo 20mSeg
timer1_ms_tiempo = 20 - timer2_ms_tiempo  'Controla el tiempo del PWM en estado bajo, periodo 20mSeg
'___________________________________________________
Endif
Goto main  'Impide que termine el programa principal
End  'Especifica donde termina la rutina principal y comienzan las subrutinas y funciones
'Subrutina lectura ADC, division y LCD
lee_adc:  '_______________________Lee la entrada analogica
Dim aux As Long
Adcin 4, adc_4  'Lee el valor de la entrada analogica y lo carga en adc_4
aux = (500 * adc_4) / 1023
num_1 = aux  'Sede el valor del adc para ser procesado
Return                                           
division_dos_decimales:  '________Rutina division con dos decimales y conversion a voltios
Dim resto As Word
Dim dvdo As Word
Dim dvsor As Word
dvdo = num_1  'Asigna dividendo
dvsor = 100  'Asigna divisor, dos decimales
num_1 = dvdo / dvsor  'Calcula parte entera
resto = dvdo Mod dvsor  'Calcula resto
If resto = 0 Then Return  'Se sale de la subrutina
num_2 = resto / 10  'Asigna primer decimal
num_3 = resto - (num_2 * 10)  'Asigna el segundo decimal
Return                                           
print_lcd:  '____________________Muestra los datos por el display
Lcdcmdout LcdLine1Clear  'Borra la primera linea y cursor al principio
Lcdout "ADC ", #adc_4, " ", #num_1, ".", #num_2, #num_3, "V", "   "  'Muestra los datos en el lcd
Lcdcmdout LcdLine2Clear  'Borra la segunda linea y cursor al principio
Lcdout "LCD On ", #timer2_ms_tiempo, " Off ", #timer1_ms_tiempo, " "  'Muestra los datos en el lcd
Return                                           
'--------------------------------Interrupciones---------------------------------------------------
On Interrupt  'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
Save System  'Guarda los valores del sistema para poder reemprender el curso normal del programa
If PIR1.TMR1IF = 1 Then  'Comprueba que la interrupcion del timer1 es activa
TMR1H = 0xf8  'Recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
TMR1L = 0x30  'Recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
'__________________Base de tiempos
timer_base = timer_base + 1
If timer1_ms < timer1_ms_tiempo Then timer1_ms = timer1_ms + 1
If timer2_ms < timer2_ms_tiempo Then timer2_ms = timer2_ms + 1
If timer3_ms < timer3_ms_tiempo Then timer3_ms = timer3_ms + 1
If timer_base >= timer_base_tiempo Then
If timer1_100ms < timer1_100ms_tiempo Then timer1_100ms = timer1_100ms + 1
If timer2_100ms < timer2_100ms_tiempo Then timer2_100ms = timer2_100ms + 1
If timer3_100ms < timer3_100ms_tiempo Then timer3_100ms = timer3_100ms + 1
timer_base = 0
Endif
'_________________Control fisico de la retroiluminaicon del lcd
If timer1_ms >= timer1_ms_tiempo And flag_1 = 0 Then  'Tiempo en el que estara el lcd apagado
luz_lcd = 1  'Retroiluminacion a on
flag_1 = 1  'Controla la alternancia entre lcd iluminado o apagado
timer2_ms = 0  'Reinicio el timer2_ms
Endif
If timer2_ms >= timer2_ms_tiempo And flag_1 = 1 Then  'Tiempo en el que estara el lcd iluminado
luz_lcd = 0  'Retroiluminacion a off
flag_1 = 0  'Controla la alternancia entre lcd iluminado o apagado
timer1_ms = 0  'Reinicio el timer1_ms
Endif
'_____________________________________________________
PIR1.TMR1IF = 0  'Borra el flag de salto del tmr1
Endif
Resume  'Activa las interrupciones y retorna al curso normal del programa antes del salto

PD: Donde decia:
"timer2_ms_tiempo = 19   'cuenta 1mSeg", ahora dice "timer2_ms_tiempo = 19   'cuenta 19mSeg"
« Última modificación: 13 de Junio de 2016, 20:32:15 por dogflu66 »
Saludos desde Granada, España.

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #74 en: 01 de Enero de 2007, 23:37:37 »
Este Proyecto refleja de manera al parecer "sencilla" cosa que no lo es tanto, los alcances del BASIC y que decir del maestrazo DOGFLU y su sabiduria. Enhorabuena y excelente proyecto :-/ !!!!
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."


 

anything