; *************************************************************************** ; 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 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 ;#define WITH_LCD .nolist .include "include/tn841def.inc" ; Define device ATtiny841 .list .include "../defs.asm" .include "version.asm" ;.include "defs_all.asm" .include "devices/all/defs.asm" .include "common/calls.asm" .include "common/utils_wait.asm" .include "common/utils_io.asm" ; *************************************************************************** ; defines ; --------------------------------------------------------------------------- ; generic ; --------------------------------------------------------------------------- ; network interfaces .equ COMONUART0_IFACENUM = 1 .equ COMONUART1_IFACENUM = 2 ; --------------------------------------------------------------------------- ; firmware settings including list of modules used #define MAIN_WITHOUT_MSG_HANDLING ; we do message handling ourselfes #define MODULES_CLOCK #define MODULES_LED_SIMPLE #ifdef WITH_LCD #define MODULES_TWI_MASTER ; using TWI display for debugging #define MODULES_LCD #define LCD_MINIMAL_FONT #else ; decrease code when using display #define MODULES_OWI_MASTER #define MODULES_DS18B20 #define APPS_STATS #endif #define MODULES_NETWORK #define MODULES_COMONUART0 #define MODULES_COMONUART1 #define APPS_NETWORK .equ NET_BUFFERS_NUM = 8 .equ NET_BUFFERS_SIZE = 32 .equ UART_HW_MSGNUMINBUF_SIZE = 8 .equ UART_HW_MSGNUMOUTBUF_SIZE = 8 ; --------------------------------------------------------------------------- ; defines for values .equ VALUE_ID_DS18B20_TEMP = 0x06 .equ VALUE_ID_LEDSIMPLE_TIMING = 0x88 ; *************************************************************************** ; code segment .cseg .org 000000 ; --------------------------------------------------------------------------- ; Reset and interrupt vectors rjmp BOOTLOADER_ADDR ; 1: RESET Reset vector use this for flashed system reti ; 2: INT0 External Interrupt Request 0 rjmp ComOnUart0_AttnChangeIsr ; 3: PCINT0 Pin Change Interrupt 0 rjmp ComOnUart1_AttnChangeIsr ; 4: PCINT1 Pin Change Interrupt 1 reti ; 5: WDT Watchdog Time-out reti ; 6: TIM1_CAPT Timer/Counter1 Capture Event reti ; 7: TIM1_COMPA (OC1A) Timer/Counter1 Compare Match A reti ; 8: TIM1_COMPB (OC1B) Timer/Counter1 Compare Match B reti ; 9: TIM1_OVF (OVF1) Timer/Counter1 Overflow rjmp baseTimerIrqOC0A ; 10: TIM0_COMPA (OC0A) Timer/Counter0 Compare Match A reti ; 11: TIM0_COMPB (OC0B) Timer/Counter0 Compare Match B reti ; 12: TIM0_OVF (OVF0) Timer/Counter0 Overflow reti ; 13: ANA_COMP0 Analog Comparator 0 reti ; 14: ADC_READY ADC Conversion Complete reti ; 15: EE_RDY (ERDY) EEPROM Ready reti ; 16: ANA_COMP1 Analog Comparator 1 reti ; 17: TIM2_CAPT Timer/Counter2 Capture Event reti ; 18: TIM2_COMPA (OC2A) Timer/Counter2 Compare Match A reti ; 19: TIM2_COMPB (OC2B) Timer/Counter2 Compare Match B reti ; 20: TIM2_OVF (OVF2) Timer/Counter2 Overflow reti ; 21: SPI SPI Serial Transfer Complete reti ; 22: USART0_RXS USART0 Rx Start rjmp ComOnUart0_RxCharIsr ; 23: USART0_RXC USART0 Rx Complete rjmp ComOnUart0_TxUdreIsr ; 24: USART0_DRE USART0 Data Register Empty rjmp ComOnUart0_TxCharIsr ; 25: USART0_TXC USART0 Tx Complete reti ; 26: USART1_RXS USART1 Rx Start rjmp ComOnUart1_RxCharIsr ; 27: USART1_RXC USART1 Rx Complete rjmp ComOnUart1_TxUdreIsr ; 28: USART1_DRE USART1 Data Register Empty rjmp ComOnUart1_TxCharIsr ; 29: USART1_TXC USART1 Tx Complete reti ; 30: TWI Two-Wire-Interface reti ; 31: RESERVED reserved 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 onEvery100ms: onEverySecond: onEveryHour: onEveryDay: ret onEveryMinute: #ifdef APPS_STATS rcall sendPacketsIface2In #endif ret ; @end ; --------------------------------------------------------------------------- ; @routine onEveryLoop ; ; Called on every loop (i.e. after awakening from sleep). onEveryLoop: rcall checkRecvdMsg ret ; @end ; --------------------------------------------------------------------------- ; @routine onMessageReceived ; ; Called on every message received onMessageReceived: clc ret ; @end ; --------------------------------------------------------------------------- ; @routine checkRecvdMsg ; ; Read messages from either interface and forward to the other one. checkRecvdMsg: rcall NET_PeekNextIncomingMsgNum ; check read queue (bufNum->r16) brcc checkRecvdMsg_end ; no msg, jmp rcall NET_Buffer_Locate ; (R17) ; let system handle incoming messages push r16 adiw xh:xl, 1 rcall letSysHandleMsg sbiw xh:xl, 1 pop r16 ; forward to other interface ld r17, X andi r17, (NET_IFACE_BUFFER_IFACENUM1_BIT | NET_IFACE_BUFFER_IFACENUM0_BIT) rcall reverseInterfaceNum ; (R16, R17) ; ldi r17, COMONUART0_IFACENUM ; DEBUG: send everything to uart0 to test that code first rcall addMsgToInterface brcc checkRecvdMsg_end ; could not add, jmp rcall NET_GetNextIncomingMsgNum ; take off the queue rjmp checkRecvdMsg checkRecvdMsg_end: ret ; @end ; --------------------------------------------------------------------------- ; @routine letSysHandleMsg ; ; @param X pointer to msg to handle (point behind the buffer header!) ; @clobbers any, !X letSysHandleMsg: ld r16, X cpi r16, 0xff breq letSysHandleMsg_forMe lds r17, comOnUart0_iface+NET_IFACE_OFFS_ADDRESS cp r16, r17 brne letSysHandleMsg_end letSysHandleMsg_forMe: push xl push xh rcall onMessageReceived pop xh pop xl push xl push xh rcall mainModulesOnPacketReceived pop xh pop xl push xl push xh rcall mainAppsOnPacketReceived pop xh pop xl letSysHandleMsg_end: ret ; @end ; --------------------------------------------------------------------------- ; @routine reverseInterfaceNum ; ; @param r17 buffer num ; @return r17 reversed interface number ; @clobbers r16, r17 reverseInterfaceNum: ldi r16, (1<