added test firmware for r04.

This commit is contained in:
Martin Preuss
2025-07-03 22:11:27 +02:00
parent bfd0cd77a9
commit 725ff96425
7 changed files with 448 additions and 76 deletions

View File

@@ -5,6 +5,7 @@
<subdirs> <subdirs>
boot boot
main main
test
</subdirs> </subdirs>
<extradist> <extradist>

View File

@@ -7,13 +7,25 @@
<values> <values>
<value name="DS18B20_TEMP" id="0x06" type="sensor" dataType="rational" modality="temperature" units="C" denom="16" /> <value name="DS18B20_TEMP" id="0x06" type="sensor" dataType="rational" modality="temperature" units="C" denom="16" />
<value name="stats_packets_in" id="0xe0" type="sensor" dataType="uint16" denom="1" /> <value name="stats_packets_in" id="0xe0" type="sensor" dataType="uint16" denom="1" />
<value name="stats_packets_out" id="0xe1" type="sensor" dataType="uint16" denom="1" /> <value name="stats_packets_out" id="0xe1" type="sensor" dataType="uint16" denom="1" />
<value name="stats_content_errors" id="0xe2" type="sensor" dataType="uint16" denom="1" /> <value name="stats_content_errors" id="0xe2" type="sensor" dataType="uint16" denom="1" />
<value name="stats_io_errors" id="0xe3" type="sensor" dataType="uint16" denom="1" /> <value name="stats_io_errors" id="0xe3" type="sensor" dataType="uint16" denom="1" />
<value name="stats_nobuf_errors" id="0xe4" type="sensor" dataType="uint16" denom="1" /> <value name="stats_nobuf_errors" id="0xe4" type="sensor" dataType="uint16" denom="1" />
<value name="stats_collision_errors" id="0xe5" type="sensor" dataType="uint16" denom="1" /> <value name="stats_collision_errors" id="0xe5" type="sensor" dataType="uint16" denom="1" />
<value name="stats_busy_errors" id="0xe6" type="sensor" dataType="uint16" denom="1" /> <value name="stats_busy_errors" id="0xe6" type="sensor" dataType="uint16" denom="1" />
<value name="stats_msgsize_errors" id="0xe7" type="sensor" dataType="uint16" denom="1" />
<value name="stats_missed_errors" id="0xe8" type="sensor" dataType="uint16" denom="1" />
<value name="stats_packets_in2" id="0xe9" type="sensor" dataType="uint16" denom="1" />
<value name="stats_packets_out2" id="0xea" type="sensor" dataType="uint16" denom="1" />
<value name="stats_content_errors2" id="0xeb" type="sensor" dataType="uint16" denom="1" />
<value name="stats_io_errors2" id="0xec" type="sensor" dataType="uint16" denom="1" />
<value name="stats_nobuf_errors2" id="0xed" type="sensor" dataType="uint16" denom="1" />
<value name="stats_collision_errors2" id="0xee" type="sensor" dataType="uint16" denom="1" />
<value name="stats_busy_errors2" id="0xef" type="sensor" dataType="uint16" denom="1" />
<value name="stats_msgsize_errors2" id="0xf0" type="sensor" dataType="uint16" denom="1" />
<value name="stats_missed_errors2" id="0xf1" type="sensor" dataType="uint16" denom="1" />
<value name="LEDTIMING" id="0x88" type="actor" dataType="uint16" /> <value name="LEDTIMING" id="0x88" type="actor" dataType="uint16" />
</values> </values>

View File

@@ -39,6 +39,7 @@
.equ LED_PINNUM = PORTB2 .equ LED_PINNUM = PORTB2
; *************************************************************************** ; ***************************************************************************
; code segment ; code segment

View File

