From 7054a42909d656346a59fa9b065a3ae88088241c Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Thu, 16 Apr 2026 23:43:56 +0200 Subject: [PATCH] avr: added device n31. --- avr/devices/0BUILD | 1 + avr/devices/n31/.gitignore | 4 + avr/devices/n31/0BUILD | 19 +++ avr/devices/n31/README | 17 +++ avr/devices/n31/boot/0BUILD | 32 ++++ avr/devices/n31/boot/boot.asm | 157 +++++++++++++++++++ avr/devices/n31/defs.asm | 114 ++++++++++++++ avr/devices/n31/enclosure.scad | 244 ++++++++++++++++++++++++++++++ avr/devices/n31/main/0BUILD | 34 +++++ avr/devices/n31/main/data.asm | 14 ++ avr/devices/n31/main/main.asm | 215 ++++++++++++++++++++++++++ avr/devices/n31/n31-enclosure.stl | Bin 0 -> 105084 bytes devices/nodes/0BUILD | 1 + devices/nodes/aqua_n31.xml | 12 ++ 14 files changed, 864 insertions(+) create mode 100644 avr/devices/n31/.gitignore create mode 100644 avr/devices/n31/0BUILD create mode 100644 avr/devices/n31/README create mode 100644 avr/devices/n31/boot/0BUILD create mode 100644 avr/devices/n31/boot/boot.asm create mode 100644 avr/devices/n31/defs.asm create mode 100644 avr/devices/n31/enclosure.scad create mode 100644 avr/devices/n31/main/0BUILD create mode 100644 avr/devices/n31/main/data.asm create mode 100644 avr/devices/n31/main/main.asm create mode 100644 avr/devices/n31/n31-enclosure.stl create mode 100644 devices/nodes/aqua_n31.xml diff --git a/avr/devices/0BUILD b/avr/devices/0BUILD index 23e950c..2b8a75b 100644 --- a/avr/devices/0BUILD +++ b/avr/devices/0BUILD @@ -23,6 +23,7 @@ n28 n29 n30 + n31 r06 s03 t03 diff --git a/avr/devices/n31/.gitignore b/avr/devices/n31/.gitignore new file mode 100644 index 0000000..25dc86f --- /dev/null +++ b/avr/devices/n31/.gitignore @@ -0,0 +1,4 @@ +*.eep.hex +*.obj +n29-enclosure.stl +n29-enclosure-2.stl diff --git a/avr/devices/n31/0BUILD b/avr/devices/n31/0BUILD new file mode 100644 index 0000000..3f7db52 --- /dev/null +++ b/avr/devices/n31/0BUILD @@ -0,0 +1,19 @@ + + + + + + boot + main + + + + defs.asm + README + enclosure.scad + + + + + + diff --git a/avr/devices/n31/README b/avr/devices/n31/README new file mode 100644 index 0000000..0a08578 --- /dev/null +++ b/avr/devices/n31/README @@ -0,0 +1,17 @@ + +N31 +=== + +- Role: Air quality sensors +- MCU: AtTiny84 +- Frequency: 1MHz +- Connection: RJ45 +- Predecessor: N26 +- COM: COM2W +- Periphery: + - TWI interface + - SGP-30/40 air quality sensor +- Apps: + - NETWORK: Basic network functionality (address setup etc.) + - REPORTSENSORS: report sensor data from temperature sensor etc. + - STATS : periodically send stats data diff --git a/avr/devices/n31/boot/0BUILD b/avr/devices/n31/boot/0BUILD new file mode 100644 index 0000000..9651a6f --- /dev/null +++ b/avr/devices/n31/boot/0BUILD @@ -0,0 +1,32 @@ + + + + + + + + -I $(builddir) + -I $(srcdir) + -I $(topsrcdir)/avr + -I $(topbuilddir)/avr + + + + + boot.asm + + + + + + + + + + + + + + + + diff --git a/avr/devices/n31/boot/boot.asm b/avr/devices/n31/boot/boot.asm new file mode 100644 index 0000000..7f35036 --- /dev/null +++ b/avr/devices/n31/boot/boot.asm @@ -0,0 +1,157 @@ +; *************************************************************************** +; copyright : (C) 2026 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 base system node on AtTiny 84 +; +; This is for the maintenance system (i.e. the flash loader). +; +; All definitions and changes should go into this file. +; *************************************************************************** + +.equ clock=1000000 ; Define the clock frequency + +.nolist +.include "include/tn84def.inc" ; Define device ATtiny84 +.list + +.include "version.asm" +.include "../defs.asm" + +.include "common/calls.asm" +.include "common/utils_io.asm" +.include "devices/all/defs.asm" + + +#define COM_ACCEPT_ALL_DEST + + + +; *************************************************************************** +; defines + +; --------------------------------------------------------------------------- +; generic + +.include "common/utils_wait.asm" +.include "modules/com2/defs.asm" +.include "modules/comproto/defs.asm" + + + +; --------------------------------------------------------------------------- +; firmware settings + + + +; --------------------------------------------------------------------------- +; LED + +.equ LED_DDR = DDRA +.equ LED_PORT = PORTA +.equ LED_PIN = PINA +.equ LED_PINNUM = PORTA3 + + +; *************************************************************************** +; code segment + +.cseg +.org 0x0000 + + + +; --------------------------------------------------------------------------- +; Reset and interrupt vectors +; rjmp start ; Reset vector + rjmp main ; Reset vector + reti ; EXT_INT0 + reti ; PCI0 + reti ; PCI1 + reti ; WATCHDOG + reti ; ICP1 + reti ; OC1A + reti ; OC1B + reti ; OVF1 + reti ; OC0A + reti ; OC0B + reti ; OVF0 + reti ; ACI + reti ; ADCC + reti ; ERDY + 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_BOOT, FIRMWARE_VERSION_MAJOR + .db FIRMWARE_VERSION_MINOR, FIRMWARE_VERSION_PATCHLEVEL + +firmwareStart: rjmp main ; will be overwritten when flashing + + + +; *************************************************************************** +; main code + + +.org BOOTLOADER_ADDR + + +main: + rjmp bootLoader ; this routine is in modules/bootloader/main.asm + + + +; *************************************************************************** +; includes + +.include "common/utils_wait_fixed.asm" +.include "common/utils_copy_from_flash.asm" +.include "common/utils_copy_sdram.asm" + +.include "modules/flash/defs.asm" +.include "modules/flash/eeprom.asm" +.include "modules/flash/io.asm" +.include "modules/flash/io_com2w.asm" +.include "modules/flash/flash1p.asm" +.include "modules/flash/flashxp.asm" +.include "modules/flash/flashprocess.asm" +.include "modules/flash/wait.asm" +.include "modules/bootloader/main.asm" +.include "modules/network/msg/defs.asm" +.include "modules/network/msg/crc.asm" + +;.include "common/debug.asm" + + + +systemSetSpeed: +.if clock == 8000000 + ldi r16, (1< + + + + + + + -I $(builddir) + -I $(srcdir) + -I $(topsrcdir)/avr + -I $(topbuilddir)/avr + + + + + main.asm + + + + + + + + + + + + data.asm + + + + + + diff --git a/avr/devices/n31/main/data.asm b/avr/devices/n31/main/data.asm new file mode 100644 index 0000000..31ccc2f --- /dev/null +++ b/avr/devices/n31/main/data.asm @@ -0,0 +1,14 @@ +; *************************************************************************** +; 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. * +; *************************************************************************** + + + +.dseg + + diff --git a/avr/devices/n31/main/main.asm b/avr/devices/n31/main/main.asm new file mode 100644 index 0000000..1e39c94 --- /dev/null +++ b/avr/devices/n31/main/main.asm @@ -0,0 +1,215 @@ +; *************************************************************************** +; copyright : (C) 2026 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 temperature sensor node on AtTiny 84 +; +; This is for the full system (i.e. not the boot loader). +; +; All definitions and changes should go into this file. +; +; +; *************************************************************************** + + +.equ clock=1000000 ; Define the clock frequency +;.equ clock=8000000 ; Define the clock frequency + + + +.nolist +.include "include/tn84def.inc" ; Define device ATtiny84 +.list + +.include "../defs.asm" +.include "./data.asm" + +.include "version.asm" +.include "devices/all/defs.asm" +.include "common/calls.asm" +.include "common/utils_io.asm" +.include "common/utils_wait.asm" + + + +; *************************************************************************** +; defines + +; --------------------------------------------------------------------------- +; generic + +.equ NET_BUFFERS_NUM = 6 +.equ NET_MSGNUMINBUF_SIZE = 8 ; max buffer nums in ringbuffer (global incoming) +.equ NET_IFACE_OUTMSGBUF_SIZE = 8 ; max buffer nums in ringbuffer (per interface outbound) + + + + +; --------------------------------------------------------------------------- +; firmware settings including list of modules used + +; #define MODULES_TIMER +#define MODULES_CLOCK +#define MODULES_LED_SIMPLE +;#define MODULES_LED_ACTIVITY +#define MODULES_NETWORK +;#define MODULES_UART_BITBANG +#define MODULES_COM2W +#define MODULES_TWI_MASTER +;#define MODULES_LCD +;#define LCD_MINIMAL_FONT +;#define MODULES_SI7021 +#define MODULES_SGP30 +;#define MODULES_SGP40 +;#define MODULES_STATS +;#define MODULES_OWI_MASTER +;#define MODULES_DS18B20 +;#define MODULES_MOTION +;#define MODULES_CCS811 +;#define MODULES_BRIGHTNESS + +#define APPS_NETWORK +;#define APPS_MOTION +#define APPS_REPORTSENSORS +#define APPS_STATS + + + +; --------------------------------------------------------------------------- +; defines for values + +;.equ VALUE_ID_SGP40_TVOC = 0x08 + +.equ VALUE_ID_SGP30_TVOC = 0x09 +.equ VALUE_ID_SGP30_CO2 = 0x0a + + + + + +; *************************************************************************** +; code segment + +.cseg +.org 000000 + + + +; --------------------------------------------------------------------------- +; Reset and interrupt vectors + + rjmp BOOTLOADER_ADDR ; Reset vector ; use this for flashed system + reti ; EXT_INT0 + rjmp com2wPcintIsr ; PCI0 + reti ; PCI1 + reti ; WATCHDOG + reti ; ICP1 + reti ; OC1A + reti ; OC1B + reti ; OVF1 + rjmp baseTimerIrqOC0A ; OC0A + reti ; OC0B + reti ; OVF0 + reti ; ACI + reti ; ADCC + reti ; ERDY + 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_TEMP_WINDOW, FIRMWARE_VERSION_MAJOR + .db FIRMWARE_VERSION_MINOR, FIRMWARE_VERSION_PATCHLEVEL + + + +; --------------------------------------------------------------------------- +; @routine firmwareStart @global + +firmwareStart: + rjmp main +; @end + + + +; --------------------------------------------------------------------------- +; @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_tn84.asm" +.include "devices/all/includes.asm" + + + +; --------------------------------------------------------------------------- +; defines for network interface + +.equ netInterfaceData = com2w_iface + + + +deviceCodeEnd: + .if deviceCodeEnd >= BOOTLOADER_ADDR + .warning "Code reaches into boot loader!" + .endif + diff --git a/avr/devices/n31/n31-enclosure.stl b/avr/devices/n31/n31-enclosure.stl new file mode 100644 index 0000000000000000000000000000000000000000..e9e0de6433f1a524ccd988e3d58e4d3cd82fb8c3 GIT binary patch literal 105084 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ÂkT;v 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 + AQUA + N + 31 + + + + + + +