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

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3559
Re:PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)
« Respuesta #825 en: 08 de Abril de 2026, 21:03:35 »
Conexión electrica del módulo HW-084 con el Pic18F46K22:
« Última modificación: 25 de Abril de 2026, 05:30:02 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3559
Re:PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)
« Respuesta #826 en: 04 de Mayo de 2026, 08:46:13 »
🔧 Módulo GY-21 (I²C) con sensor HTU21D para lectura de temperatura y humedad relativa

Comparto librería desarrollada para trabajar con el módulo GY-21, basado en el sensor digital HTU21D, para lectura de temperatura y humedad relativa mediante bus I²C.

Se incluyen:
✅ Librerías de soporte
✅ Ejemplos de prueba
✅ Lectura en modo Hold Master y No Hold Master

Versión probada con:
    • Microcontrolador: PIC18F46K22 @ 64 MHz
    • Tarjeta entrenadora: HL-K18
    • Entorno de desarrollo: PIC18 Basic Compiler v6.10

📌 Sobre el sensor HTU21D
El HTU21D es un sensor digital calibrado en fábrica, de bajo consumo y buena precisión, muy utilizado en aplicaciones embebidas.

Rango de medida
Temperatura:
    • -40°C a +125°C (±0.3).
Humedad relativa:
    • 0 a 100 %RH (±3%).

📡 Dirección I²C
Dirección base de 7 bits:
0x40
Direcciones equivalentes de 8 bits:
Escritura: 0x80   ' (0x40 << 1) + 0
Lectura  : 0x81   ' (0x40 << 1) + 1

⚙️ Modos de funcionamiento
El HTU21D permite trabajar en dos modos:
1️⃣ Hold Master Mode
Comandos:
Temperatura: 0xE3
Humedad   : 0xE5
En este modo:
    • El maestro envía el comando de medición.
    • El sensor puede mantener la línea SCL a nivel bajo mientras realiza la conversión interna.
    • El bus I²C queda temporalmente bloqueado.
    • Cuando finaliza la conversión, el sensor libera la línea SCL y la lectura continúa.
Este mecanismo se conoce como:
Clock Stretching (estiramiento de reloj)
⚠️ Para usar este modo, la librería I²C debe soportar clock stretching.

2️⃣ No Hold Master Mode
Comandos:
Temperatura: 0xF3
Humedad   : 0xF5
En este modo:
    • El maestro envía el comando de medición.
    • El sensor realiza la conversión internamente.
    • El bus I²C permanece libre.
    • El maestro debe esperar el tiempo de conversión o realizar ACK polling antes de leer.
Tiempos máximos de conversión (máxima resolución)
    • Temperatura (14 bits): ~50 ms
    • Humedad (12 bits): ~16 ms

📦 Formato de los datos
El sensor devuelve:
    • 2 bytes de datos
    • 1 byte CRC opcional
Los dos bits menos significativos contienen bits de estado y deben ponerse a cero antes de aplicar las fórmulas:
rawValue = rawValue And 0xFFFC
Donde rawValue contiene inicialmente el valor sin procesar entregado por el sensor.

🧮 Fórmulas de conversión
Temperatura
T = -46.85 + (175.72 * rawValue / 65536)
Humedad relativa
RH = -6 + (125 * rawValue / 65536)

🔌 Conexión usada
Módulo GY-21 con PIC18F46K22
VCC → 3.3V/5V*
GND → GND
SDA → RC4 (MSSP)
SCL → RC3 (MSSP)
⚠️ El chip HTU21D trabaja hasta 3.6V máximo.
Si se alimenta el módulo a 5V, conviene verificar que el módulo usado incorpora regulación y adaptación de niveles.

📚 Librerías necesarias

_I2CLib.bas  → Librería I²C hardware para el módulo MSSP del PIC.
_HTU21DLib.bas  → Librería específica para el sensor HTU21D.

Funciones principales:

Inicialización
HTU21D_Init()

Lectura en No Hold Master
HTU21D_RequestMeasurement(cmd)
temperature = HTU21D_ReadTemp(...)
humidity = HTU21D_ReadHum(...)

Lectura en Hold Master
Clock_Stretch_I2C(timeout)
temperature = HTU21D_ReadTemp(...)
Clock_Stretch_I2C(timeout)
humidity = HTU21D_ReadHum(...)
Clock_Stretch_I2C(0)

⚠️ Clock_Stretch_I2C() pertenece a la librería I²C.

💻 Ejemplo de uso

No Hold Master
HTU21D_RequestMeasurement(HTU21D_CMD_TEMP)
WaitMs 50
temperature = HTU21D_ReadTemp(HTU21D_CMD_TEMP)
HTU21D_RequestMeasurement(HTU21D_CMD_HUM)
WaitMs 16
humidity = HTU21D_ReadHum(HTU21D_CMD_HUM)

