Firmware para relojes LED DIY basados en microcontroladores STC15, adaptado para el modelo CAI-082-V4 con el chip IAP15W413AS.
IAP15W413AS-35I-SKDIP28 (familia STC15W401AS, arquitectura 8051 1T)
- Flash: 13 KB unificados (0x0000–0x33FF). Sin partición hardware CODE/IAP — todo el flash es flash de programa.
- RAM: 512 B (256 B scratch-pad + 256 B auxiliar)
- ADC: 10 bits, 8 canales
- Frecuencia: 0–35 MHz (RC interno configurable)
- Tensión: 2.4–5.5 V
- Encapsulado: DIP-20
El prefijo «IAP» indica que la flash de programa puede escribirse en tiempo de ejecución. No hay EEPROM dedicada separada; el almacenamiento dinámico de configuración se realiza íntegramente en la BBSRAM del DS1302.
| Componente | Función |
|---|---|
| IAP15W413AS | MCU principal |
| DS1302 | RTC + 31 bytes BBSRAM (alarmas, config) |
| Display 4×7 seg. | Visualización, ánodo común, multiplexado por PCA |
| LDR | Sensor de luz ambiental → brillo automático |
| Termistor NTC | Sensor de temperatura |
| Buzzer piezoeléctrico | Alarmas y cuenta regresiva |
| 2 pulsadores | MENU (izquierdo) y SELECT (derecho) |
MENU (izquierdo):
- Corto (<320 ms): siguiente pantalla / navegar opciones
- Largo (320 ms–1.5 s): guardar / volver / entrar en edición de preset (cuenta regresiva)
SELECT (derecho):
- Corto (<320 ms): toggle / incrementar valor / iniciar·pausar (crono y cuenta regresiva)
- Largo (>320 ms): resetear crono o cuenta regresiva al preset
- Mantenido (≥1.5 s): auto-incremento rápido
MENU largo + SELECT largo simultáneos: entrar en modo configuración desde la pantalla de inicio.
El reloj cicla manualmente con MENU·S entre estas pantallas:
| Orden | Pantalla | Descripción |
|---|---|---|
| 0 | Hora (HH:MM) | Pantalla principal. Colon parpadea. Punto AM/PM encendido si hay alarma activa hoy. |
| 1 | Cronómetro (MM:SS) | Cuenta ascendente hasta 59:59. S·S inicia/pausa. S·L reinicia. |
| 2 | Cuenta regresiva (MM:SS) | Cuenta descendente. Ver sección específica. |
| 3 | Temperatura | Valor del termistor NTC con offset de calibración. |
| 4 | Día de la semana | Lun / MAr / MiE / JuE / UiE / SAb / doN |
| 5 | Fecha | DD.MM o MM.DD según configuración. |
Sin autoscroll. Tras 1 segundo sin pulsar MENU en cualquier pantalla excepto crono y cuenta regresiva, el display vuelve a la hora.
SELECT·S desde cualquier pantalla salta directamente a Temperatura.
| Acción | Efecto |
|---|---|
| S·S | Iniciar / pausar |
| S·L | Resetear a 00:00 |
| M·S | Siguiente pantalla (el crono sigue corriendo en segundo plano) |
Cuenta hasta 59:59 y se detiene. Los dos puntos parpadean mientras corre.
Preset por defecto: 59:00. El preset es ajustable por el usuario y se mantiene entre usos.
| Acción | Efecto |
|---|---|
| S·S | Iniciar / pausar |
| S·L | Resetear al preset actual |
| M·L | Entrar / salir del modo edición del preset |
| S·S o S·HELD (en edición) | Incrementar preset en 1 minuto (01:00 → 59:00 → 01:00) |
| M·S (en edición) | Salir de edición y avanzar pantalla |
Al llegar a 00:00: bip 3 (triple pitido), pantalla centellea. Cualquier botón detiene y reinicia al preset.
Acceso: MENU·L + SELECT·L desde inicio → pantalla SEtC → SELECT·S para entrar.
Campos: HH → MM → DD → Mes → Día semana
- SELECT·S / HELD: incrementa el campo activo
- MENU·S: siguiente campo
- MENU·L: guardar y volver
5 alarmas independientes (A1–A5). Acceso: desde SEtC → MENU·S en SEtC → pantalla SEtA → SELECT·S.
Lista (A1 On/OF)
├─ S·S → activar/desactivar alarma
└─ S·L → editar:
HH → MM → dIAS → [Lun…doN → ALL] → bP
dIAS: cabecera del submenú de días de activación.
- S·L desde dIAS: entrar en el ciclo Lun → MAr → MiE → JuE → UiE → SAb → doN → ALL
- En cada día: S·S avanza al siguiente, S·L activa/desactiva ese día
- ALL: S·L activa o desactiva todos los días a la vez
bP (patrón de pitido): S·S cicla 1→2→3→1 con preview sonoro.
M·L en cualquier subestado: guardar y salir a la lista de alarmas.
A 30 Hz (1 tick ≈ 33 ms), ciclo de 96 ticks (~3.2 s):
| Patrón | Descripción | Pitido | Pausa entre pitidos |
|---|---|---|---|
| bP1 | Un pitido | ~400 ms | — |
| bP2 | Doble pitido | ~400 ms | ~133 ms |
| bP3 | Triple pitido (Casio) | ~400 ms | ~133 ms |
Duración máxima: 5 minutos (ALARM_MAX_TIME = 9000 ticks). Cualquier botón la apaga.
Acceso: MENU·L + SELECT·L → SEtC → MENU·S → SEtA → MENU·S → ConF → SELECT·S para entrar.
| Opción | Pantalla | Valores |
|---|---|---|
| Brillo | br |
Auto (0) / 1–10 manual |
| Calibración temperatura | tCAL |
+0.00 … +1.40 °C |
| Formato hora | 12 |
12h / 24h |
| Formato fecha | nd |
DD.MM / MM.DD |
| Ceros a la izquierda | L0 |
On / OF |
MENU·S navega entre opciones. SELECT·S cambia el valor. MENU·S en ConF guarda y sale.
Mantener ambos botones al encender. Resetea la BBSRAM del DS1302 (hora, fecha, alarmas, configuración) a los valores por defecto. Ocurre también automáticamente si la CRC de la BBSRAM es inválida (primera puesta en marcha, batería agotada).
IAP15W413AS — 13 312 bytes flash unificada (0x0000–0x33FF)
Código ejecutable: ~9 400 B
Tablas de datos (__code):
LDR→PWM [512×2B] 1 024 B @ 0x2000
Temp→BCD [1024×2B] 2 048 B @ 0x2800
Fuentes 7-seg 256 B @ 0x3000
Cadenas de menú 110 B @ 0x3100
Datos init DS1302 39 B @ 0x3200
Tablas de transición FSM 36 B @ 0x3300
Total ocupado: ~11 850 B
Libre: ~1 460 B
| ISR | Frecuencia | Función |
|---|---|---|
| ISR_PCA (alta prioridad) | ~1 kHz | Multiplexeo display, control de brillo y centelleo |
| ISR_T0 | 100 Hz (cada 10 ms) | Timebase, debounce de botones, disparo ADC |
| ISR_ADC | Bajo demanda | Lectura LDR y termistor, ajuste de brillo (IIR α=1/64) |
| ISR_T2 | 30 Hz (solo alarma activa) | Generación del tono del buzzer mediante tabla de patrones |
# Requisitos
sudo apt-get install sdcc make
# Compilar
make clean && make
# Verificar tamaño
./check_size.shcheck_size.sh verifica que el total compilado no supere los 13 312 bytes del IAP15W413AS.
Programador USB-UART IAP15W413AS DIP-20
──────────────────── ───────────────────
TXD → RxD / P3.0 (pin 11)
RXD → TxD / P3.1 (pin 12)
GND → GND (pin 10)
VCC (5V) → VCC (pin 8)
sudo chmod 666 /dev/ttyACM0
stcgal -P stc15 -p /dev/ttyACM0 -t 11059.2 Binary/DIY_Firmware_13k.ihx
# Cuando aparezca "Waiting for MCU..." → ciclar alimentación del relojFork de shenghaoyang/stc_led_clock_8k.