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

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

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3554
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: 3554
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: 3554
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: 3554
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: 3554
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: 3554
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: 3554
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.


 

anything