Hold Master
Clock_Stretch_I2C(50) ' The slave can lock the clock for up to 50 ms.
temperature = HTU21D_ReadTemp(HTU21D_CMD_TEMP_HM)
Clock_Stretch_I2C(16) ' The slave can lock the clock for up to 16 ms.
humidity = HTU21D_ReadHum(HTU21D_CMD_HUM_HM)
Clock_Stretch_I2C(0) ' Disable

📂 Archivos incluidos
    • Test_HTU21D.bas → Programa principal de prueba
    • _Pic18F46K22Lib.bas → Configuración del PIC
    • _I2CLib.bas → Librería I²C hardware
    • _HTU21DLib.bas → Librería específica del sensor

Los resultados se muestran por UART.

Diagrama de conexiones:
« Última modificación: 04 de Mayo de 2026, 13:13:03 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3559
Re:PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)
« Respuesta #827 en: 04 de Mayo de 2026, 08:51:25 »
Lecturas HTU21D:
« Última modificación: 04 de Mayo de 2026, 08:56:09 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3559
Re:PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)
« Respuesta #828 en: 08 de Septiembre de 2026, 22:17:01 »
Librería para el control de displays LED alfanuméricos
basados en el chip VK16K33 I²C para Oshonsoft PIC18


Versión probada con:
    • Microcontrolador: PIC18F46K22 @ 64 MHz
    • Tarjeta entrenadora: HL-K18
    • Entorno de desarrollo: PIC18 Basic Compiler v6.10

Introducción al circuito integrado VK16K33

El VK16K33 es un controlador multifunción para displays LED fabricado por VinKa,
compatible con el conjunto de instrucciones del conocido HT16K33. Integra todos
los elementos necesarios para controlar displays LED multiplexados, incluyendo el
oscilador interno, la memoria de pantalla (Display RAM), el control de brillo mediante
PWM, el parpadeo por hardware y el escaneo de teclados matriciales.
La comunicación con el microcontrolador se realiza mediante el bus I²C, por lo que
únicamente son necesarias dos líneas de comunicación independientemente del
número de dígitos del display.
El circuito integrado puede controlar hasta 128 LED, organizados como 16 salidas
de segmentos × 8 salidas comunes, siendo adecuado para una gran variedad de
módulos comerciales, entre ellos:

    • Displays numéricos de 7 segmentos.
    • Displays alfanuméricos de 14 y 15 segmentos.
    • Matrices LED.
    • Paneles de indicadores personalizados.
    • Sistemas con teclado matricial.

Una de sus principales ventajas es que el multiplexado del display es realizado
completamente por el propio circuito integrado, liberando al microcontrolador de
esta tarea y reduciendo considerablemente el tiempo de proceso necesario para
mantener actualizado el display.
Particularmente este módulo por defecto se encuentra con la dirección I2C
preestablecida 0x70, tiene 3 puentes (A0, A1 y A2) para cambiar la dirección,
esto permite que se puedan colocar y controlar varios módulos iguales con distinta
dirección en el mismo bus I2C.

Nota: solo he podido encontrar en el mercado módulos compuestos por 4 dígitos
(14 segmentos + punto decimal por dígito), así que las pruebas se realizaron sobre
este formato.

Funcionamiento de la librería
Esta librería ha sido desarrollada específicamente para Oshonsoft PIC18 BASIC.
En lugar de escribir directamente sobre el display, todas las operaciones se realizan
inicialmente sobre una memoria RAM local (VK16K33_RAM) que actúa como framebuffer.
El contenido únicamente se envía al display cuando se ejecuta la función VK16K33_Update().
Este método proporciona numerosas ventajas:

    • Actualización completa del display sin parpadeos.
    • Posibilidad de modificar varios caracteres antes de refrescar la pantalla.
    • Reducción del tráfico sobre el bus I²C.
    • Implementación sencilla de efectos de visualización como desplazamientos de texto.

La librería incorpora una tabla con la mayoría de caracteres para displays alfanuméricos
de 14 segmentos más punto decimal, permitiendo representar letras mayúsculas
(minúsculas no implementado), números y los símbolos más habituales.
También incorpora una función de desplazamiento circular de texto de derecha a izquierda.
A diferencia de otros algoritmos de scroll, el primer carácter aparece inmediatamente sobre
el dígito situado más a la derecha y los siguientes caracteres se van incorporando
progresivamente hasta completar el display. Una vez lleno, el desplazamiento continúa
reutilizando los caracteres de la propia cadena, sin insertar espacios ni caracteres adicionales,
obteniendo un desplazamiento continuo y totalmente circular.
Cada llamada a la función de scroll realiza exactamente un único desplazamiento, siendo el
programa principal el encargado de controlar la velocidad del efecto mediante temporizadores
o retardos.