@@ -62,16 +62,28 @@
.equ COM_DATA_PUE = PUEA .equ COM_DATA_PUE = PUEA
.equ COM_DATA_PIN = PORTA2 .equ COM_DATA_PIN = PORTA2
.equ COM_ATTN_DDR = DDRA .equ COM_ATTN0_DDR = DDRA
.equ COM_ATTN_INPUT = PINA .equ COM_ATTN0_INPUT = PINA
.equ COM_ATTN_OUTPUT = PORTA .equ COM_ATTN0_OUTPUT = PORTA
.equ COM_ATTN_PUE = PUEA .equ COM_ATTN0_PUE = PUEA
.equ COM_ATTN_PIN = PORTA0 .equ COM_ATTN0_PIN = PORTA0
.equ COM_IRQ_ADDR_ATTN = PCMSK0 .equ COM_IRQ_ADDR_ATTN0 = PCMSK0
.equ COM_IRQ_BIT_ATTN = PCINT0 ; bit 0 in PCMSK0 .equ COM_IRQ_BIT_ATTN0 = PCINT0 ; bit 0 in PCMSK0
.equ COM_IRQ_GIFR_ATTN = PCIF0 .equ COM_IRQ_GIFR_ATTN0 = PCIF0
.equ COM_IRQ_GIMSK_ATTN = PCIE0 .equ COM_IRQ_GIMSK_ATTN0 = PCIE0
; compatibility
.equ COM_ATTN_DDR = COM_ATTN0_DDR
.equ COM_ATTN_INPUT = COM_ATTN0_INPUT
.equ COM_ATTN_OUTPUT = COM_ATTN0_OUTPUT
.equ COM_ATTN_PUE = COM_ATTN0_PUE
.equ COM_ATTN_PIN = COM_ATTN0_PIN
.equ COM_IRQ_ADDR_ATTN = COM_IRQ_ADDR_ATTN0
.equ COM_IRQ_BIT_ATTN = COM_IRQ_BIT_ATTN0
.equ COM_IRQ_GIFR_ATTN = COM_IRQ_GIFR_ATTN0
.equ COM_IRQ_GIMSK_ATTN = COM_IRQ_GIMSK_ATTN0
; settings for comOnUart1 ; settings for comOnUart1

View File

