; *************************************************************************** ; 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. * ; *************************************************************************** ;.equ clock=1000000 ; Define the clock frequency .equ clock=8000000 ; Define the clock frequency .nolist .include "include/m644Pdef.inc" ; Define device ATmega644P .list .include "version.asm" .include "../defs.asm" .include "./data.asm" .include "devices/all/defs.asm" .include "common/calls.asm" .include "common/utils_wait.asm" .include "common/utils_io.asm" ; *************************************************************************** ; defines ; --------------------------------------------------------------------------- ; generic .equ STACK_SIZE = 256 .equ NET_BUFFERS_NUM = 8 .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_XRAM ;#define MODULES_HEAP #define MODULES_LED_SIMPLE #define MODULES_NETWORK ;#define MODULES_COMONUART0 ;#define MODULES_UART_HW ;#define MODULES_UART_BITBANG #define MODULES_COM2W #define MODULES_SPI_HW #define MODULES_ILI9341 #define MODULES_FONT #define MODULES_GUI ;#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 APPS_NETWORK ;#define APPS_MOTION ;#define APPS_REPORTSENSORS #define APPS_STATS ; --------------------------------------------------------------------------- ; defines for values .equ VALUE_ID_SI7021_TEMP = 0x01 .equ VALUE_ID_SI7021_HUM = 0x02 .equ VALUE_ID_ADC = 0x03 ;.equ VALUE_ID_DS18B20_TEMP = 0x06 .equ VALUE_ID_MOTION = 0x07 .equ VALUE_ID_SGP40_TVOC = 0x08 .equ VALUE_ID_SGP30_TVOC = 0x09 .equ VALUE_ID_SGP30_CO2 = 0x0a ;.equ VALUE_ID_REED_CONF = 0x81 .equ VALUE_ID_DEBUG = 0x7f .equ VALUE_ID_LEDSIMPLE_TIMING = 0x88 ; *************************************************************************** ; code segment .cseg .org 000000 ; --------------------------------------------------------------------------- ; Reset and interrupt vectors jmp BOOTLOADER_ADDR ; 1: Reset vector RESET jmp com2wPcintIsr ; 2: INT0 External Interrupt Request 0 jmp irqNotSet ; 3: INT1 External Interrupt Request 1 jmp irqNotSet ; 4: INT2 External Interrupt Request 2 jmp irqNotSet ; 5: PCINT0 Pin Change Interrupt Request 0 jmp irqNotSet ; 6: PCINT1 Pin Change Interrupt Request 1 jmp irqNotSet ; 7: PCINT2 Pin Change Interrupt Request 2 jmp irqNotSet ; 8: PCINT3 Pin Change Interrupt Request 3 jmp irqNotSet ; 9: WDT Watchdog Time-out Interrupt jmp irqNotSet ; 10: TIMER2_COMPA Timer/Counter2 Compare Match A jmp irqNotSet ; 11: TIMER2_COMPB Timer/Counter2 Compare Match B jmp irqNotSet ; 12: TIMER2_OVF Timer/Counter2 Overflow jmp irqNotSet ; 13: TIMER1_CAPT Timer/Counter1 Capture Event jmp irqNotSet ; 14: TIMER1_COMPA Timer/Counter1 Compare Match A jmp irqNotSet ; 15: TIMER1_COMPB Timer/Counter1 Compare Match B jmp irqNotSet ; 16: TIMER1_OVF Timer/Counter1 Overflow jmp baseTimerIrqOC0A ; 17: TIMER0_COMPA Timer/Counter0 Compare Match A jmp irqNotSet ; 18: TIMER0_COMPB Timer/Counter0 Compare Match B jmp irqNotSet ; 19: TIMER0_OVF Timer/Counter0 Overflow jmp irqNotSet ; 20: SPI_STC Serial Transfer Complete jmp irqNotSet ; 21: USART0_RXC USART0 Rx Complete jmp irqNotSet ; 22: USART0_UDRE USART0 Data Register Empty jmp irqNotSet ; 23: USART0_TXC USART0 Tx Complete jmp irqNotSet ; 24: ANA_COMP Analog Comparator jmp irqNotSet ; 25: ADC ADC Conversion Complete jmp irqNotSet ; 26: EE_RDY EEPROM Ready jmp irqNotSet ; 27: TWI 2-Wire Interface jmp irqNotSet ; 28: SPM_RDY Store Program Memory Ready 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 irqNotSet: reti ; --------------------------------------------------------------------------- ; @routine onSystemStart onSystemStart: bigcall test 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_m644p.asm" .include "devices/all/includes.asm" ;.include "common/debug.asm" ;.include "modules/lcd2/font/font2.asm" ;.include "modules/lcd2/font/font3.asm" ;.include "modules/lcd2/font/font16x26.asm" ;.include "modules/lcd2/font/font4.asm" ;.include "modules/lcd2/font/font12x16.asm" .include "modules/lcd2/ili9341/font6x8.asm" .include "modules/lcd2/ili9341/font6x8_1.asm" ;.include "common/list_t.asm" ;.include "common/tree_t.asm" ;.include "common/divide.asm" ; --------------------------------------------------------------------------- ; defines for network interface ;.equ netInterfaceData = netUartIface ;.equ netInterfaceData = uart_bitbang_iface .equ netInterfaceData = com2w_iface test: #ifdef MODULES_GUI ldi yl, LOW(mainWindow) ldi yh, HIGH(mainWindow) ldi zl, LOW(mainWindowInFlash*2); ldi zh, HIGH(mainWindowInFlash*2); ldi r17, WIN_SIZE testCopyWinLoop: lpm r16, Z+ st Y+, r16 dec r17 brne testCopyWinLoop ldi yl, LOW(mainWindow) ldi yh, HIGH(mainWindow) bigcall Window_Clear #if 1 ldi zl, LOW(mainWindowTitle*2) ldi zh, HIGH(mainWindowTitle*2) ; print title at 10/2 ldi r16, 10 mov r4, r16 clr r5 ldi r16, 2 mov r6, r16 clr r7 bigcall Window_DrawTextFlash #else ldi zl, LOW(ili9341Font6x8_1*2) ldi zh, HIGH(ili9341Font6x8_1*2) ldi r16, LOW(0b0000000000000000) mov r0, r16 ldi r16, HIGH(0b0000000000000000) mov r1, r16 ldi r16, LOW(0b1111111111111111) mov r2, r16 ldi r16, HIGH(0b1111111111111111) mov r3, r16 ldi r16, 10 mov r4, r16 clr r5 ldi r16, 20 mov r6, r16 clr r7 ldi r16, 'A' bigcall Display_DrawChar add r4, r18 adc r5, r19 ldi r16, 'B' bigcall Display_DrawChar #endif ret testHandler: ret #ifdef MODULES_GUI mainWindowInFlash: .dw testHandler ; handler .dw 0 ; X .dw 0 ; Y .dw DISPLAY_WIDTH .dw DISPLAY_HEIGHT ; 0bRRRRRGGGGGGBBBBB .dw 0b0000000000011111 ; blue ; .dw 0b1111100000000000 ; red .dw 0b1111111111111111 ; white .dw (ili9341Font6x8_1*2) mainWindowTitle: .db "AQHOME", 0, 0 #endif .dseg mainWindow: .byte WIN_SIZE heapStart: .equ HEAP_START = heapStart .equ HEAP_SIZE = (SRAM_SIZE-STACK_SIZE)-HEAP_START