Nota: al usar la función scroll para mostrar información que ocupa más de 4 dígitos hace que
la utilidad del módulo se vea muy ampliada.

Funciones principales de la librería
Inicialización
VK16K33_Init()

Inicializa el controlador VK16K33, activa el oscilador interno, habilita el display,
configura el nivel de brillo por defecto y limpia la memoria de pantalla.

Actualización del display
VK16K33_Update()

Transfiere el contenido completo del framebuffer al display mediante el bus I²C.

Control del display
VK16K33_Clear()

Borra el framebuffer y actualiza el display.
VK16K33_Clear_RAM()
Borra únicamente el framebuffer sin actualizar el display.
VK16K33_Set_Brightness(nivel)
Configura el brillo del display mediante uno de los dieciséis niveles PWM disponibles.
VK16K33_Set_Blink(modo)
Activa o desactiva el parpadeo por hardware del controlador.
Para modo = 0 a 3 (blink: 0 = off, 3 = 2 Hz, 2 = 1 Hz, 1 = 0.5 Hz).

Escritura de caracteres
VK16K33_PutC(caracter)
Escribe un carácter en la posición actual del cursor.
VK16K33_Print(cadena)
Escribe una cadena ASCII completa.
VK16K33_DpMode(bit)
Trata el "." como punto decimal, no ocupa digito.
VK16K33_PadLeft(" ", ByRef String)
Rellena una cadena por la izquierda con el carácter indicado hasta completar
los 4 dígitos del display.
El número de dígitos se establece mediante la constante de librería VK16K33_Digits.
Resulta útil para alinear valores a la derecha o añadir ceros/espacios iniciales.

Gestión del cursor
VK16K33_Cursor(posición)
Selecciona la posición donde se escribirá el siguiente carácter.
VK16K33_CursorHome()
Sitúa el cursor en el primer dígito del display.

Desplazamiento de texto
VK16K33_ScrollReset()

Reinicia el motor de desplazamiento para comenzar una nueva cadena.
VK16K33_ScrollLeft(cadena)
Realiza un único desplazamiento circular de derecha a izquierda.
Durante las primeras llamadas el display se va completando progresivamente desde la derecha.
Una vez ocupado por completo, el desplazamiento continúa reutilizando los caracteres de la propia
cadena, generando un efecto continuo sin añadir espacios ni caracteres artificiales.

Aplicaciones
Gracias a la sencillez de la interfaz I²C y al multiplexado interno realizado por el VK16K33,
esta librería resulta especialmente adecuada para:

    • Relojes digitales.
    • Frecuencímetros.
    • Voltímetros y amperímetros.
    • Termómetros.
    • Instrumentación electrónica.
    • Automatización industrial.
    • Domótica.
    • Paneles informativos.
    • Indicadores alfanuméricos de propósito general.

El reducido tiempo de proceso requerido permite utilizar esta librería incluso en microcontroladores
PIC de gama básica con módulo MSSP configurado en modo I2C, dejando prácticamente toda la
capacidad de proceso disponible para la aplicación principal.

Archivos adjuntos:
Main_Test_VK16K33_I2C.bas: Archivo de test
VK16K33_I2C.bas: Librería para controlar el display
_I2CLib.bas: Librería I2C por hardware
_Pic18F46K22Lib.bas: Facilita la configuración del Pic.
« Última modificación: 10 de Septiembre de 2026, 15:36:20 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3559
Re:PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)
« Respuesta #829 en: 09 de Septiembre de 2026, 08:24:36 »
Adjunto video de test para el display 4 dígitos alfanuméricos con driver VK16K33:

Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3559
Re:PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)
« Respuesta #830 en: 09 de Septiembre de 2026, 10:28:20 »
Utilidad para crear máscaras de segmentos para VK16K33

He preparado una pequeña utilidad para facilitar la creación y comprobación de las máscaras de caracteres utilizadas en displays
alfanuméricos de 15 segmentos controlados mediante el VK16K33.
Cuando se trabaja con este tipo de display, crear manualmente la tabla de caracteres puede resultar algo incómodo,
especialmente con letras y símbolos que utilizan los segmentos diagonales y centrales. La finalidad de este programa es poder
seleccionar los segmentos mediante sus nombres y comprobar gráficamente el resultado antes de incorporar la máscara definitiva a la librería.
El programa está realizado en Oshonsoft PIC18 Basic y utiliza un GLCD 128x64 con controlador KS0108 para representar gráficamente el carácter.

Distribución de segmentos

El módulo VK16K33 utilizado tiene la siguiente correspondencia entre bits y segmentos:
Bit:           15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0
Segment:  nc  dp    l    m    n    j    h   g   k   p   f    e   d   c   b   a