@@ -47,12 +47,16 @@
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; generic ; generic
.equ COMONUART0_IFACENUM = 1
.equ COMONUART1_IFACENUM = 2
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; firmware settings including list of modules used ; firmware settings including list of modules used
#define MAIN_WITHOUT_MSG_HANDLING ; we do message handling ourselfes #define MAIN_WITHOUT_MSG_HANDLING ; we do message handling ourselfes
#define APP_STATS_NETDEV2
#define MODULES_CLOCK #define MODULES_CLOCK
;#define MODULES_COM ;#define MODULES_COM
@@ -73,12 +77,14 @@
;#define MODULES_TTYONUART1 ;#define MODULES_TTYONUART1
#define MODULES_COMONUART0 #define MODULES_COMONUART0
#define MODULES_COMONUART1 #define MODULES_COMONUART1
#define APPS_STATS #define APPS_STATS
#define APPS_NETWORK #define APPS_NETWORK
;#define APPS_REPORTSENSORS
.equ NET_BUFFERS_NUM = 12 .equ NET_BUFFERS_NUM = 9
.equ NET_BUFFERS_SIZE = 32 .equ NET_BUFFERS_SIZE = 32
.equ UART_HW_MSGNUMINBUF_SIZE = 8 .equ UART_HW_MSGNUMINBUF_SIZE = 8
@@ -89,6 +95,8 @@
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; defines for values ; defines for values
.equ VALUE_ID_DS18B20_TEMP = 0x06
.equ VALUE_ID_LEDSIMPLE_TIMING = 0x88 .equ VALUE_ID_LEDSIMPLE_TIMING = 0x88
@@ -159,10 +167,13 @@ firmwareStart:
; @routine onSystemStart ; @routine onSystemStart
onSystemStart: onSystemStart:
clr r16 ; set interface number for UART0
sts debugCounter, r16 ldi r16, COMONUART0_IFACENUM
ldi r16, 0xff sts comOnUart0_iface+NET_IFACE_OFFS_IFACENUM, r16
sts attnByte, r16 ; set interface number for UART1
ldi r16, COMONUART1_IFACENUM
sts comOnUart1_iface+NET_IFACE_OFFS_IFACENUM, r16
ret ret
; @end ; @end
@@ -182,7 +193,8 @@ onEveryDay:
onEveryMinute: onEveryMinute:
rcall sendPacketsIface2In rcall sendPacketsIface2In
rcall sendErrorsIface2 ; rcall sendErrorsIface2
rcall sendDeviceUart1
ret ret
; @end ; @end
@@ -223,16 +235,13 @@ onAttnChangeIsr:
push r15 push r15
in r15, SREG in r15, SREG
push r16 push r16
in r16, COM_ATTN_INPUT inr r16, COM_ATTN1_INPUT
push r17 sbrs r16, COM_ATTN1_PIN
lds r17, attnByte rcall ComOnUart1_HandleAttnChange ; (none)
sts attnByte, r16
eor r17, r16 inr r16, COM_ATTN0_INPUT
sbrc r17, COM_ATTN1_PIN sbrs r16, COM_ATTN0_PIN
rcall onAttnChangeAttn1 rcall ComOnUart0_HandleAttnChange ; (none)
sbrc r17, COM_ATTN_PIN
rcall onAttnChangeAttn0
pop r17
pop r16 pop r16
out SREG, r15 out SREG, r15
pop r15 pop r15
@@ -241,18 +250,6 @@ onAttnChangeIsr:
onAttnChangeAttn0:
sbrs r16, COM_ATTN_PIN
rcall ComOnUart0_HandleAttnChange ; (none)
ret
onAttnChangeAttn1:
sbrs r16, COM_ATTN1_PIN
rcall ComOnUart1_HandleAttnChange ; (none)
ret
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine checkRecvdMsg ; @routine checkRecvdMsg
; ;
@@ -267,18 +264,16 @@ checkRecvdMsg:
push xl push xl
push xh push xh
adiw xh:xl, 1 adiw xh:xl, 1
rcall onMessageReceived rcall letSysHandleMsg
rcall mainModulesOnPacketReceived
rcall mainAppsOnPacketReceived
pop xh pop xh
pop xl pop xl
pop r16 pop r16
; forward to other interface ; forward to other interface
ld r17, X ld r17, X
andi r17, (NET_IFACE_BUFFER_IFACENUM1_BIT | NET_IFACE_BUFFER_IFACENUM0_BIT) andi r17, (1<<NET_IFACE_BUFFER_IFACENUM1_BIT) | (1<<NET_IFACE_BUFFER_IFACENUM0_BIT)
rcall reverseInterfaceNum ; (R16, R17) rcall reverseInterfaceNum ; (R17)
; ldi r17, COMONUART0_IFACENUM ; DEBUG: send everything to uart0 to test that code first ; ldi r17, COMONUART0_IFACENUM ; DEBUG: send everything to uart1 to test that code first
rcall addMsgToInterface rcall addMsgToInterface
brcc checkRecvdMsg_end ; could not add, jmp brcc checkRecvdMsg_end ; could not add, jmp
rcall NET_GetNextIncomingMsgNum ; take off the queue rcall NET_GetNextIncomingMsgNum ; take off the queue
@@ -289,16 +284,50 @@ checkRecvdMsg_end:
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 ; @routine reverseInterfaceNum
; ;
; @param r17 buffer num ; @param r17 buffer num
; @return r17 reversed interface number ; @return r17 reversed interface number
; @clobbers r16, r17 ; @clobbers r17
reverseInterfaceNum: reverseInterfaceNum:
ldi r16, (NET_IFACE_BUFFER_IFACENUM1_BIT | NET_IFACE_BUFFER_IFACENUM0_BIT) andi r17, (1<<NET_IFACE_BUFFER_IFACENUM1_BIT) | (1<<NET_IFACE_BUFFER_IFACENUM0_BIT)
eor r17, r16 cpi r17, COMONUART0_IFACENUM
brne reverseInterfaceNum_notuart0
ldi r17, COMONUART1_IFACENUM
ret
reverseInterfaceNum_notuart0:
ldi r17, COMONUART0_IFACENUM
ret ret
; @end ; @end
@@ -311,17 +340,19 @@ reverseInterfaceNum:
addMsgToInterface: addMsgToInterface:
cpi r17, COMONUART0_IFACENUM cpi r17, COMONUART0_IFACENUM
brne addMsgToInterface_notUart0 breq addMsgToInterface_toUart0
cpi r17, COMONUART1_IFACENUM
breq addMsgToInterface_toUart1
clc
ret
addMsgToInterface_toUart0:
ldi yl, LOW(comOnUart0_iface) ldi yl, LOW(comOnUart0_iface)
ldi yh, HIGH(comOnUart0_iface) ldi yh, HIGH(comOnUart0_iface)
rjmp NET_Interface_AddOutgoingMsgNum ; try to add msg to interface rjmp NET_Interface_AddOutgoingMsgNum ; try to add msg to interface
addMsgToInterface_notUart0: addMsgToInterface_toUart1:
ldi yl, LOW(comOnUart1_iface) ldi yl, LOW(comOnUart1_iface)
ldi yh, HIGH(comOnUart1_iface) ldi yh, HIGH(comOnUart1_iface)
rjmp NET_Interface_AddOutgoingMsgNum ; try to add msg to interface rjmp NET_Interface_AddOutgoingMsgNum ; try to add msg to interface
addMsgToInterface_end:
clc
ret
; @end ; @end
@@ -329,22 +360,43 @@ addMsgToInterface_end:
sendPacketsIface2In: sendPacketsIface2In:
ldi yl, LOW(netInterfaceData) ldi yl, LOW(netInterfaceData)
ldi yh, HIGH(netInterfaceData) ldi yh, HIGH(netInterfaceData)
ldi r17, AQHOME_VALUEID_STATS_PACKETS2_IN ldi r17, AQHOME_VALUEID_STATS_PACKETS_OUT2
lds r18, comOnUart1_iface+NET_IFACE_OFFS_PACKETSIN_LOW lds r18, comOnUart1_iface+NET_IFACE_OFFS_PACKETSOUT_LOW
lds r19, comOnUart1_iface+NET_IFACE_OFFS_PACKETSIN_HIGH lds r19, comOnUart1_iface+NET_IFACE_OFFS_PACKETSOUT_HIGH
rjmp appStatsSend16BitValue rjmp SendValueReport
sendErrorsIface2:
ldi yl, LOW(netInterfaceData)
ldi yh, HIGH(netInterfaceData)
ldi r17, 0xf0
lds r18, comOnUart1_iface+NET_IFACE_OFFS_ERR_MISSED_LOW
lds r19, comOnUart1_iface+NET_IFACE_OFFS_ERR_MISSED_HIGH
; lds r18, debugCounter
; clr r19
rjmp appStatsSend16BitValue
sendDeviceUart1:
ldi yl, LOW(comOnUart1_iface)
ldi yh, HIGH(comOnUart1_iface)
rjmp AppNetwork_SendDevice
; ---------------------------------------------------------------------------
; @routine SendValueReport
;
; @param R17 value id
; @param R19:R18 value
; @param R22 value type
SendValueReport:
push r17
rcall NET_Buffer_Alloc ; (R16, R17, X)
pop r17
brcc SendValueReport_end ; jmp on error
push r16 ; buffer num
ldi r16, 0xff ; DEST addr
adiw xh:xl, 1
ldi r20, 1
clr r21
rcall NETMSG_ValueWriteReport ; (R16, R17, R18, R19, R20, R21, R23, R24, R25)
sbiw xh:xl, 1
pop r16 ; buffer num
rcall NET_Interface_AddOrReleaseOutMsg ; (R16, R17, R18, X)
SendValueReport_end:
ret
; @end
@@ -362,9 +414,6 @@ sendErrorsIface2:
; defines for network interface ; defines for network interface
.equ netInterfaceData = comOnUart0_iface .equ netInterfaceData = comOnUart0_iface
.equ netInterfaceData2 = comOnUart1_iface
.dseg
attnByte: .byte 1
debugCounter: .byte 1

