From a8381e5cea363746ce596f2b57e3dbe13d0a15a6 Mon Sep 17 00:00:00 2001 From: Tobias Date: Thu, 24 Sep 2015 18:34:43 +0200 Subject: [PATCH] Rename Files of different Devices Include Config Bytes with ow command 0x85 to get more information of an device (not finished, part 1) --- .../DS18B20_BMP280.atsln | 2 +- DS18B20_BMP280/DS18B20_BMP280.c | 149 +++++++++++ DS18B20_BMP280/DS18B20_BMP280.cproj | 139 +++++++++++ DS18B20_BMP280/OWDS18B20.S | 236 ++++++++++++++++++ DS18B20_DS2438/DS18B20_DS2438.c | 2 + DS18B20_DS2438/OWDS18B20_DS2438.S | 2 + DS18B20_MAX44009/DS18B20_MAX44009.atsln | 20 ++ .../{DS18B20.c => DS18B20_MAX44009.c} | 1 + .../{DS18B20.cproj => DS18B20_MAX44009.cproj} | 8 +- DS18B20_MAX44009/OWDS18B20.S | 1 + .../DS18B20_TC.atsln | 2 +- .../{DS18B20.c => DS18B20_TC.c} | 1 + .../{DS18B20.cproj => DS18B20_TC.cproj} | 8 +- DS18B20_Thermocouble/OWDS18B20.S | 1 + DS2423/DS2423.c | 1 + DS2423/OWDS2423.S | 1 + DS2438_DHT22/DS2438_DHT22.atsln | 10 +- DS2438_DHT22/DS2438_DHT22.c | 9 +- DS2438_DHT22/DS2438_DHT22.cproj | 6 +- DS2438_DHT22/OWDS2438.S | 3 + DS2450/DS2450.c | 3 +- DS2450/OWDS2450.S | 1 + common/OWCRC16.s | 2 +- common/OWCRC8.s | 2 +- common/OWConfig.s | 2 +- common/OWPinInterrupt.s | 6 +- common/OWRomFunctions.s | 55 +++- common/OWRomFunctionsDual.s | 68 ++++- common/OWSet_ATTINYX5.s | 21 +- vergleiche liste.xlsx | Bin 0 -> 9079 bytes 30 files changed, 720 insertions(+), 42 deletions(-) rename DS18B20_Thermocouble/DS18B20.atsln => DS18B20_BMP280/DS18B20_BMP280.atsln (84%) create mode 100644 DS18B20_BMP280/DS18B20_BMP280.c create mode 100644 DS18B20_BMP280/DS18B20_BMP280.cproj create mode 100644 DS18B20_BMP280/OWDS18B20.S create mode 100644 DS18B20_MAX44009/DS18B20_MAX44009.atsln rename DS18B20_MAX44009/{DS18B20.c => DS18B20_MAX44009.c} (97%) rename DS18B20_MAX44009/{DS18B20.cproj => DS18B20_MAX44009.cproj} (97%) rename DS18B20_MAX44009/DS18B20.atsln => DS18B20_Thermocouble/DS18B20_TC.atsln (85%) rename DS18B20_Thermocouble/{DS18B20.c => DS18B20_TC.c} (98%) rename DS18B20_Thermocouble/{DS18B20.cproj => DS18B20_TC.cproj} (97%) create mode 100644 vergleiche liste.xlsx diff --git a/DS18B20_Thermocouble/DS18B20.atsln b/DS18B20_BMP280/DS18B20_BMP280.atsln similarity index 84% rename from DS18B20_Thermocouble/DS18B20.atsln rename to DS18B20_BMP280/DS18B20_BMP280.atsln index 558a11d..764eb5c 100644 --- a/DS18B20_Thermocouble/DS18B20.atsln +++ b/DS18B20_BMP280/DS18B20_BMP280.atsln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 11.00 # Atmel Studio Solution File, Format Version 11.00 -Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "DS18B20", "DS18B20.cproj", "{7A5672FE-8226-4158-B931-E1F36B9A8858}" +Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "DS18B20_BMP280", "DS18B20_BMP280.cproj", "{7A5672FE-8226-4158-B931-E1F36B9A8858}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/DS18B20_BMP280/DS18B20_BMP280.c b/DS18B20_BMP280/DS18B20_BMP280.c new file mode 100644 index 0000000..ca6333b --- /dev/null +++ b/DS18B20_BMP280/DS18B20_BMP280.c @@ -0,0 +1,149 @@ + +// Copyright (c) 2015, Tobias Mueller tm(at)tm3d.de +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// * All advertising materials mentioning features or use of this +// software must display the following acknowledgement: This product +// includes software developed by tm3d.de and its contributors. +// * Neither the name of tm3d.de nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#define F_CPU 8000000UL +#include +#include +#include +#include +#include +#include +#include "../common/I2C/USI_TWI_Master.h" +#include "../common/I2C/BMP280.h" + + +extern void OWINIT(); + + + + +uint8_t owid[8]={0x28, 0xA2, 0xD9, 0x84, 0x00, 0x16, 0x77, 0x6B};/**/ +uint8_t config_info[16]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16}; + +#if (owid>128) +#error "Variable not correct" +#endif + +extern uint8_t mode; +extern uint8_t gcontrol; +extern uint8_t reset_indicator; +extern uint8_t alarmflag; + + + + +typedef union { + volatile uint8_t bytes[8]; + struct { + uint16_t temp; //0 + uint8_t TH; //2 + uint8_t TL; //3 + uint8_t config; //4 + uint8_t rrFF; //5 + uint8_t rr00; //6 + uint8_t rr10; //7 + }; +} pack_t; +volatile pack_t pack; + + + + + + + + +int main(void){ + PRR|=(1<>4; + uint8_t af=0; + if (t8>pack.TH) af=1; + if (t8<=pack.TL) af=1; + cli(); + pack.temp=w; + //pack.temp++; + alarmflag=af; + sei(); + gcontrol=0; + } + + +#if defined(__AVR_ATtiny25__)||defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) + if (((TIMSK & (1< + + + 2.0 + 6.2 + com.Atmel.AVRGCC8.C + {7a5672fe-8226-4158-b931-e1f36b9a8858} + ATtiny84A + none + Executable + C + $(MSBuildProjectName) + .elf + $(MSBuildProjectDirectory)\$(Configuration) + DS18B20_BMP280 + DS18B20_BMP280 + DS18B20_BMP280 + Native + true + false + true + true + 0x20000000 + + true + exception_table + 2 + 1 + + + + + + + + + + + + + com.atmel.avrdbg.tool.atmelice + + + + + debugWIRE + + com.atmel.avrdbg.tool.atmelice + J41800000779 + Atmel-ICE + + debugWIRE + + + + + + + + com.atmel.avrdbg.tool.simulator + + + Simulator + + + + + + True + True + True + True + False + True + True + + + NDEBUG + + + Optimize for size (-Os) + True + True + True + + + libm + + + + + + + + + True + True + True + True + False + True + True + + + DEBUG + + + Optimize (-O1) + True + True + Default (-g2) + True + + + libm + + + Default (-Wa,-g) + + + + + + compile + BMP280.c + + + compile + USI_TWI_Master.c + + + compile + + + compile + + + + \ No newline at end of file diff --git a/DS18B20_BMP280/OWDS18B20.S b/DS18B20_BMP280/OWDS18B20.S new file mode 100644 index 0000000..0ad51b6 --- /dev/null +++ b/DS18B20_BMP280/OWDS18B20.S @@ -0,0 +1,236 @@ + +// Copyright (c) 2015, Tobias Mueller tm(at)tm3d.de +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// * All advertising materials mentioning features or use of this +// software must display the following acknowledgement: This product +// includes software developed by tm3d.de and its contributors. +// * Neither the name of tm3d.de nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#define _CHANGEABLE_ID_ +#define _ZERO_POLLING_ + +#include "../common/OWConfig.s" +#include "../common/OWCRC8.s" + +.extern pack,8 + +//.extern am2302_temp,2 + + + +.macro CHIP_INIT +Init_EEPROM_read: + sbic _SFR_IO_ADDR(EECR), EEPE + rjmp Init_EEPROM_read + ldi r_temp,0 + out _SFR_IO_ADDR(EEARH), r_temp + ldi r_temp,2 + out _SFR_IO_ADDR(EEARL), r_temp + sbi _SFR_IO_ADDR(EECR), EERE + in r_temp,_SFR_IO_ADDR(EEDR) + sbrs r_temp,7 + rcall hrc_recall_eeprom_func +.endm + +.macro COMMAND_TABLE + rjmp h_readscratchpad + rjmp h_writescratchpad +.endm + +#include "../common/OWRomFunctions.s" +#include "../common/OWTimerInterrupt.s" + + + +; Ab hier Geraeteabhaenging +#define OW_READ_SCRATCHPAD OW_FIRST_COMMAND+0 +#define OW_WRITE_SCRATCHPAD OW_FIRST_COMMAND+1 + + +;--------------------------------------------------- +; READ COMMAND and start operation +;--------------------------------------------------- + + +h_readcommand: + clr r_bytep +#ifndef _DIS_FLASH_ + FLASH_COMMANDS ; muss zu erst sein.... +#endif + cjmp 0xBE,hrc_set_readscratchpad + cjmp 0x4E,hrc_set_writescratchpad + cjmp 0x44,hrc_set_convertT + cjmp 0x48,hrc_copy_scratchpad + cjmp 0xB8,hrc_recall_eeprom + FW_CONFIG_INFO +#ifdef _CHANGEABLE_ID_ + CHANGE_ID_COMMANDS +#endif + //ldi r_mode,OW_SLEEP + rjmp handle_end_sleep + +hrc_set_readscratchpad: + ldi r_mode,OW_READ_SCRATCHPAD + ldi r_sendflag,1 + CRCInit2 + rjmp h_readscratchpad + +hrc_set_writescratchpad: + ldi r_mode,OW_WRITE_SCRATCHPAD + ldi r_bytep,2 ;start to write in 2 + rjmp handle_end + +hrc_recall_eeprom: + rcall hrc_recall_eeprom_func + rjmp handle_end + + + +hrc_set_convertT: + ldi r_temp,1 + sts gcontrol,r_temp + ;lds temp,am2302_temp + //sts pack+1,temp + ;lds temp,am2302_temp+1 + //sts pack+2,temp +; ldi r_rwbyte,0 +; lds r_temp,pack +; swap r_temp +; andi r_temp,0x0F +; lds r_temp2,pack+1 +; swap r_temp2 +; andi r_temp2,0xF0 +; or r_temp,r_temp2 +; lds r_temp2,pack+2 +; cp r_temp,r_temp2 ;higher than or equal to TH +; brge hrc_set_convertT_set_arlarm +; lds r_temp2,pack+3 +; cp r_temp,r_temp2 ;lower than or equal to TL +; brlt hrc_set_convertT_set_arlarm +; breq hrc_set_convertT_set_arlarm +; rjmp hrc_set_convertT_end +;hrc_set_convertT_set_arlarm: +; ldi r_rwbyte,1 +;hrc_set_convertT_end: +; sts alarmflag,r_rwbyte + rjmp handle_end_sleep + + +hrc_copy_scratchpad: + ldi r_bytep,2 + configZ pack,r_bytep + clr r_bytep +hrc_copy_scratchpad_EEPROM_write: + sbic _SFR_IO_ADDR(EECR), EEPE + rjmp hrc_copy_scratchpad_EEPROM_write + ldi r_temp, (0<128) #error "Variable not correct" diff --git a/DS18B20_DS2438/OWDS18B20_DS2438.S b/DS18B20_DS2438/OWDS18B20_DS2438.S index d0503b7..bf7146e 100644 --- a/DS18B20_DS2438/OWDS18B20_DS2438.S +++ b/DS18B20_DS2438/OWDS18B20_DS2438.S @@ -104,6 +104,7 @@ h_readcommand1: cjmp 0x44,hrc_set_convertT1 cjmp 0x48,hrc_copy_scratchpad1 cjmp 0xB8,hrc_recall_eeprom1 + FW_CONFIG_INFO1 #ifdef _CHANGEABLE_ID_ CHANGE_ID_COMMANDS #endif @@ -239,6 +240,7 @@ h_readcommand2: cset 0x4E,OW_WRITE_SCRATCHPAD_ADR2 cjmp 0x44,hrc_set_convertT2 cjmp 0xB4,hrc_set_convertV2 + FW_CONFIG_INFO2 #ifdef _CHANGEABLE_ID_ CHANGE_ID_COMMANDS #endif diff --git a/DS18B20_MAX44009/DS18B20_MAX44009.atsln b/DS18B20_MAX44009/DS18B20_MAX44009.atsln new file mode 100644 index 0000000..bce8cd3 --- /dev/null +++ b/DS18B20_MAX44009/DS18B20_MAX44009.atsln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Atmel Studio Solution File, Format Version 11.00 +Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "DS18B20_MAX44009", "DS18B20_MAX44009.cproj", "{7A5672FE-8226-4158-B931-E1F36B9A8858}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|AVR = Debug|AVR + Release|AVR = Release|AVR + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7A5672FE-8226-4158-B931-E1F36B9A8858}.Debug|AVR.ActiveCfg = Debug|AVR + {7A5672FE-8226-4158-B931-E1F36B9A8858}.Debug|AVR.Build.0 = Debug|AVR + {7A5672FE-8226-4158-B931-E1F36B9A8858}.Release|AVR.ActiveCfg = Release|AVR + {7A5672FE-8226-4158-B931-E1F36B9A8858}.Release|AVR.Build.0 = Release|AVR + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DS18B20_MAX44009/DS18B20.c b/DS18B20_MAX44009/DS18B20_MAX44009.c similarity index 97% rename from DS18B20_MAX44009/DS18B20.c rename to DS18B20_MAX44009/DS18B20_MAX44009.c index 12e682b..359d95e 100644 --- a/DS18B20_MAX44009/DS18B20.c +++ b/DS18B20_MAX44009/DS18B20_MAX44009.c @@ -48,6 +48,7 @@ extern void OWINIT(); uint8_t owid[8]={0x28, 0xA2, 0xD9, 0x84, 0x00, 0x16, 0x77, 0x6B};/**/ +uint8_t config_info[16]={0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; #if (owid>128) #error "Variable not correct" diff --git a/DS18B20_MAX44009/DS18B20.cproj b/DS18B20_MAX44009/DS18B20_MAX44009.cproj similarity index 97% rename from DS18B20_MAX44009/DS18B20.cproj rename to DS18B20_MAX44009/DS18B20_MAX44009.cproj index 2220867..a5cba43 100644 --- a/DS18B20_MAX44009/DS18B20.cproj +++ b/DS18B20_MAX44009/DS18B20_MAX44009.cproj @@ -12,9 +12,9 @@ $(MSBuildProjectName) .elf $(MSBuildProjectDirectory)\$(Configuration) - DS18B20 - DS18B20 - DS18B20 + DS18B20_MAX44009 + DS18B20_MAX44009 + DS18B20_MAX44009 Native true false @@ -128,7 +128,7 @@ compile USI_TWI_Master.c - + compile diff --git a/DS18B20_MAX44009/OWDS18B20.S b/DS18B20_MAX44009/OWDS18B20.S index 27d7b8f..0ad51b6 100644 --- a/DS18B20_MAX44009/OWDS18B20.S +++ b/DS18B20_MAX44009/OWDS18B20.S @@ -87,6 +87,7 @@ h_readcommand: cjmp 0x44,hrc_set_convertT cjmp 0x48,hrc_copy_scratchpad cjmp 0xB8,hrc_recall_eeprom + FW_CONFIG_INFO #ifdef _CHANGEABLE_ID_ CHANGE_ID_COMMANDS #endif diff --git a/DS18B20_MAX44009/DS18B20.atsln b/DS18B20_Thermocouble/DS18B20_TC.atsln similarity index 85% rename from DS18B20_MAX44009/DS18B20.atsln rename to DS18B20_Thermocouble/DS18B20_TC.atsln index 558a11d..6bb479f 100644 --- a/DS18B20_MAX44009/DS18B20.atsln +++ b/DS18B20_Thermocouble/DS18B20_TC.atsln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 11.00 # Atmel Studio Solution File, Format Version 11.00 -Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "DS18B20", "DS18B20.cproj", "{7A5672FE-8226-4158-B931-E1F36B9A8858}" +Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "DS18B20_TC", "DS18B20_TC.cproj", "{7A5672FE-8226-4158-B931-E1F36B9A8858}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/DS18B20_Thermocouble/DS18B20.c b/DS18B20_Thermocouble/DS18B20_TC.c similarity index 98% rename from DS18B20_Thermocouble/DS18B20.c rename to DS18B20_Thermocouble/DS18B20_TC.c index 2ac3b11..bd618b4 100644 --- a/DS18B20_Thermocouble/DS18B20.c +++ b/DS18B20_Thermocouble/DS18B20_TC.c @@ -52,6 +52,7 @@ const float j_rs[70] PROGMEM ={0, 18.302913, 34.830476, 50.783019, 70.653704, 90 uint8_t owid[8]={0x28, 0xA2, 0xD9, 0x84, 0x00, 0x16, 0x02, 0xAC};/**/ +uint8_t config_info[16]={0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; #if (owid>128) #error "Variable not correct" diff --git a/DS18B20_Thermocouble/DS18B20.cproj b/DS18B20_Thermocouble/DS18B20_TC.cproj similarity index 97% rename from DS18B20_Thermocouble/DS18B20.cproj rename to DS18B20_Thermocouble/DS18B20_TC.cproj index b5a8073..1a2f8e8 100644 --- a/DS18B20_Thermocouble/DS18B20.cproj +++ b/DS18B20_Thermocouble/DS18B20_TC.cproj @@ -12,9 +12,9 @@ $(MSBuildProjectName) .elf $(MSBuildProjectDirectory)\$(Configuration) - DS18B20 - DS18B20 - DS18B20 + DS18B20_TC + DS18B20_TC + DS18B20_TC Native true false @@ -108,7 +108,7 @@ - + compile diff --git a/DS18B20_Thermocouble/OWDS18B20.S b/DS18B20_Thermocouble/OWDS18B20.S index 322f70f..351b949 100644 --- a/DS18B20_Thermocouble/OWDS18B20.S +++ b/DS18B20_Thermocouble/OWDS18B20.S @@ -86,6 +86,7 @@ h_readcommand: cjmp 0x44,hrc_set_convertT cjmp 0x48,hrc_copy_scratchpad cjmp 0xB8,hrc_recall_eeprom + FW_CONFIG_INFO #ifdef _CHANGEABLE_ID_ CHANGE_ID_COMMANDS #endif diff --git a/DS2423/DS2423.c b/DS2423/DS2423.c index d4d376c..73cb3b6 100644 --- a/DS2423/DS2423.c +++ b/DS2423/DS2423.c @@ -54,6 +54,7 @@ extern void OWINIT(); uint8_t owid[8]={0x1D, 0xA2, 0xD9, 0x84, 0x00, 0x26, 0x02, 0x5C};/**/ +uint8_t config_info[16]={0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; diff --git a/DS2423/OWDS2423.S b/DS2423/OWDS2423.S index e0a97fd..47737ca 100644 --- a/DS2423/OWDS2423.S +++ b/DS2423/OWDS2423.S @@ -84,6 +84,7 @@ h_readcommand: cset 0x5A,OW_COPY_SCRATCHPAD cset 0xF0,OW_READ_MEMORY_ADDR cset 0xA5,OW_READ_MEMORYCOUNTER_ADDR + FW_CONFIG_INFO #ifdef _CHANGEABLE_ID_ CHANGE_ID_COMMANDS #endif diff --git a/DS2438_DHT22/DS2438_DHT22.atsln b/DS2438_DHT22/DS2438_DHT22.atsln index cde51c4..77e7763 100644 --- a/DS2438_DHT22/DS2438_DHT22.atsln +++ b/DS2438_DHT22/DS2438_DHT22.atsln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 11.00 # Atmel Studio Solution File, Format Version 11.00 -Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "DS2438_DHT22", "DS2438_DHT22.cproj", "{D8C974E2-4579-49ED-A4E2-6C54B37778FA}" +Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "DS2438_DHT22", "DS2438_DHT22.cproj", "{91468D4F-8AE2-4C59-8A35-549C49E00934}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -9,10 +9,10 @@ Global Release|AVR = Release|AVR EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {D8C974E2-4579-49ED-A4E2-6C54B37778FA}.Debug|AVR.ActiveCfg = Debug|AVR - {D8C974E2-4579-49ED-A4E2-6C54B37778FA}.Debug|AVR.Build.0 = Debug|AVR - {D8C974E2-4579-49ED-A4E2-6C54B37778FA}.Release|AVR.ActiveCfg = Release|AVR - {D8C974E2-4579-49ED-A4E2-6C54B37778FA}.Release|AVR.Build.0 = Release|AVR + {91468D4F-8AE2-4C59-8A35-549C49E00934}.Debug|AVR.ActiveCfg = Debug|AVR + {91468D4F-8AE2-4C59-8A35-549C49E00934}.Debug|AVR.Build.0 = Debug|AVR + {91468D4F-8AE2-4C59-8A35-549C49E00934}.Release|AVR.ActiveCfg = Release|AVR + {91468D4F-8AE2-4C59-8A35-549C49E00934}.Release|AVR.Build.0 = Release|AVR EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/DS2438_DHT22/DS2438_DHT22.c b/DS2438_DHT22/DS2438_DHT22.c index ed96a55..c5981c0 100644 --- a/DS2438_DHT22/DS2438_DHT22.c +++ b/DS2438_DHT22/DS2438_DHT22.c @@ -32,7 +32,7 @@ #define F_CPU 8000000UL -#define FP_CALC +//#define FP_CALC #include #include #include @@ -43,6 +43,7 @@ extern void OWINIT(); uint8_t owid[8]={0x26, 0xA2, 0xD9, 0x84, 0x00, 0x00, 0x05, 0x16};/**/ +uint8_t config_info[16]={0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; extern uint8_t mode; @@ -347,9 +348,9 @@ int main(void){ #define SENSOFF PORTA&=~(1<2.0 6.2 com.Atmel.AVRGCC8.C - {d8c974e2-4579-49ed-a4e2-6c54b37778fa} + {91468d4f-8ae2-4c59-8a35-549c49e00934} ATtiny84A none Executable @@ -34,7 +34,7 @@ - + @@ -46,7 +46,7 @@ debugWIRE com.atmel.avrdbg.tool.atmelice - J41800000789 + J41800000779 Atmel-ICE debugWIRE diff --git a/DS2438_DHT22/OWDS2438.S b/DS2438_DHT22/OWDS2438.S index f545bed..35bc463 100644 --- a/DS2438_DHT22/OWDS2438.S +++ b/DS2438_DHT22/OWDS2438.S @@ -32,6 +32,8 @@ #define _CHANGEABLE_ID_ //#define _DIS_FLASH_ +#define _ZERO_POLLING_ +//#define _DB_ #include "../common/OWConfig.s" #include "../common/OWCRC8.s" @@ -82,6 +84,7 @@ h_readcommand: cset 0x4E,OW_WRITE_SCRATCHPAD_ADR cjmp 0x44,hrc_set_convertT cjmp 0xB4,hrc_set_convertV + FW_CONFIG_INFO #ifdef _CHANGEABLE_ID_ CHANGE_ID_COMMANDS #endif diff --git a/DS2450/DS2450.c b/DS2450/DS2450.c index abf083c..74d24dd 100644 --- a/DS2450/DS2450.c +++ b/DS2450/DS2450.c @@ -42,7 +42,8 @@ extern void OWINIT(); uint8_t owid[8]={0x20, 0xA2, 0xD9, 0x84, 0x00, 0x16, 0x02, 0x5D};/**/ - +uint8_t config_info[16]={0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; + #if (owid>128) #error "Variable not correct" #endif diff --git a/DS2450/OWDS2450.S b/DS2450/OWDS2450.S index 2614786..4fba4bc 100644 --- a/DS2450/OWDS2450.S +++ b/DS2450/OWDS2450.S @@ -94,6 +94,7 @@ h_readcommand: cset 0xAA,OW_READ_MEMORY_ADDR cset 0x55,OW_WRITE_MEMORY_ADDR cset 0x3C,OW_CONVERT + FW_CONFIG_INFO #ifdef _CHANGEABLE_ID_ CHANGE_ID_COMMANDS #endif diff --git a/common/OWCRC16.s b/common/OWCRC16.s index 4d6920e..a26690a 100644 --- a/common/OWCRC16.s +++ b/common/OWCRC16.s @@ -32,7 +32,7 @@ .comm crc,2 - +#define _CRC16_ CRC16_alg: ;crc diff --git a/common/OWCRC8.s b/common/OWCRC8.s index 90d2cd7..dad7480 100644 --- a/common/OWCRC8.s +++ b/common/OWCRC8.s @@ -33,7 +33,7 @@ .comm crc,1 - +#define _CRC8_ .macro CRCS ; CRC beim Senden ;crc diff --git a/common/OWConfig.s b/common/OWConfig.s index 21a5351..8d82561 100644 --- a/common/OWConfig.s +++ b/common/OWConfig.s @@ -57,7 +57,7 @@ #define zh 31 .extern owid,8 - +.extern config_info,16 .comm mode,1 ; Aktueller Zustand nach dem die Unterprogramme aufgerufen werden .comm srbyte,1 ; aktuelles Byte fuer Searchrom diff --git a/common/OWPinInterrupt.s b/common/OWPinInterrupt.s index 5cf444b..00feec0 100644 --- a/common/OWPinInterrupt.s +++ b/common/OWPinInterrupt.s @@ -126,8 +126,10 @@ zeropolling_wait: rjmp zeropolling_low_imp ;Leitung ist low raus aus schleufe in r_temp,TCNT_REG cpi r_temp,(~OWT_MIN_RESET)+OWT_ZP_WAIT_HIGH_TO ;aller zwei us zaehlt der timer - brsh zeropolling_timeout ;Timeout - rjmp zeropolling_wait + sbis OW_PIN,OW_PINN ;noch eine Abfrage, da sonst schleife zu lang (sbis aendert keine flags) + rjmp zeropolling_low_imp ;Leitung ist low raus aus schleufe + brlo zeropolling_wait + rjmp zeropolling_timeout zeropolling_low_imp: sbi OW_DDR,OW_PINN RESETZEROMARKER diff --git a/common/OWRomFunctions.s b/common/OWRomFunctions.s index fdcc919..41a952f 100644 --- a/common/OWRomFunctions.s +++ b/common/OWRomFunctions.s @@ -61,13 +61,14 @@ #define OW_SEARCHROMR 4 ; next resive master answer #define OW_READROM 5 #define OW_READ_COMMAND 6 +#define OW_FWCONFIGINFO 7 #ifdef _CHANGEABLE_ID_ -#define OW_WRITE_NEWID 7 -#define OW_READ_NEWID 8 -#define OW_SET_NEWID 9 -#define OW_FIRST_COMMAND 10 +#define OW_WRITE_NEWID 8 +#define OW_READ_NEWID 9 +#define OW_SET_NEWID 10 +#define OW_FIRST_COMMAND 11 .comm newid,8 @@ -79,7 +80,7 @@ #else -#define OW_FIRST_COMMAND 7 +#define OW_FIRST_COMMAND 8 #endif #ifndef _DIS_FLASH_ @@ -93,6 +94,9 @@ .endm #endif +.macro FW_CONFIG_INFO + cljmp 0x85,hrc_fw_configinfo +.endm #ifdef _CHANGEABLE_ID_ @@ -135,6 +139,7 @@ handle_stable: rjmp h_searchromr rjmp h_readrom rjmp h_readcommand + rjmp h_fwconfiginfo #ifdef _CHANGEABLE_ID_ rjmp h_writeid rjmp h_readid @@ -193,6 +198,13 @@ hrc_set_alarm_search: ; sonst tue nichts rjmp handle_end_sleep + +hrc_fw_configinfo: + ldi r_mode,OW_FWCONFIGINFO + ldi r_sendflag,1 + rjmp h_fwconfiginfo + + ;--------------------------------------------------- ; MATCH ROM ;--------------------------------------------------- @@ -290,6 +302,39 @@ h_readrom_all: rjmp handle_end_sleep +;--------------------------------------------------- +; FW_CONFIG_INFO +;--------------------------------------------------- + +h_fwconfiginfo: + cpi r_bytep,16 + breq h_fwconfiginfo_crc +#ifdef _CRC8_ + cpi r_bytep,17 + breq h_fwconfiginfo_all +#elif defined _CRC16_ + cpi r_bytep,17 + breq h_fwconfiginfo_crc2 + cpi r_bytep,18 + breq h_fwconfiginfo_all +#else + cpi r_bytep,16 + breq h_fwconfiginfo_all +#warning No CRC known code implemented +#endif + configZ config_info,r_bytep + ld r_rwbyte,Z + rjmp handle_end_inc +h_fwconfiginfo_crc: + lds r_rwbyte,crc + rjmp handle_end_inc +h_fwconfiginfo_crc2: + lds r_rwbyte,crc+1 + rjmp handle_end_inc +h_fwconfiginfo_all: + rjmp handle_end_sleep + + ;--------------------------------------------------- ; CHANGE ROM FUNCTIONS ;--------------------------------------------------- diff --git a/common/OWRomFunctionsDual.s b/common/OWRomFunctionsDual.s index c28d855..f9ffb2f 100644 --- a/common/OWRomFunctionsDual.s +++ b/common/OWRomFunctionsDual.s @@ -61,13 +61,15 @@ #define OW_SEARCHROMR 4 ; next resive master answer #define OW_READ_COMMAND1 5 #define OW_READ_COMMAND2 6 +#define OW_FWCONFIGINFO1 7 +#define OW_FWCONFIGINFO2 8 #ifdef _CHANGEABLE_ID_ -#define OW_WRITE_NEWID 7 -#define OW_READ_NEWID 8 -#define OW_SET_NEWID 9 -#define OW_FIRST_COMMAND 10 +#define OW_WRITE_NEWID 9 +#define OW_READ_NEWID 10 +#define OW_SET_NEWID 11 +#define OW_FIRST_COMMAND 12 .comm newid,8 .comm idtable,64 @@ -79,7 +81,7 @@ #else -#define OW_FIRST_COMMAND 7 +#define OW_FIRST_COMMAND 9 #endif #ifndef _DIS_FLASH_ @@ -94,6 +96,12 @@ #endif +.macro FW_CONFIG_INFO1 + cljmp 0x85,hrc_fw_configinfo1 +.endm +.macro FW_CONFIG_INFO2 + cljmp 0x85,hrc_fw_configinfo2 +.endm #ifdef _CHANGEABLE_ID_ ; lesen der ID aus dem EEPROM beim Start @@ -145,6 +153,8 @@ handle_stable: rjmp h_searchromr rjmp h_readcommand1 rjmp h_readcommand2 + rjmp h_fwconfiginfo1 + rjmp h_fwconfiginfo2 #ifdef _CHANGEABLE_ID_ rjmp h_writeid rjmp h_readid @@ -216,6 +226,17 @@ hrc_set_alarm_search: ; sonst tue nichts rjmp handle_end_sleep +hrc_fw_configinfo1: + ldi r_mode,OW_FWCONFIGINFO1 + ldi r_sendflag,1 + rjmp h_fwconfiginfo1 + +hrc_fw_configinfo2: + ldi r_mode,OW_FWCONFIGINFO2 + ldi r_sendflag,1 + rjmp h_fwconfiginfo2 + + ;--------------------------------------------------- ; MATCH ROM ;--------------------------------------------------- @@ -353,6 +374,43 @@ h_searchromr: ; stelle um auf empfangen rjmp handle_end_no_bcount +;--------------------------------------------------- +; FW_CONFIG_INFO +;--------------------------------------------------- + +h_fwconfiginfo1: + configZ config_info1,r_bytep + rjmp h_fwconfiginfo_go +h_fwconfiginfo2: + configZ config_info2,r_bytep + +h_fwconfiginfo_go: + cpi r_bytep,16 + breq h_fwconfiginfo_crc +#ifdef _CRC8_ + cpi r_bytep,17 + breq h_fwconfiginfo_all +#elif defined _CRC16_ + cpi r_bytep,17 + breq h_fwconfiginfo_crc2 + cpi r_bytep,18 + breq h_fwconfiginfo_all +#else + cpi r_bytep,16 + breq h_fwconfiginfo_all +#warning No CRC known code implemented +#endif + ld r_rwbyte,Z + rjmp handle_end_inc +h_fwconfiginfo_crc: + lds r_rwbyte,crc + rjmp handle_end +h_fwconfiginfo_crc2: + lds r_rwbyte,crc+1 + rjmp handle_end +h_fwconfiginfo_all: + rjmp handle_end_sleep + ;--------------------------------------------------- ; CHANGE ROM FUNCTIONS diff --git a/common/OWSet_ATTINYX5.s b/common/OWSet_ATTINYX5.s index 4c4528f..159d151 100644 --- a/common/OWSet_ATTINYX5.s +++ b/common/OWSet_ATTINYX5.s @@ -64,18 +64,25 @@ #else -#define OWT_MIN_RESET 120 -#define OWT_RESET2 60 +#define OWT_MIN_RESET 140 +#define OWT_RESET2 80 #define OWT_RESET_PRESENT 30 #define OWT_PRESENT 130 -//#define OWT_WRITE 35 -//#define OWT_READ 12 #define OWT_WRITE 35 #define OWT_READ 12 #endif +.macro CLEAR_TOV_FLAG + ldi r_temp,(1<Su${)=az)E4gB_fH3=x85i5s-m7Nem66%+mnLjy6(F87a z*JBpz6bkmvw=XMcE&>Jmi@xBljp0vNSu%MUoUXCSBSuhreSPF=kf%bWrN;D1wH|Vl zq}bxbSjRnSWCFhk3XW~YUKn0NZfxNvf6hZ%SrmR&tkWH9&C=?v=k3|b7#(q@a?`*^ zXko~vn*sKt@*kf8s8~l-KPu(28}aFSN|^I(;HZOg;g)U%|8dt6nQ22tOsuIAF|{r0 za$Zk{l(HZ{v;Uid-o844HsyVj$KH1NV<_v0(pL`z7r^a?(>4j*zBVdapOF3K-fdy8 zz0nQbfP>@2ZC|eM$N<2@0|G$hFKSt%0irpBaqSsQ>o8zyX$Ud1apGYAasHn={uk@u zpKiS*{<(4|2s8Ll?k=SFa&jRSS3=QET&|Hy{monXuQ)YPIkaR8tqhNG)ky;oWPO|8 z-1W~dh(zu5QeCX_ltkbW2-AFaD-BM%adbgpriUcTIF_t*0bM80CofWD6+9SSn`4-v zb%h@l`<7^Az8p(c;Eu4rBt^r|dmQ{oG{sM+`?>bwtE)1&NeQ+6(%?_E{8>8*BWb?V ziTT@DPeTQt?Tx1p_By?KJzM78YeRK@O{$@0A!zyORR%?n@uUb zSCyIv?}}?gwudh3+*hZX=Xl_QM;AX@C$#sd&p(2qa1myq{;ni`V(*epVKdSIQxZ}D zDxA9w$G`N%%^qU?%HH1khxPhhXW(Ea42JUGeUzv^SL_1eHe-Ab0lB5Q5&~zPIjHwE zc5zVqs+s2Lskq;qEs-%d=xa?Wav<0TdmIk+xL)#NuOi@|x3d(6;~{$D+Z+lb*$H`;n$1B_p)XX2y9+4(vgJZRV(gRzO_E`5P| z(sXD3++*0fJ?92<<1ti`yqH(iJJ^{rq*s>0mnq(9BRi#0<8Z}U;wMF_woNRtFBUyLrR zjy-VB>}>a@llEhmP(C_+jen$=e_qn{t=nl1-)-rXmp`E2yc$v_FFJC9Ze?E302h>^ znwBbvIW$}q1*bWK-ZnXo;p4kG`HWGBGIx`WxPcWZByZCes~?LJnbt|GrBup9wmP*H zsm$Dbi4VVQ7n$m_1p4JnfU4^0nR!9Av2IwkvbYHK+8LoUTiuvul3lpUqRKi;i{Bwq zJ6JF?NuuMPQrP(UY0BgRQ#@W@i7sJ>c-$CC@C|C~J;>H+0X=M%GF&3l^SX+#Hkd%A zQnP_K71XiTam9++X-5~|5RV=C3j2|c;KWhE%|r3anC3#B2FZhET^39uHRs9=r#r5U z%F<@DGV0Pe68(I#A%3LCd^cCpl?Z`pL^qYwoA*H-k#6du>p~OUgAeN;Mj8*Ai5#k1 z3HBr)p18%MvJhe)1FC+-SQ@g{Yf z&2?k(;G6Upg6g*Ka=UWj88-7#J<-=>hG}J;8b2Bmhd7RwzfHI`)fejlx)751pi@8W zd~FS-|GvYTA=M`>AfH|3P#K!I!YpRU_Hz38@?pN;!d|EaS^qsDx1BBV(i#~AWrMeB zW)6X>1b=}TdeN3D^+meUG$l*nbjc=SGnGq#4uy%1ge!)a6WhZtsiN#JkcB;6wRxd(~Hp! zOZO{`T9{{Q@5G_>X&g=&tF~3o#&UK{`$>u4jWWG|pndsVtT{dArXR7?=%}dTg`5s= zoAJ6$=2}-X7;~mxK>dheb%QZ~KkiI(x9-i2Yqcs59g2fkS+uFk%W2wg-9X?4V=i3$ z@kk8gF=BB*b?WqVddx*ysdWZ#S}Q2xWm(HVPHlw0omK+OS&An85vlxCU1tk3TQiQI zXU-opyQe)8LB>zeLUi*K)5-15+T4cY7}?9__52<^)o$*3VU1Z#WojHrUn3`#O1#NO zmDEH7^yYJwIb^&ox_j%-&n?w@TSpm&W@t(`>{9J0*|a;ka<0$Lwww8v5_pI>7NUxr z0@akX#$BOA%w+)yK(YkWIahmZl)U_12fujEY}R&LH@|u>%iH@)_G~ub3bF9$(-qyq zeHn?t&;4d%{^ngApGcIJX9M#%@f^~W2G$6k1S}*cTEACNi3ZB+F^F>}H}j>$0$qd0 za~qp^77HBGP}#|3covfKE5;;^dqOnAmNCf3Cj=#`_d5hkTt&Lvf_7E9kVGsR3D3VJ z)^a3{X)cC^WBJs)K{!vk91xDgv9=m?_WVRTaq7*nRkFtdAcQSR4#io(dr>5C4seiX zEqnf~vD9v4q=J;Ov3ll!*YmvCZ+dTfTENZwn)?X--R$MmQGhtA0T1l+icf?xY0c=5 z%PRrA-Z|sj9#{zFU?5%J3TeYC%DIE!JfUgFRy5(_NwauPA{mEDEEaSxUh6flBn+-8GaXW$rJJa3>x=T zG-wMf=am=3rpPm;pF0RKnw+HM$n<$QnZ^IMQPsnMlaV2EwY|R5nSk=t{BvZqFk{Nj z6GQLY*-S&f=E?=<%qisw=7&#^8Ge^MM zVMC_G#sQly;dp-e0_`1fBQsRpiL(pzT}Qj*BzcilVGefq1rec>bdnGwTGcVjkS^S$ zpeV|~xuc;)wt|5|+bL0RQ|gr<@Px#h(4v*@0Sk5&8*V`<&dDb&5mKf!^{sNULS-XJ zQl8;VPB$il^`#><1e;K#d-Tu<(LFC`U|O$wtYq4dephnzUPUKJ;&`w>g*Gnw{w;+> zIQ2Ine7-Ak?j>9g97k|px5E{qgaf{_Mu9qQs5h4~TSZf3%C#8#7NT(;7v*hm zY7ecT+MIG&!-LX9Rk5?qgfLS@i;i$Xt~dU{Q^sXc9_2C<_t#SxGs5?83YHEY3|je{ z2fmfh1*rrC6G2^STx0mz7Z?J^eJZltlc1BrAtyZK;G8+l!sZPt7XFB3t|dm|I?Hf% z3I?-P8tUwO)FGoVLk+Sqrjh5$_1q?pHNO{Y+lC!8&09TyVlHO{<|{Oz5VzDY6xnQx z@++w8jBP096P|GWnf|7^X{AX!4|(v#Jp*lZ`!hTjjIi!XVD^z4?Zn`4kn})DHq#J? zWKHC1KOxwbkWlNX;HMp{#+IZHh;8}kFGLa@`>~M{$KJOKPRrRt=qI@WkMIXD8L1cI z_4t*PhuIZtUWQhSODOUu1SSRpN!LV#&vOz^BVC}VMdHd0udewBcu0r%f!0ja1=W7^ z4XUGEf_9DK3n5=BfT=YLXnS`nTp8jA4)q7p&gea_Y2wT|?sgdmSU0jm+}{c6g(>AD za{>ii7{lhv(!Vp4S!DA_IYOtvxQjXvw%GTzQI8Q9Fu5|G9m#DOPwV6sROzZ*J!2_R z*0`KT8OX4~URjLk?iq&rP{5Cyo4i!0fD(-sf{pws4BsQD)L7$Uo}^3o>`1eD^LFE3dFUZ_$S}fAFc) zr*?ZNsquN&uI8I9Hz8{?Kdmwrja8^J#mzLDs{=|`4$8MSC+0eII&UvIAnQ$K!um75 zWx{%v6JBaP!P9ru3toh+YeBqESv6AMw60G!D->@YIk$-e!iF2GCz?Pm^@NhW(>Wi` zT0d_XQf0wx$TPs@^9(T9;@1thEpy6kGbkYU6mQi=FE-XX@ej{kvUyKxP&#!?`oVl@ z_v=U!C+PH<7{u_c7h(B+>p$AC8aEKQ6XqIN!|WK=zug084;!_VXbA&lSE}+R*hW8n`mX&kjY(Ju+ROOOD=DlNw#AmdNKwaz1vM)mST13$ zxn_Y2^Lb5ye=^zR3p9qPaepn43t6g?nkt!_{1GTDTbmIzp-xsSe216Pf2&85NL|6X ztMbX(V1~#enQWcKT2;%+HSjsHvb;<8MK^|fJ9BBI)gD$`P_dMTNVBT-_Es?Ym8VaTvpaql4inUsM0tH+PD^XkTX{kgz{UbMjK7%lu^*VOt? z!KmHJ&BBh@9Gkcd#JQX4AJ;fpk=Z$iIZEiG0RrKe6BX(Mc$hqU6iQD-I6lUTM#kJq zIz#)Il*XqGLE%+%6&BNCmJ0_Ey&FRU!Q=&pHq+-Z)x*a&J7cne`jCutL&}~HR{sP=AB=eDUFxIcrjHY>gFfDhyfosE zUrqresmJbqd2D}=I?8)?2S(k;j?|_1jT6h7>VampY)$zj80-uPXIVcdgDhXHK$6#X zztfb?ih~s-Cm1erOG0{&T^`yeMKkKLvt@7F+d|-2ge(%*4&9(`5kvYZh^H33IQjUg z$PvypXyeFhdBX&MF7tUstJn1{jbQ|+8llnUOGzZ(Qjxjl)=v$_}-U7t|#EoYe)-GkE zGZ@nFr~LAP-xLC;eZy86{*moA)EK6hus|z{7yy91e-E~tEX>TDoj86rKi#%>+VhZA z0bHM@;(L^&B@~l@&b+rpaFCRc(z&_aDo%L43brXt%IjNOZ9nJQSd5WQMCS?F1zFo` zsT3by4#**Gu~5RsR~#>&C44jHTJ8GGTi=KCGuu6{8ijt__yN_ydz=@yOGK^Txr7IH zYQ#`KiWo8O*88gL2w?dOiH1@ad7UsSfL$w@@sJFmJ}ML}aW-jL)HvC19;g`OOU|%5 zs~bWj4_vjGr?`Arq>3=*=}x4?zn@bHPZ52lZVoAvE1s@ht5ts_n>AzVkuOH7y2LWR zJ>tUzHBFFQI9vhAb9@~lifHK_SD1nnc!G(NrS?-9+Gzp#zuBaTBk8!7<2BYl(4@CW z#Zj=DM}Z$qSM_p6G8FiH!}W3%Y>YF#m3Ld?PBfJ7&?J4bO486$x#Trm@mS)%rIPT~ zd_Q!0-(o;rSLXNBaLUW-V(+qlp0-A-?{3Kkiv5Xk)aEyKkAX>wlRN6ld+~M)%wh}2 z{P~!gLbVw}xqPDEJU^&!g3%wmq>=Y|;WZL2H^0p~$RsR+!e!TRH@&uXOHCcM_qi9P zB#8Lpj!wBD08>}6k)}<*E(5dnAhX9sRu#D7CV5K?s{jlUHj&d9xd-|u7W_t;fy6M% zaR1l<9%Vw4-zf7HOJop%t_f@Q40qTqJc8V9s@DYFW$*g;HV8_z^#MYnaJTybu~RPp zR{UaHF8`}-xDam9$m25*UlRoHJXn96EcL9LRdm_mK&0E<6V?&M$Jf`So4y%M5l5hG zyCPrTIFk1_QWL{%-jOz%?io8#<4F1QNY2D>7~LJ^452pDl0>59q@uxl#(MBQ8Zoi^ zedqytxRH+Hpl+mgVj@HnJ>2+0NnC+%2llaXz`)5SMC{iAMv=RIoURbjS3lY^lRolT&5!EYZNMIM!XS@%l57;TwiSJ|*b;&qi^5<*-alTx=_(8?qfS zHGl?A#|N`o$p^epB*ohiVCqoP#4_g}cPP)-P7gtXV>5HeJ)bZdRSixCE0RPukf$k$ zfp}ybdZQ>KYip2XN>@282xG*d?v;faA~O2Fxj|BnSoEuoznbqDo_{4*FDeIGNc}_0=?qXl_#nRZ{26LJpS<2#A456aGxf! z*2X){k2X$o-}X_wR50sVN>*9^;W~k&389G{p>dP#+Wa6jT1~ipRfO{k=+%65oSiqr zOJY)8VkceHH8$ALnDV(Ub2ZwMc$W5ePYyuim-=pvlF6mYjmeFYL#wU;#0^A(kr>}GMaEzEgm59A@sSI>{#{v$IUV& zafkgmEOTHBa}R*9WTvUTi3-Ht!HL7f9%A%FB9Qu7hVoezai3IB zMN@gHEKAutE!~Jsjo9-AQg^^9Esb4&!44hoP zJKHppXUU@#LiCcH_%AZ@jHB4BsYwM4f?ooe5H4jbL1oBf?(x-u+wivOUl2_O_$Ujb znj}3P^CGi`DTYX``xm!J9Y}kKwBF{V3xx|C70Oc2(Fl^o-7N5kzU9WmLX90>rByhJ znf3!-jQAO(2uSa{&biI?e5e#8>l$mWIk&Kx=d-F33m(Z_{24}OuZiDaqnO;own@^mB3WkqMzEpsPA8v;c%rUrJunyZs8 zn@UP|p9k?s2Ty5yWV#t`lwkv)b+hqPXV6T~6%HqKRS|DQ4#G)A4ls+35tF-yd7ppJ zUd0TfF=W6v2toh=aR1CfV+V)-Q4q$xe;?@y?XWa4tn`9#fgOAhm2USW7_9jsm&|kK z6Ts2ywW$!0SuwbaR6g^yeI*f@ZBE#iiwUy6%@ssB*j@ludv&$HqnH$uS_7Z0I zpK&iYMj{TW6%kwDi9{Z)zLnS89m$+v4t_+V{ftESN4lqY<#=B!?tJGf+& zN^6?I4WE(i13auo6PgB3?eQ)HTRL{KMM=ZQ9LL6FpF@p2Th3I-b&#iuF%iqEv3B(O z)Uxg7rnC{d3Z`32!>EE%D=EAJl=_MalRcw0nRJBC$iJwUVhQM-fb|0u3)hRX4sdVG z%G$bfHDn{Ov4WE6ZU=Xp2xgJ-E|P<`D0Pmy>U`#tF)OU`rG4=EEtqV-wzf(Uzh5tV zLDI2}@@3}D;a^s4H0(0$QM-0dfO*92Zh#2;nT@%XkLN2?VCcJ_Hp zv0R#2=p3OuiXP+GrTF5b8>~y|J-g%aqSOtyVl_g*?p{m9t!Z@2GhqY!?h!O8qgLVp znY^0vtSb}0Q~>URlnl=TDABC=@9l5$1gREUxj~7N&g|NjPXB5^q(O3SJ7W%h(AR29{uOm{}xgFit<