El bit 15 no está conectado (nc), por lo que quedan disponibles los 14 segmentos del carácter más el punto decimal.

La disposición física utilizada es la siguiente:

                                a
                   ***************
                   * *        *        * *
                   *  *       *       *  *
                f  *    g     h     j     * b
                   *     *    *    *     *
                   *       *  *  *       *
                     **p***  ***k**
                   *       *  *  *       *
                   *     *    *    *     *
                e  *   n     m     l    * c
                   *  *       *       *  *
                   * *        *        * *
                   ***************  * dp
                               d

Cada segmento está definido mediante una constante:

Const  dp  = 0x4000
Const _l    = 0x2000
Const _m  = 0x1000
Const _n   = 0x0800
Const _j    = 0x0400
Const _h   = 0x0200
Const _g   = 0x0100
Const _k   = 0x0080
Const _p   = 0x0040
Const _f    = 0x0020
Const _e   = 0x0010
Const _d   = 0x0008
Const _c   = 0x0004
Const _b   = 0x0002
Const _a   = 0x0001

De esta forma, para crear un carácter solamente hay que combinar los segmentos deseados mediante Or o |.

Por ejemplo, para representar el carácter "8":

maskStr = "0x" + HexStr(mask = _a | _b | _c | _d | _e | _f | _p | _k)

Si se desea expresarlo de un modo más clásico seria:

mask = _a or _b or _c or _d or _e or _f or _p or _k
maskStr = "0x" + HexStr(mask)


El resultado es:

8 -> 0x00FF

y su representación binaria:

nc dp  l  m  n   j  h  g  k  p  f   e  d  c  b  a
  0  0  0  0  0  0  0  0  1  1  1  1  1  1  1  1

También se pueden crear fácilmente caracteres que utilicen segmentos diagonales. Por ejemplo:

mask = _g | _h | _j | _n | _m | _l | _p | _k

corresponde a:

* -> 0x3FC0

Representación gráfica

La función:

VK16K33_DrawDigit(pos, mask)

representa gráficamente en el KS0108 el carácter correspondiente a la máscara de 16 bits.

Internamente se comprueba cada bit de la máscara y se llama a:

VK16K33_DrawSegment(pos, segment)

Que dibuja cada uno de los segmentos horizontales, verticales o diagonales.
El programa permite representar hasta cuatro dígitos virtuales sobre el GLCD, para pos = 0 a 3,
aunque para crear las máscaras normalmente basta con utilizar uno pos = 0.

Además de la representación gráfica, la máscara hexadecimal y el estado individual de cada bit se
envían también por el puerto serie, lo que facilita copiar directamente el valor obtenido a la tabla de
caracteres de la librería.

La idea es utilizar esta pequeña herramienta para ir creando y comprobando visualmente todos los números,
letras y símbolos que posteriormente formarán la tabla de caracteres del display VK16K33.

Adjunto el código completo por si puede resultar útil a alguien que esté trabajando con este controlador o con
displays alfanuméricos de 14/15 segmentos.

Nota: en principio tenia pensado realizar este programa para que solo trabajara sobre el simulador, para que
sea lo más simple posible, pero al final lo he completado con todas las configuraciones necesarias del microcontrolador
para que trabaje también sobre circuito real, así que también lo he probado en la realidad sobre una tarjeta y funciona correctamente.

Resultado que muestra el simulador y archivos necesarios:

Archivos adjuntos:
VK16K33_SegsMask.bas: Archivo de test (main).
CLib.bas: Librería varias funciones.
Font_01.bas: Font, tipo de texto usado.
_Pic18F46K22Lib.bas: Facilita la configuración del Pic.
« Última modificación: 09 de Septiembre de 2026, 10:51:07 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3559
Re:PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)
« Respuesta #831 en: 09 de Septiembre de 2026, 11:50:45 »
## Prácticas con el módulo CCP en modo PWM

Aunque no está directamente relacionado con el tema tratado sobre el **VK16K33**, el programa utilizado para
facilitar la generación de caracteres para el display de 4 dígitos con VK16K33 ha sido probado sobre una tarjeta
que utiliza el módulo **CCP5**, asociado al **Timer2**, para generar una señal PWM destinada al control de
la iluminación de fondo (*backlight*) del display.

Aprovecho para comentar que el simulador realiza una buena simulación de este módulo, por lo que también
puede resultar útil para realizar prácticas y experimentar con el funcionamiento del PWM sin necesidad de
utilizar inicialmente el hardware real.

La configuración rápida del módulo CCP se realiza utilizando las funciones incluidas en la librería
`_Pic18F46K22Lib.bas`.

Esta es la configuración utilizada:

' ***************************************************
' CCP5 -> Timer2 -> LATE.2
' PWM control for display backlight and LEDs.
' ***************************************************