View File

@@ -0,0 +1,33 @@
<?xml?>
<gwbuild>
<target type="AvrHexFile" name="r04_test" >
<includes type="avrasm" >
-I $(builddir)
-I $(srcdir)
-I $(topsrcdir)/avr
-I $(topbuilddir)/avr
</includes>
<sources type="avrasm" >
main.asm
</sources>
</target>
<subdirs>
</subdirs>
<extradist>
</extradist>
</gwbuild>

View File

@@ -0,0 +1,264 @@
; ***************************************************************************
; 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 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/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
.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 APP_STATS_NETDEV2
#define MODULES_CLOCK
;#define MODULES_COM
;#define MODULES_COM_WITH_ADDR_PROTO
;#define MODULES_LED
#define MODULES_LED_SIMPLE
;#define MODULES_TWI_MASTER
;#define MODULES_LCD
;#define LCD_MINIMAL_FONT
;#define MODULES_SI7021
;#define MODULES_STATS
;#define MODULES_CNY70
;#define MODULES_REED
#define MODULES_OWI_MASTER
#define MODULES_DS18B20
;#define MODULES_MOTION
#define MODULES_NETWORK
;#define MODULES_TTYONUART1
#define MODULES_COMONUART0
;#define MODULES_COMONUART1
#define APPS_STATS
#define APPS_NETWORK
#define APPS_REPORTSENSORS
.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 onAttnChangeIsr ; 3: PCINT0 Pin Change Interrupt 0
reti ; 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
reti ; 27: USART1_RXC USART1 Rx Complete
; rjmp ComOnUart1_TxUdreIsr ; 28: USART1_DRE USART1 Data Register Empty
reti ; 28: USART1_DRE USART1 Data Register Empty
; rjmp ComOnUart1_TxCharIsr ; 29: USART1_TXC USART1 Tx Complete
reti ; 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:
; set interface number for UART0
ldi r16, COMONUART0_IFACENUM
sts comOnUart0_iface+NET_IFACE_OFFS_IFACENUM, r16
; set interface number for UART1
; ldi r16, COMONUART1_IFACENUM
; sts comOnUart1_iface+NET_IFACE_OFFS_IFACENUM, r16
ret
; @end
onEvery100ms:
onEverySecond:
onEveryMinute:
onEveryHour:
onEveryDay:
ret
; ---------------------------------------------------------------------------
; @routine onEveryLoop
;
; Called on every loop (i.e. after awakening from sleep).
onEveryLoop:
ret
; @end
; ---------------------------------------------------------------------------
; @routine onMessageReceived
;
; Called on every message received
onMessageReceived:
clc
ret
; @end
; ---------------------------------------------------------------------------
; @routine onAttnChange @global @isr
;
; Called whenever PCINT0 is activated.
; This code assumes that both ATTN pins are on the same port which is true for
; R04 nodes.
onAttnChangeIsr:
push r15
in r15, SREG
push r16
; inr r16, COM_ATTN1_INPUT
; sbrs r16, COM_ATTN1_PIN
; rcall ComOnUart1_HandleAttnChange ; (none)
; inr r16, COM_ATTN0_INPUT
; sbrs r16, COM_ATTN0_PIN
rcall ComOnUart0_HandleAttnChange ; (none)
pop r16
out SREG, r15
pop r15
reti
; @end
; ***************************************************************************
; includes
.include "devices/all/hw_tn841.asm"
.include "devices/all/includes.asm"
; ---------------------------------------------------------------------------
; defines for network interface
.equ netInterfaceData = comOnUart0_iface
;.equ netInterfaceData2 = comOnUart1_iface