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>
boot
main
test
</subdirs>
<extradist>

View File

@@ -7,13 +7,25 @@
<values>
<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_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_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_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_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_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_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_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" />
</values>

View File

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

View File

@@ -62,16 +62,28 @@
.equ COM_DATA_PUE = PUEA
.equ COM_DATA_PIN = PORTA2
.equ COM_ATTN_DDR = DDRA
.equ COM_ATTN_INPUT = PINA
.equ COM_ATTN_OUTPUT = PORTA
.equ COM_ATTN_PUE = PUEA
.equ COM_ATTN_PIN = PORTA0
.equ COM_ATTN0_DDR = DDRA
.equ COM_ATTN0_INPUT = PINA
.equ COM_ATTN0_OUTPUT = PORTA
.equ COM_ATTN0_PUE = PUEA
.equ COM_ATTN0_PIN = PORTA0
.equ COM_IRQ_ADDR_ATTN = PCMSK0
.equ COM_IRQ_BIT_ATTN = PCINT0 ; bit 0 in PCMSK0
.equ COM_IRQ_GIFR_ATTN = PCIF0
.equ COM_IRQ_GIMSK_ATTN = PCIE0
.equ COM_IRQ_ADDR_ATTN0 = PCMSK0
.equ COM_IRQ_BIT_ATTN0 = PCINT0 ; bit 0 in PCMSK0
.equ COM_IRQ_GIFR_ATTN0 = PCIF0
.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

View File

@@ -47,12 +47,16 @@
; ---------------------------------------------------------------------------
; 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
@@ -73,12 +77,14 @@
;#define MODULES_TTYONUART1
#define MODULES_COMONUART0
#define MODULES_COMONUART1
#define APPS_STATS
#define APPS_NETWORK
;#define APPS_REPORTSENSORS
.equ NET_BUFFERS_NUM = 12
.equ NET_BUFFERS_NUM = 9
.equ NET_BUFFERS_SIZE = 32
.equ UART_HW_MSGNUMINBUF_SIZE = 8
@@ -89,6 +95,8 @@
; ---------------------------------------------------------------------------
; defines for values
.equ VALUE_ID_DS18B20_TEMP = 0x06
.equ VALUE_ID_LEDSIMPLE_TIMING = 0x88
@@ -159,10 +167,13 @@ firmwareStart:
; @routine onSystemStart
onSystemStart:
clr r16
sts debugCounter, r16
ldi r16, 0xff
sts attnByte, r16
; 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
@@ -182,7 +193,8 @@ onEveryDay:
onEveryMinute:
rcall sendPacketsIface2In
rcall sendErrorsIface2
; rcall sendErrorsIface2
rcall sendDeviceUart1
ret
; @end
@@ -223,16 +235,13 @@ onAttnChangeIsr:
push r15
in r15, SREG
push r16
in r16, COM_ATTN_INPUT
push r17
lds r17, attnByte
sts attnByte, r16
eor r17, r16
sbrc r17, COM_ATTN1_PIN
rcall onAttnChangeAttn1
sbrc r17, COM_ATTN_PIN
rcall onAttnChangeAttn0
pop r17
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
@@ -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
;
@@ -267,18 +264,16 @@ checkRecvdMsg:
push xl
push xh
adiw xh:xl, 1
rcall onMessageReceived
rcall mainModulesOnPacketReceived
rcall mainAppsOnPacketReceived
rcall letSysHandleMsg
pop xh
pop xl
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
andi r17, (1<<NET_IFACE_BUFFER_IFACENUM1_BIT) | (1<<NET_IFACE_BUFFER_IFACENUM0_BIT)
rcall reverseInterfaceNum ; (R17)
; ldi r17, COMONUART0_IFACENUM ; DEBUG: send everything to uart1 to test that code first
rcall addMsgToInterface
brcc checkRecvdMsg_end ; could not add, jmp
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
;
; @param r17 buffer num
; @return r17 reversed interface number
; @clobbers r16, r17
; @clobbers r17
reverseInterfaceNum:
ldi r16, (NET_IFACE_BUFFER_IFACENUM1_BIT | NET_IFACE_BUFFER_IFACENUM0_BIT)
eor r17, r16
andi r17, (1<<NET_IFACE_BUFFER_IFACENUM1_BIT) | (1<<NET_IFACE_BUFFER_IFACENUM0_BIT)
cpi r17, COMONUART0_IFACENUM
brne reverseInterfaceNum_notuart0
ldi r17, COMONUART1_IFACENUM
ret
reverseInterfaceNum_notuart0:
ldi r17, COMONUART0_IFACENUM
ret
; @end
@@ -311,17 +340,19 @@ reverseInterfaceNum:
addMsgToInterface:
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 yh, HIGH(comOnUart0_iface)
rjmp NET_Interface_AddOutgoingMsgNum ; try to add msg to interface
addMsgToInterface_notUart0:
addMsgToInterface_toUart1:
ldi yl, LOW(comOnUart1_iface)
ldi yh, HIGH(comOnUart1_iface)
rjmp NET_Interface_AddOutgoingMsgNum ; try to add msg to interface
addMsgToInterface_end:
clc
ret
; @end
@@ -329,22 +360,43 @@ addMsgToInterface_end:
sendPacketsIface2In:
ldi yl, LOW(netInterfaceData)
ldi yh, HIGH(netInterfaceData)
ldi r17, AQHOME_VALUEID_STATS_PACKETS2_IN
lds r18, comOnUart1_iface+NET_IFACE_OFFS_PACKETSIN_LOW
lds r19, comOnUart1_iface+NET_IFACE_OFFS_PACKETSIN_HIGH
rjmp appStatsSend16BitValue
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
ldi r17, AQHOME_VALUEID_STATS_PACKETS_OUT2
lds r18, comOnUart1_iface+NET_IFACE_OFFS_PACKETSOUT_LOW
lds r19, comOnUart1_iface+NET_IFACE_OFFS_PACKETSOUT_HIGH
rjmp SendValueReport
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
.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