Call _Setup_TMR2(TMRx_ON | TMRx_PRS_16, 255)

Call _Setup_CCP5(_ECCP_PWM) ' PWM mode.

Call _Setup_CCP_4_5_Timers(_CCP5_TIMER1_TIMER2)

Call _Set_Pwm5_duty(300)

TRISE.2 = 0

' ***************************************************

Mediante:

Call _Set_Pwm5_duty(x)

Se modifica el **ciclo de trabajo (*duty cycle*)** de la señal PWM generada en el pin `LATE.2`, es decir,
la relación entre el tiempo que la señal permanece en estado alto y el período total de la señal.

De esta forma es posible variar, por ejemplo, la intensidad de la iluminación de fondo del display
simplemente modificando el valor de `x`.

Adjunto también una captura del módulo **osciloscopio del simulador**, donde puede observarse
la señal PWM generada por el módulo CCP5.

Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3559
Re:PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)
« Respuesta #832 en: 13 de Septiembre de 2026, 17:47:10 »
Para el control mediante PWM se ha priorizado la resolución de 10 bits frente a
la frecuencia, manteniendo esta última lo suficientemente elevada como para evitar
parpadeos perceptibles o molestos en la retroiluminación del GLCD.

Los pasos para obtener los valores de configuración son los siguientes:

Para frecuencia de reloj de 64 MHz:
Con F_osc = 64 MHz, PR2 = 255 y prescaler de Timer2 = 1:16:

F_pwm = F_osc / [4 * (PR2 + 1) * Prescaler]

Sustituyendo:
F_pwm = 64.000.000 / [4 * 256 * 16] = 3906,25 Hz

Por tanto, la configuración genera:
PWM: 3,90625 kHz
Período correspondiente (T): 1 / 3,90625 kHz = 0,256 ms = 256 us

Configuración:
Código: [Seleccionar]
' ***************************************************
' CCP5 -> Timer2 -> LATE.2
' PWM control for display backlight and LEDs.
'
' Fosc              = 64 MHz
' Timer2 prescaler  = 1:16
' PR2               = 255
' PWM frequency     = 3.90625 kHz
' PWM period        = 0.256 ms
' PWM resolution    = 10 bits
' Duty range        = 0..1023
' ***************************************************
Call _Setup_TMR2(TMRx_ON | TMRx_PRS_16, 255)
Call _Setup_CCP5(_ECCP_PWM) ' PWM mode.
Call _Setup_CCP_4_5_Timers(_CCP5_TIMER1_TIMER2)
Call _Set_Pwm5_Duty(100) ' -> ≈ 10 %
TRISE.2 = 0

Resultado:
F_osc: 64 MHz
Timer2 prescaler: 1:16
PR2: 255
Frecuencia PWM: 3,90625 kHz
Período PWM: 0,256 ms
Resolución: 10 bits
Rango de _Set_Pwm5_Duty(x): 0–1023
_Set_Pwm5_Duty(100) -> ≈ 10 %


Para frecuencia de reloj de 8 MHz:
Con F_osc = 8 MHz, PR2 = 255 y prescaler de Timer2 = 1:16:

F_pwm = 8.000.000 / [4 * 256 * 16] = 488,28125 Hz

Por tanto, la configuración genera:
PWM: 0,48828125 kHz
Período correspondiente (T): 1 / 0,48828125 kHz = 2,048 ms

Con F_osc = 8 MHz, manteniendo exactamente la misma configuración:
Código: [Seleccionar]
' ***************************************************
' CCP5 PWM:
' Fosc              = 8 MHz
' Timer2 prescaler  = 1:16
' PR2               = 255
' PWM frequency     = 0.48828125 kHz
' PWM resolution    = 10 bits (0..1023)
' ***************************************************
Call _Setup_TMR2(TMRx_ON | TMRx_PRS_16, 255)
Call _Setup_CCP5(_ECCP_PWM)
Call _Setup_CCP_4_5_Timers(_CCP5_TIMER1_TIMER2)
Call _Set_Pwm5_Duty(100) ' -> ≈ 10 %
TRISE.2 = 0

Resultado:
F_osc: 8 MHz
Timer2 prescaler: 1:16
PR2: 255
Frecuencia PWM: 488,28 Hz
Período PWM: 2,048 ms
Resolución: 10 bits
Rango de _Set_Pwm5_Duty(x): 0–1023
_Set_Pwm5_Duty(100) -> ≈ 10 %



Conclusión y validación en hardware

El cambio de 64 MHz a 8 MHz no modifica la resolución ni el rango del ciclo de trabajo
(duty cycle), ya que se mantiene PR2 = 255. Esta combinación es idónea debido a que
PR2 = 255 permite aprovechar los 10 bits completos de resolución del PWM; únicamente
se reduce la frecuencia de la señal en un factor de 8:

