diff --git a/avr/devices/0BUILD b/avr/devices/0BUILD
index c8e68b1..1b89129 100644
--- a/avr/devices/0BUILD
+++ b/avr/devices/0BUILD
@@ -27,6 +27,7 @@
c01
c02
n16
+ n19
n20
n21
n22
diff --git a/avr/devices/n19/0BUILD b/avr/devices/n19/0BUILD
index 6329fc6..be449f6 100644
--- a/avr/devices/n19/0BUILD
+++ b/avr/devices/n19/0BUILD
@@ -2,51 +2,16 @@
-
-
-
- -I $(builddir)
- -I $(srcdir)
- -I $(topsrcdir)/avr
- -I $(topbuilddir)/avr
-
-
-
-
- main.asm
-
-
-
-
-
-
-
-
-
-
- -I $(builddir)
- -I $(srcdir)
- -I $(topsrcdir)/avr
- -I $(topbuilddir)/avr
-
-
-
-
- boot.asm
-
-
-
-
-
-
+ boot
+ main
defs.asm
+ README
-
diff --git a/avr/devices/n19/boot/0BUILD b/avr/devices/n19/boot/0BUILD
new file mode 100644
index 0000000..c0e7053
--- /dev/null
+++ b/avr/devices/n19/boot/0BUILD
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+ -I $(builddir)
+ -I $(srcdir)
+ -I $(topsrcdir)/avr
+ -I $(topbuilddir)/avr
+
+
+
+
+ boot.asm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/avr/devices/n19/boot.asm b/avr/devices/n19/boot/boot.asm
similarity index 96%
rename from avr/devices/n19/boot.asm
rename to avr/devices/n19/boot/boot.asm
index d201486..eb13227 100644
--- a/avr/devices/n19/boot.asm
+++ b/avr/devices/n19/boot/boot.asm
@@ -14,8 +14,10 @@
.include "include/tn85def.inc" ; Define device ATtiny85
.list
-.include "./defs.asm"
-.include "defs_all.asm"
+.include "../defs.asm"
+.include "devices/all/defs.asm"
+.include "common/calls.asm"
+.include "common/utils_wait.asm"
@@ -25,10 +27,6 @@
; ---------------------------------------------------------------------------
; generic
-.include "common/utils_wait.asm"
-.include "modules/com2/defs.asm"
-.include "modules/comproto/defs.asm"
-
; ---------------------------------------------------------------------------
; firmware settings
diff --git a/avr/devices/n19/defs.asm b/avr/devices/n19/defs.asm
index 4249624..f40698e 100644
--- a/avr/devices/n19/defs.asm
+++ b/avr/devices/n19/defs.asm
@@ -40,6 +40,7 @@
.equ LED_SIMPLE_OFFTIME = 50
.equ LED_SIMPLE_DDR = DDRB
.equ LED_SIMPLE_PORT = PORTB
+.equ LED_SIMPLE_PORTIN = PINB
.equ LED_SIMPLE_PINNUM = PORTB3
diff --git a/avr/devices/n19/main.asm b/avr/devices/n19/main.asm
deleted file mode 100644
index e544eb4..0000000
--- a/avr/devices/n19/main.asm
+++ /dev/null
@@ -1,379 +0,0 @@
-; ***************************************************************************
-; copyright : (C) 2024 by Martin Preuss
-; email : martin@libchipcard.de
-;
-; ***************************************************************************
-; * This file is part of the project "AqHome". *
-; * Please see toplevel file COPYING of that project for license details. *
-; ***************************************************************************
-
-
-; ***************************************************************************
-; Source file for LED controller node on AtTiny 85
-;
-; This is for the full system (i.e. not the boot loader).
-; ***************************************************************************
-
-.equ clock=1000000 ; Define the clock frequency
-
-
-
-.nolist
-.include "include/tn85def.inc" ; Define device ATtiny85
-.list
-
-.include "./defs.asm"
-.include "defs_all.asm"
-.include "common/utils_wait.asm" ; wait macro
-
-
-
-; ***************************************************************************
-; defines
-
-; ---------------------------------------------------------------------------
-; firmware settings including list of modules used
-
-.equ FIRMWARE_VERSION_MAJOR = 0
-.equ FIRMWARE_VERSION_MINOR = 0
-.equ FIRMWARE_VERSION_PATCHLEVEL = 1
-
-
-#define MODULES_TIMER
-#define MODULES_COM
-#define MODULES_COM_WITH_ADDR_PROTO
-#define MODULES_LED_SIMPLE
-#define MODULES_TWI_MASTER
-#define MODULES_SI7021
-#define MODULES_STATS
-; #define MODULES_OWI_MASTER
-; #define MODULES_DS18B20
-; #define MODULES_SK6812
-; #define MODULES_MOTION_LIGHT
-
-; #define COM_ACCEPT_ALL_DEST
-#define MODULES_CCS811
-
-
-
-; ---------------------------------------------------------------------------
-; defines for modules
-
-.equ VALUE_ID_SI7021_TEMP = 0x01
-.equ VALUE_ID_SI7021_HUM = 0x02
-
-.equ VALUE_ID_CO2 = 0x07
-.equ VALUE_ID_TVOC = 0x08
-
-.equ VALUE_ID_DEBUG = 0x7f
-
-
-; ***************************************************************************
-; code segment
-
-.cseg
-.org 000000
-
-
-
-; ---------------------------------------------------------------------------
-; Reset and interrupt vectors
-
- rjmp BOOTLOADER_ADDR ; Reset vector ; use this for flashed system
- reti ; EXT_INT0
- rjmp uartBitbangIsrPcint0 ; PCI0
- reti ; OC1A
- reti ; OVF1
- reti ; OVF0
- reti ; ERDY
- reti ; ACI
- reti ; ADCC
- reti ; OC1B
- rjmp baseTimerIrqOC0A ; OC0A
- reti ; OC0B
- reti ; WATCHDOG
- reti ; USI_STR
- reti ; USI_OVF
-
-
-devInfoBlock: ; 12 bytes
-devInfoManufacturer: .db 'A', 'Q', 'U', 'A'
-devInfoId: .db DEVICEINFO_ID, 0
-devInfoVersion: .db DEVICEINFO_VERSION, DEVICEINFO_REVISION ; version, revision
-firmwareVersion: .db FIRMWARE_VARIANT_MAIN, FIRMWARE_VERSION_MAJOR
- .db FIRMWARE_VERSION_MINOR, FIRMWARE_VERSION_PATCHLEVEL
-
-firmwareStart: rjmp main
-
-
-; ***************************************************************************
-; includes
-
-.include "common/utils.asm"
-.include "common/utils_wait_fixed.asm"
-.include "common/utils_copy_from_flash.asm"
-.include "common/utils_copy_sdram.asm"
-.include "common/crc8.asm"
-
-.include "modules/basetimer/main.asm"
-
-#ifdef MODULES_TIMER
- .include "modules/timer/main.asm"
-#endif
-#ifdef MODULES_LED_SIMPLE
-.include "modules/led_simple/main.asm"
-#endif
-#ifdef MODULES_COM
- .include "modules/com2/defs.asm"
- .include "modules/com2/main.asm"
- .include "modules/com2/buffer.asm"
- #ifdef MODULES_STATS
- .include "modules/comproto/msg_recvstats.asm"
- .include "modules/comproto/msg_sendstats.asm"
- .include "modules/comproto/msg_sysstats.asm"
- .include "modules/comproto/msg_memstats.asm"
- #endif
- .include "modules/comproto/msg_pong.asm"
- .include "modules/comproto/msg_value.asm"
- .include "modules/comproto/msg_device.asm"
- .include "modules/comproto/msg_reboot.asm"
- .include "modules/uart_bitbang/defs.asm"
- .include "modules/uart_bitbang/main.asm"
- .include "modules/uart_bitbang/bytelevel.asm"
- .include "modules/uart_bitbang/packetlevel.asm"
- #ifdef MODULES_COM_WITH_ADDR_PROTO
- .include "modules/comproto/defs.asm"
- .include "modules/comproto/main.asm"
- .include "modules/comproto/addr.asm"
- #endif
-#endif
-#ifdef MODULES_STATS
- .include "modules/stats/main.asm"
-#endif
-#ifdef MODULES_TWI_MASTER
- .include "modules/twimaster/main.asm"
-#endif
-#ifdef MODULES_OWI_MASTER
- .include "modules/owimaster/main.asm"
-#endif
-#ifdef MODULES_SI7021
- .include "modules/si7021/main.asm"
-#endif
-#ifdef MODULES_DS18B20
- .include "modules/ds18b20/main.asm"
-#endif
-#ifdef MODULES_SK6812
- .include "modules/sk6812/main.asm"
-#endif
-#ifdef MODULES_MOTION_LIGHT
- .include "modules/ma_light/main.asm"
-#endif
-
-#ifdef MODULES_CCS811
- .include "modules/ccs811/main.asm"
-#endif
-
-
-; ***************************************************************************
-; data in SRAM
-
-.dseg
-
-
-#ifdef MODULES_SI7021
- sramTimerSI7021Measure: .byte 2
- sramTimerSI7021SendTemp: .byte 2
- sramTimerSI7021SendHumidity: .byte 2
-#endif
-#ifdef MODULES_DS18B20
- sramDs18b20Timer: .byte 2
- sramSendDs18b20TempTimer: .byte 2
-#endif
-
-#ifdef MODULES_CCS811
- sramCcs811Timer: .byte 2
-#endif
-
-
-; ***************************************************************************
-; data in FLASH
-
-.cseg
-
-
-
-; ---------------------------------------------------------------------------
-; timer list
-
-
-timerList:
-; SRAM variable/counter routine flags secs (0=don't start or restart)
-#ifdef MODULES_COM_WITH_ADDR_PROTO
- .dw cproAddresModeTimer, CPRO_Address_OnTimer, 0, 0 ; (no restart)
-#endif
-#ifdef MODULES_STATS
- .dw statsSendTimer, Stats_Timer, TIMER_FLAGS_IF_ADDR, 9000 ; every 15m
-#endif
-#ifdef MODULES_DS18B20
- .dw sramDs18b20Timer, Ds18b20_OnTimer, 0, 300 ; every 30s
- .dw sramSendDs18b20TempTimer, sendDs18b20Temp, TIMER_FLAGS_IF_ADDR, 600 ; every 60s
-#endif
-#ifdef MODULES_SI7021
- .dw sramTimerSI7021Measure, SI7021_OnTimer, 0, 300 ; every 30s
- .dw sramTimerSI7021SendTemp, sendSI7021Temp, TIMER_FLAGS_IF_ADDR, 600 ; every 60s
- .dw sramTimerSI7021SendHumidity, sendSI7021Humidity, TIMER_FLAGS_IF_ADDR, 600 ; every 60s
-#endif
-#ifdef MODULES_CCS811
- .dw sramCcs811Timer, CCS811_OnTimer, 0, 10 ; every 1s
-#endif
- .dw 0 ; end of list
-
-
-
-
-
-.include "main_all.asm"
-
-
-; ---------------------------------------------------------------------------
-; Called early on system startup. No arguments, no results.
-
-systemSetSpeed:
-.if clock == 1000000
- ldi r16, (1<
+
+
+
+
+
+
+ -I $(builddir)
+ -I $(srcdir)
+ -I $(topsrcdir)/avr
+ -I $(topbuilddir)/avr
+
+
+
+
+ main.asm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/avr/devices/n19/main/main.asm b/avr/devices/n19/main/main.asm
new file mode 100644
index 0000000..aed7831
--- /dev/null
+++ b/avr/devices/n19/main/main.asm
@@ -0,0 +1,176 @@
+; ***************************************************************************
+; copyright : (C) 2025 by Martin Preuss
+; email : martin@libchipcard.de
+;
+; ***************************************************************************
+; * This file is part of the project "AqHome". *
+; * Please see toplevel file COPYING of that project for license details. *
+; ***************************************************************************
+
+
+; ***************************************************************************
+; Source file for LED controller node on AtTiny 85
+;
+; This is for the full system (i.e. not the boot loader).
+; ***************************************************************************
+
+.equ clock=1000000 ; Define the clock frequency
+
+
+
+.nolist
+.include "include/tn85def.inc" ; Define device ATtiny85
+.list
+
+.include "../defs.asm"
+.include "devices/all/defs.asm"
+.include "common/calls.asm"
+.include "common/utils_wait.asm" ; wait macro
+
+
+
+; ***************************************************************************
+; defines
+
+
+.equ NET_BUFFERS_NUM = 6
+.equ NET_BUFFERS_SIZE = 32
+
+
+; ---------------------------------------------------------------------------
+; firmware settings including list of modules used
+
+.equ FIRMWARE_VERSION_MAJOR = 0
+.equ FIRMWARE_VERSION_MINOR = 0
+.equ FIRMWARE_VERSION_PATCHLEVEL = 1
+
+#define MODULES_CLOCK
+#define MODULES_LED_SIMPLE
+#define MODULES_NETWORK
+#define MODULES_UART_BITBANG
+#define MODULES_TWI_MASTER
+#define MODULES_SI7021
+#define MODULES_CCS811
+
+#define APPS_NETWORK
+#define APPS_REPORTSENSORS
+#define APPS_STATS
+
+
+
+; ---------------------------------------------------------------------------
+; defines for modules
+
+.equ VALUE_ID_SI7021_TEMP = 0x01
+.equ VALUE_ID_SI7021_HUM = 0x02
+
+.equ VALUE_ID_CO2 = 0x07
+.equ VALUE_ID_TVOC = 0x08
+
+.equ VALUE_ID_DEBUG = 0x7f
+
+.equ VALUE_ID_LEDSIMPLE_TIMING = 0x88
+
+
+; ***************************************************************************
+; code segment
+
+.cseg
+.org 000000
+
+
+
+; ---------------------------------------------------------------------------
+; Reset and interrupt vectors
+
+ rjmp BOOTLOADER_ADDR ; Reset vector ; use this for flashed system
+ reti ; EXT_INT0
+ rjmp UART_BitBang_PcintIsr ; PCI0
+ reti ; OC1A
+ reti ; OVF1
+ reti ; OVF0
+ reti ; ERDY
+ reti ; ACI
+ reti ; ADCC
+ reti ; OC1B
+ rjmp baseTimerIrqOC0A ; OC0A
+ reti ; OC0B
+ reti ; WATCHDOG
+ reti ; USI_STR
+ reti ; USI_OVF
+
+
+devInfoBlock: ; 12 bytes
+devInfoManufacturer: .db 'A', 'Q', 'U', 'A'
+devInfoId: .db DEVICEINFO_ID, 0
+devInfoVersion: .db DEVICEINFO_VERSION, DEVICEINFO_REVISION ; version, revision
+firmwareVersion: .db FIRMWARE_VARIANT_MAIN, FIRMWARE_VERSION_MAJOR
+ .db FIRMWARE_VERSION_MINOR, FIRMWARE_VERSION_PATCHLEVEL
+
+firmwareStart:
+ rjmp main
+
+
+
+; ---------------------------------------------------------------------------
+; @routine onSystemStart
+
+onSystemStart:
+ ret
+; @end
+
+
+
+; ---------------------------------------------------------------------------
+; @routine onMessageReceived
+;
+; Called on every message received
+
+onMessageReceived:
+ clc
+ ret
+; @end
+
+
+
+; ---------------------------------------------------------------------------
+; @routine onEvery100ms
+;
+; Called every 100ms. Add your routine calls here. No arguments, no results.
+
+onEvery100ms:
+onEverySecond:
+onEveryMinute:
+onEveryHour:
+onEveryDay:
+ ret
+; @end
+
+
+
+; ---------------------------------------------------------------------------
+; @routine onEveryLoop
+;
+; Called on every loop (i.e. after awakening from sleep).
+;
+onEveryLoop:
+ ret
+; @end
+
+
+
+; ***************************************************************************
+; includes
+
+.include "devices/all/hw_tn85.asm"
+.include "devices/all/includes.asm"
+
+
+
+; ---------------------------------------------------------------------------
+; defines for network interface
+
+.equ netInterfaceData = uart_bitbang_iface
+
+
+
diff --git a/avr/devices/n20/0BUILD b/avr/devices/n20/0BUILD
index 23f5a51..be449f6 100644
--- a/avr/devices/n20/0BUILD
+++ b/avr/devices/n20/0BUILD
@@ -2,44 +2,9 @@
-
-
-
- -I $(builddir)
- -I $(srcdir)
- -I $(topsrcdir)/avr
- -I $(topbuilddir)/avr
-
-
-
-
- main.asm
-
-
-
-
-
-
-
-
-
-
- -I $(builddir)
- -I $(srcdir)
- -I $(topsrcdir)/avr
- -I $(topbuilddir)/avr
-
-
-
-
- boot.asm
-
-
-
-
-
-
+ boot
+ main
@@ -50,4 +15,3 @@
-
diff --git a/avr/devices/n20/boot/0BUILD b/avr/devices/n20/boot/0BUILD
new file mode 100644
index 0000000..dec3837
--- /dev/null
+++ b/avr/devices/n20/boot/0BUILD
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+ -I $(builddir)
+ -I $(srcdir)
+ -I $(topsrcdir)/avr
+ -I $(topbuilddir)/avr
+
+
+
+
+ boot.asm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/avr/devices/n20/boot.asm b/avr/devices/n20/boot/boot.asm
similarity index 99%
rename from avr/devices/n20/boot.asm
rename to avr/devices/n20/boot/boot.asm
index 919d3d2..df58b6f 100644
--- a/avr/devices/n20/boot.asm
+++ b/avr/devices/n20/boot/boot.asm
@@ -13,7 +13,7 @@
.list
.include "version.asm"
-.include "./defs.asm"
+.include "../defs.asm"
.include "devices/all/defs.asm"
.include "common/calls.asm"
diff --git a/avr/devices/n20/main/0BUILD b/avr/devices/n20/main/0BUILD
new file mode 100644
index 0000000..8450a6c
--- /dev/null
+++ b/avr/devices/n20/main/0BUILD
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+ -I $(builddir)
+ -I $(srcdir)
+ -I $(topsrcdir)/avr
+ -I $(topbuilddir)/avr
+
+
+
+
+ main.asm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/avr/devices/n20/main.asm b/avr/devices/n20/main/main.asm
similarity index 99%
rename from avr/devices/n20/main.asm
rename to avr/devices/n20/main/main.asm
index 1f720e8..eb7c165 100644
--- a/avr/devices/n20/main.asm
+++ b/avr/devices/n20/main/main.asm
@@ -31,7 +31,7 @@
.list
.include "version.asm"
-.include "./defs.asm"
+.include "../defs.asm"
.include "devices/all/defs.asm"
.include "common/calls.asm"
@@ -67,7 +67,7 @@
;#define MODULES_DS18B20
;#define MODULES_MOTION
;#define MODULES_TCRT1000
-;#define MODULES_CCS811
+#define MODULES_CCS811
#define APPS_NETWORK
;#define APPS_MOTION