3906,25 / 8 = 488,28125 Hz

Tras realizar un barrido con Call _Set_Pwm5_Duty(0 a 1023) sobre el hardware, el
osciloscopio corrobora los cálculos para ambas frecuencias de reloj con un margen de
error mínimo.

Por lo tanto, queda verificado empíricamente que:
• Con PR2 = 255, el parámetro de duty de CCP5 utiliza el rango completo de 0 a 1023.
• A F_osc = 64 MHz, la frecuencia del PWM es de 3,90625 kHz.
• A F_osc = 8 MHz, la frecuencia del PWM es de 488,28125 Hz.
• El barrido 0..1023 cubre la totalidad de los 10 bits de resolución disponibles.
Los valores para la retroiluminación en el rango de 100 a 300 para este GLCD van bien.
Siendo fijados mediente la función _Set_PWM5_Duty(100 a 300), que equivale
aproximadamente del 10 al 30 % del ciclo de trabajo, asumiendo una tensión de
alimentación de 5 V.
« Última modificación: 13 de Septiembre de 2026, 17:58:51 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3559
Re:PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)
« Respuesta #833 en: 14 de Septiembre de 2026, 08:45:54 »
LCD alfanumérico de 10 dígitos y 16 segmentos con controlador TM1622

Versión probada con:
    • Microcontrolador: PIC18F46K22 @ 64 MHz
    • Tarjeta entrenadora: HL-K18
    • Entorno de desarrollo: PIC18 Basic Compiler v6.10

Adjunto una librería para controlar un display LCD cristal líquido alfanumérico de 10 dígitos y 16
segmentos basado en el TM1622, utilizando Oshonsoft PIC18 Basic.
Se incluyen versión con comunicación serie por software similar a SPI, se usa SPI por software
porque el TM1622 no es compatible con los módulos hardware SPI de los Pic de 8 bits.
El display dispone de 10 dígitos de 16 segmentos y 9 puntos decimales independientes. Como no he
encontrado documentación sobre el conexionado interno de este módulo concreto, ha sido necesario
determinar experimentalmente el mapa de los dígitos, segmentos y puntos decimales.

La disposición para los 16 segmentos de este módulo es:
Segment: G1    F    H  A1  D1   E   M   N   K   B   J  A2  D2   C   L  G2
Bit:           15  14  13  12   11  10  9    8   7   6   5    4    3   2   1    0

                         G1-F-H-A1-D1-E-M-N-K-B-J-A2-D2-C-L-G2

                                            A1             A2
                                       *******    *******
                                       * *         *         * *
                                       *  *        J        *   *
                                  F   *    H      *      K    *  B
                                       *     *     *     *     *
                                       *       *   *   *       *
                                       **G1***   ***G2**
                                       *       *   *   *       *
                                       *     *     *     *     *
                                  E   *   N       *      L    *  C
                                       *  *        M       *  *
                                       * *         *         * *
                                       *******   *******  * DP
                                          D1             D2

Los puntos decimales (DP) no forman parte del mapa de caracteres de 16 segmentos del módulo.
Se controlan de forma independiente mediante diferentes bits de la memoria RAM.

Funciones principales de la librería

Inicialización

TM1622_Init()
Inicializa el controlador TM1622, configura registros necesarios, habilita el display y limpia
la memoria de pantalla.

Actualización del display

TM1622_Update()
Transfiere el contenido completo del framebuffer al display.

Control del display

TM1622_Clear()
Borra el framebuffer y actualiza el display.

TM1622_Clear_RAM()
Borra únicamente el framebuffer sin actualizar el display.

Escritura de caracteres

TM1622_PutC(caracter)
Escribe un carácter en la posición actual del cursor.

TM1622_Print(cadena)
Escribe una cadena ASCII completa.

TM1622_PadLeft(" ", ByRef String)
Rellena una cadena por la izquierda con el carácter indicado hasta completar los 10 dígitos del
display. El número de dígitos se establece mediante la constante de librería TM1622_Digits.
Resulta útil para alinear valores a la derecha o añadir ceros/espacios iniciales.

TM1622_DPMode(bit)
Trata el “.” como punto decimal y no ocupa un digito.

Gestión del cursor

TM1622_Cursor(posición)
Selecciona la posición donde se escribirá el siguiente carácter.

TM1622_CursorHome()
Sitúa el cursor en el primer dígito del display.

Desplazamiento de texto

TM1622_ScrollReset()
Reinicia el motor de desplazamiento para comenzar una nueva cadena.

TM1622_ScrollLeft(cadena)
Realiza un único desplazamiento circular de derecha a izquierda.
Durante las primeras llamadas el display se va completando progresivamente desde la derecha. Una
vez ocupado por completo, el desplazamiento continúa reutilizando los caracteres de la propia
cadena, generando un efecto continuo sin añadir espacios ni caracteres artificiales.

Punto decimal:
Los nueve puntos decimales están conectados independientemente de los caracteres. La librería
permite seleccionar cómo se interpreta "." mediante:

TM1622_DPMode(True)
Con este modo activado (activo por defecto), el punto se añade al carácter anterior sin ocupar una
nueva posición.

Por ejemplo:

TM1622_Print("123.45")
Estos 6 caracteres solo ocupan 5 dígitos.

Si se utiliza:

TM1622_DPMode(False)
TM1622_Print("123.45")


El punto se representa como un carácter normal y ocupa una posición del display 6 dígitos en total.
Este comportamiento se mantiene también en las funciones TM1622_PutC() y TM1622_ScrollLeft().

Así que las funciones principales son:

TM1622_Init()
TM1622_Clear()
TM1622_DPMode(Bit)
TM1622_Cursor(pos)
TM1622_PutC(char)
TM1622_PadLeft(" ", ByRef str)
TM1622_Print(str)
TM1622_Update()
TM1622_ScrollLeft(str)


También se incluyen varias funciones de test utilizadas durante las pruebas para localizar las
posiciones de los dígitos, segmentos y puntos. Pueden resultar útiles para adaptar la librería a otros
módulos basados en el TM1622, ya que el conexionado entre el controlador y el cristal LCD puede
ser diferente.
Este display no tiene control de iluminación o backlight interno, así que el pin LED+ del módulo se
gestiona mediante una señal de PWM generada en el Pin RE2 del puerto LATE.
La configuración rápida del módulo CCP5 para generar la señal PWM en el pin RE2 se realiza usando
las funciones de la librería _Pic18F46K22Lib.bas:

'************************************************************
' Backlight configuration
' CCP5 -> Timer2 -> LATE.2: PWM control for backlight (LED+).
Call _Setup_TMR2(TMRx_ON | TMRx_PRS_16, 255)
Call _Setup_CCP5(_ECCP_PWM) ' PWM mode.
Call _Setup_CCP_4_5_Timers(_CCP5_TIMER1_TIMER2)
Call _set_PWM5_Duty(100) ' Sets illumination level using PWM ' -> ≈ 10%.
TRISE.2 = 0 ' PWM output pin
' ***********************************************************
 
Ejemplo básico:

TM1622_Init()
Call _Set_PWM5_Duty(100) ' Sets illumination level using PWM.
 TM1622_Print("12.345")
TM1622_Update()


Nota: La librería ha sido probada únicamente con el módulo de 10 dígitos utilizado en esta
práctica. Una de las ventajas de los displays de cristal líquido es su excelente visibilidad con luz
exterior, incluso bajo luz solar directa. Para utilizarlos en la oscuridad solo necesitan una ligera
retroiluminación, por lo que su consumo puede mantenerse muy reducido. El pin RE2 que genera
la señal de PWM ≈ 10 %, se ha conectado directamente al pin de backlight (+LED) del LCD debido
a su bajo consumo.

Archivos adjuntos y conexionado:

Main_Test_TM1622_SPI_Soft.bas: archivo de test (main).
TM1622_SPI_Soft.bas: librería control LCD.
_Pic18F46K22Lib.bas: librería para configuración rápida del PIC.
« Última modificación: 15 de Septiembre de 2026, 11:42:32 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3559
Re:PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)
« Respuesta #834 en: 15 de Septiembre de 2026, 11:33:41 »
Utilidad para crear máscaras de 16 segmentos para TM1622

Pequeña utilidad para facilitar la creación de las máscaras de caracteres utilizadas en el LCD con TM1622 anterior.
El resultado, tanto en formato hexadecimal como binario, se envía por el puerto serie RS232.

Máscaras de bits de segmento para el módulo LCD TM1622:

Cada segmento está definido mediante una constante.
Cada constante representa el bit asignado a un segmento físico de un
carácter de 16 segmentos.

Const _G1 = 0x8000
Const _F = 0x4000
Const _H = 0x2000
Const _A1 = 0x1000
Const _D1 = 0x0800
Const _E = 0x0400
Const _M = 0x0200
Const _N = 0x0100
Const _K = 0x0080
Const _B = 0x0040
Const _J = 0x0020
Const _A2 = 0x0010
Const _D2 = 0x0008
Const _C = 0x0004
Const _L = 0x0002
Const _G2 = 0x0001

Asignación de segmentos a bits para el panel LCD, con el
correspondiente orden físico de los bits del bit 15 al bit 0:

   Bit:            15  14  13  12  11  10   9   8   7   6   5   4    3    2   1   0
   Segmento: G1    F   H  A1  D1   E   M   N   K   B   J  A2  D2   C   L  G2

En formato compacto:

   G1-F-H-A1-D1-E-M-N-K-B-J-A2-D2-C-L-G2

                     A1             A2
                *******    *******
                * *         *         * *
                *  *        J        *   *
           F   *    H      *      K    *  B
                *     *     *     *     *
                *       *   *   *       *
                **G1***   ***G2**
                *       *   *   *       *
                *     *     *     *     *
           E   *   N       *      L    *  C
                *  *        M       *  *
                * *         *         * *
                *******   *******  * DP
                    D1             D2
 
De esta forma, como en el ejemplo anterior, para crear un carácter solamente
hay que combinar los segmentos deseados mediante Or o |.

Por ejemplo, para representar el carácter "8":

mask = _A1 | _A2 | _B | _C | _D2 | _D1 | _E | _F | _G1 | _G2

En la siguiente imagen se puede ver el resultado obtenido para el carácter "8".

Archivos:
TM1622_SegsMask.bas: programa.
CLib.bas: librería compatibilidad C.
« Última modificación: 15 de Septiembre de 2026, 16:20:58 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3559
Re:PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)
« Respuesta #835 en: 20 de Septiembre de 2026, 11:13:07 »
Módulo VEML7700, sensor digital de luz ambiental I2C

El VEML7700 es un sensor digital de luz ambiental de 16 bits, fabricado por Vishay y con interfaz de comunicación I2C.

Integra fotodiodo, amplificador de bajo ruido y conversor A/D interno. El sensor trabaja con una tensión de alimentación de 2,5 V a 3,6 V, aunque muchos módulos comerciales incorporan regulador y adaptación de niveles para poder utilizarlos directamente en sistemas de 5 V.

Su dirección I2C de 7 bits es fija:

Código: [Seleccionar]
0x10

Pines habituales del módulo

Código: [Seleccionar]
Pin     Función
---------------

VCC     Alimentación
GND     Masa
SCL     Reloj I2C
SDA     Datos I2C

En el encapsulado original del sensor, Vishay identifica estos pines como SCL, VDD, GND y SDA.

Registros principales

Código: [Seleccionar]
Registro       Dirección     Función
------------------------------------

ALS_CONF       0x00          Configuración
ALS_WH         0x01          Umbral alto
ALS_WL         0x02          Umbral bajo
ALS            0x04          Lectura de luz ambiental
WHITE          0x05          Canal de luz blanca
INTERRUPT      0x06          Estado de interrupción

El VEML7700 utiliza registros de 16 bits accesibles mediante I2C. Los códigos de comando utilizados están comprendidos entre 0x00 y 0x06, quedando reservada la dirección 0x03.

Configuración básica

Para una primera práctica puede utilizarse:

Código: [Seleccionar]
ALS_CONF = 0x0000

Con esta configuración el sensor trabaja en modo normal, con ganancia x1 y un tiempo de integración de 100 ms.

Conversión aproximada a lux

Con ganancia x1 y un tiempo de integración de 100 ms, la resolución utilizada para la conversión es:

Código: [Seleccionar]
lux = lectura_ALS * 0,0576

Para evitar operaciones en coma flotante, en la librería se realiza el cálculo utilizando aritmética entera:

Código: [Seleccionar]
lux = CLong als_count * 576 / 10000

El uso de `CLong` evita el desbordamiento de 16 bits durante la multiplicación intermedia.

Con esta configuración puede utilizarse un intervalo de unos 150 ms entre lecturas, dejando margen suficiente respecto al tiempo de integración de 100 ms.
Salida de datos por puerto serie.

Ejemplo de lectura

Código: [Seleccionar]
Dim Lux as Word

Lux = VEML7700_Read_Lux()

UART_Write #Lux, " Lux aprox.", CrLf

Este módulo es una alternativa mucho más precisa y cómoda que una LDR cuando se necesita medir la iluminación. Al disponer de conversión A/D interna proporciona directamente una lectura digital proporcional a la luz ambiental.

Puede resultar interesante para prácticas con I2C, medida de iluminación, regulación automática del brillo de displays, estaciones ambientales y aplicaciones de bajo consumo.

Conexionado y archivos adjuntos necesarios:

Programa de test: Test VEML7700.bas
Líbreria básica para VEML7700:  VEML7700Lib.bas
I2C Librería hardware: _I2CLib.bas
Configuración rápida Pic18F46K22: _Pic18F46K22Lib.bas

« Última modificación: 20 de Septiembre de 2026, 11:55:32 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3559
Re:PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)
« Respuesta #836 en: 20 de Septiembre de 2026, 12:00:49 »
Salida de lecturas serie RS232:
Saludos desde Granada, España.