-// 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.
-
-
-
-.macro cjmp val,addr
- cpi r_rwbyte,\val
- breq \addr
-.endm
-.macro cljmp val,addr; Weiter sprung, wenn das ziel zu weit entfernt fuer brxx
- cpi r_rwbyte,\val
- brne 1f
- rjmp \addr
-1:
-.endm
-
-.macro cset val,mod ;Nur der Mode wird gesetzt. Abkuerzung da oft nur das noch bleibt
- cpi r_rwbyte,\val
- brne 1f
- ldi r_mode,\mod
- rjmp handle_end
-1:
-.endm
-
-
-
-
-#define OW_SLEEP 0
-#define OW_READ_ROM_COMMAND 1
-#define OW_MATCHROM 2
-#define OW_SEARCHROMS 3 ;next send two bit
-#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 8
-#define OW_READ_NEWID 9
-#define OW_SET_NEWID 10
-#define OW_FIRST_COMMAND 11
-.comm newid,8
-
-
-.macro CHANGE_ID_COMMANDS
- cset 0x75,OW_WRITE_NEWID
- cljmp 0xA7,hrc_set_readid
- cljmp 0x79,hrc_set_setid
-.endm
-
-
-#else
-#define OW_FIRST_COMMAND 8
-#endif
-
-#ifndef _DIS_FLASH_
-; test auf run flasher command 0x88 in h_readcommand
-.macro FLASH_COMMANDS
- cpi r_rwbyte,0x88
- brne 1f
- rjmp hrc_jmp_flasher
-1: ldi r_temp,0 ;Anderes Kommando flashmarker zuruecksetzen...
- sts flashmarker,r_temp
-.endm
-#endif
-
-.macro FW_CONFIG_INFO
- cljmp 0x85,hrc_fw_configinfo
-.endm
-
-
-#ifdef _CHANGEABLE_ID_
-; lesen der ID aus dem EEPROM beim Start
-read_EEPROM_ID:
- push r_bytep
- push r_rwbyte//r_temp2 and Z is not in gnu C save area
- ldi r_temp2,lo8(E2END)
- ldi zh,hi8(E2END)
- subi r_temp2,7
- out _SFR_IO_ADDR(EEARH), zh
- ldi r_bytep,0
- ldi zl,lo8(owid)
- ldi zh,hi8(owid)
-read_EEPROM_ID_loop:
- sbic _SFR_IO_ADDR(EECR), EEPE
- rjmp read_EEPROM_ID_loop
- out _SFR_IO_ADDR(EEARL),r_temp2
- sbi _SFR_IO_ADDR(EECR), EERE
- in r_rwbyte,_SFR_IO_ADDR(EEDR)
- cpi r_rwbyte,0xFF
- breq read_EEPROM_ID_end
- st Z+,r_rwbyte
- inc r_bytep
- inc r_temp2
- cpi r_bytep,8
- brne read_EEPROM_ID_loop
-read_EEPROM_ID_end:
- pop r_rwbyte
- pop r_bytep
- ret
-#endif
-
-
-
-
-
-
-handle_stable:
- rjmp handle_end_no_bcount // sleep eventuell reset, nichts tun und auf Timeout warten
- rjmp h_readromcommand
- rjmp h_matchrom
- rjmp h_searchroms
- rjmp h_searchromr
- rjmp h_readrom
- rjmp h_readcommand
- rjmp h_fwconfiginfo
-#ifdef _CHANGEABLE_ID_
- rjmp h_writeid
- rjmp h_readid
- rjmp h_setid
-#endif
- COMMAND_TABLE
-
-
-
-h_readromcommand:
- clr r_bytep
- cset 0x55,OW_MATCHROM
- cjmp 0xF0,hrc_set_searchrom
- cjmp 0xCC,hrc_start_read_command ;skip rom
- cjmp 0x33,hrc_set_read_rom
- cjmp 0xEC,hrc_set_alarm_search
-
- rjmp handle_end_sleep
-
-#ifndef _DIS_FLASH_
-;sprung zum flasher
-hrc_jmp_flasher:
- lds r_temp,flashmarker
- cpi r_temp,2
- brne hrc_jmp_flasher_inc
- ldi r_temp,0xC0
- push r_temp
- ldi r_temp,0x0E
- push r_temp
- ret ; Direkter Sprung zum Bootloader
-hrc_jmp_flasher_inc:
- inc r_temp
- sts flashmarker,r_temp
- rjmp handle_end_sleep
-#endif
-
-
-hrc_set_searchrom:
- lds r_rwbyte,owid ;erstes Byte lesen
- rjmp h_searchrom_next_bit
-
-hrc_start_read_command: ;Skip rom und Matchrom ok...
- ldi r_mode,OW_READ_COMMAND
- CRCInit1
- rjmp handle_end
-
-hrc_set_read_rom:
- ldi r_mode,OW_READROM
- ldi r_sendflag,1
- rjmp h_readrom
-
-hrc_set_alarm_search:
- lds r_temp,alarmflag
- tst r_temp
- brne hrc_set_searchrom ;alarm flag nicht 0 also gehe zu searchrom
- ; sonst tue nichts
- rjmp handle_end_sleep
-
-
-hrc_fw_configinfo:
- ldi r_mode,OW_FWCONFIGINFO
- ldi r_sendflag,1
- CRCInit2
- rjmp h_fwconfiginfo
-
-
-;---------------------------------------------------
-; MATCH ROM
-;---------------------------------------------------
-
-
-h_matchrom:
- configZ owid,r_bytep
- ld r_temp,Z
- cp r_temp,r_rwbyte
- breq hmr_next_byte
- rjmp handle_end_sleep
-
-hmr_next_byte:
- cpi r_bytep,7
- breq hrc_start_read_command ;Starten von Read Command
- rjmp handle_end_inc
-
-
-
-;---------------------------------------------------
-; SEARCH ROM
-;---------------------------------------------------
-
-
-h_searchrom_next_bit: ;Setup next Bit of ID
- sts srbyte,r_rwbyte ;erstes Byte speichern von der Aufrufenden Ebene
- mov r_temp2,r_rwbyte
- com r_rwbyte ; negieren
- ror r_temp2 ; erstes unnegiertes bit in Carry
- rol r_rwbyte ;und dann als erstes bit in r_rwbyte
- ldi r_sendflag,1
- ldi r_bcount,0x40 ; zwei bits sensden dann zu Searchromr
- ldi r_mode,OW_SEARCHROMR
- rjmp handle_end_no_bcount
-
-
-
-h_searchroms: ; Modus Send zwei bit
- clr r_temp
- sbrc r_rwbyte,7 ; bit gesetz (1 empfangen)
- ldi r_temp,1
- lds r_bcount,srbyte ;r_bcount wird am ende gesetzt
- eor r_temp,r_bcount
- sbrs r_temp,0
- rjmp h_searchroms_next ; Vergleich des letzen gelesenen bits mit der id
- ;Ungleich....
- ;goto sleep
- ;clr r_sendflag
- ; ist ja auf lesen
- rjmp handle_end_sleep
-h_searchroms_next: ; Setup next bit
- inc r_bytep ; zaehler der Bits erhoehen
- sbrc r_bytep,6 ; 64 bit erreicht
- rjmp h_searchrom_end_ok ;alles ok auf Command warten
- mov r_temp,r_bytep
- andi r_temp,0x07
- brne h_searchroms_next_bit ; bit zwischen 0 und 8
- mov r_bcount,r_bytep ; next Byte lesen
- lsr r_bcount
- lsr r_bcount
- lsr r_bcount
-
- configZ owid,r_bcount
- ld r_rwbyte,Z
- sts srbyte,r_rwbyte
- rjmp h_searchrom_next_bit
-
-h_searchroms_next_bit: ;next Bit lesen
- ;sts srbytep,r_bcount
- lds r_rwbyte,srbyte
- lsr r_rwbyte ;aktuelles byte weiterschieben r_rwbyte hier zweckefrei verwendet
- rjmp h_searchrom_next_bit ;algemeine routine zum vorbereiten
-h_searchrom_end_ok:
- clr r_sendflag
- rjmp hrc_start_read_command
-
-h_searchromr:
- clr r_sendflag
- ldi r_mode,OW_SEARCHROMS
- ldi r_bcount,0
- rjmp handle_end_no_bcount
-
-
-;---------------------------------------------------
-; READ ROM
-;---------------------------------------------------
-
-h_readrom:
- cpi r_bytep,8
- breq h_readrom_all
- configZ owid,r_bytep
- ld r_rwbyte,Z
- rjmp handle_end_inc
-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
-;---------------------------------------------------
-
-
-#ifdef _CHANGEABLE_ID_
-
-h_writeid:
- configZ newid,r_bytep
- st Z,r_rwbyte
- cpi r_bytep,7
- breq h_writeid_all
- rjmp handle_end_inc
-h_writeid_all:
- rjmp handle_end_sleep
-
-
-hrc_set_readid:
- ldi r_mode,OW_READ_NEWID
- ldi r_sendflag,1
-h_readid:
- cpi r_bytep,8
- breq h_readid_all
- configZ newid,r_bytep
- ld r_rwbyte,Z
- rjmp handle_end_inc
-h_readid_all:
- clr r_sendflag
- rjmp handle_end_sleep
-
-hrc_set_setid:
- ldi r_mode,OW_SET_NEWID
- ;ldi r_bytep,1 ;start to write in 2
- rjmp handle_end_inc ;set r_bytep to 1!!!
-
-h_setid:
- configZ owid,r_bytep
- ld r_temp,Z
- cp r_rwbyte,r_temp
- brne h_setid_bad_code_all
- cpi r_bytep,1
- breq h_setid_set2
- cpi r_bytep,5
- breq h_setid_set3
- cpi r_bytep,6
- breq h_setid_copy_id
- rjmp h_setid_bad_code_all ;sollte eigentlich nicht passieren
-h_setid_set2:
- ldi r_temp,3
- add r_bytep,r_temp
-h_setid_set3:
- inc r_bytep
- rjmp handle_end
-h_setid_copy_id:
- ldi r_temp2,lo8(E2END)
- ldi zh,hi8(E2END)
- ldi r_temp,7
- sub r_temp2,r_temp
- ;ldi r_temp,0 ;kommt nicht vor das ein E2ROM genau n*256+(0 bis 7) byte gross ist
- ;sbc zh
- out _SFR_IO_ADDR(EEARH),zh
- ldi zl,lo8(newid)
- ldi zh,hi8(newid)
- ldi r_bytep,0
-h_setid_EEPROM_write:
- sbic _SFR_IO_ADDR(EECR), EEPE
- rjmp h_setid_EEPROM_write
- ldi r_temp, (0<<EEPM1)|(0<<EEPM0)
- out _SFR_IO_ADDR(EECR), r_temp
- ;nur adresse L schreiben H bleibt aus oben genannten grund gleich.
- out _SFR_IO_ADDR(EEARL),r_temp2
- ld r_rwbyte,Z+
- out _SFR_IO_ADDR(EEDR), r_rwbyte
- sbi _SFR_IO_ADDR(EECR), EEMPE
- sbi _SFR_IO_ADDR(EECR), EEPE
- inc r_bytep
- inc r_temp2
- cpi r_bytep,8
- brne h_setid_EEPROM_write
- rcall read_EEPROM_ID
-h_setid_bad_code_all:
- rjmp handle_end_sleep
-
-
-
-#endif
-
-
-spause:
- nop
- nop
- nop
- nop
- ret
-
-
-.global OWINIT
-OWINIT:
-#ifndef _DIS_FLASH_
-; check for bootloader jumper
- ;vor allen anderen Registerconfigs
- push r_temp
- ldi r_temp,(1<<PUD) ;enable pullup
- out _SFR_IO_ADDR(MCUCR) ,r_temp
- sbi _SFR_IO_ADDR(PORTA),PINA5 ;internal pullup on PINA5
- sbi _SFR_IO_ADDR(PORTA),PINA4 ;internal pullup on PINA4
- rcall spause
- sbis _SFR_IO_ADDR(PINA),PINA5
- rjmp owinit_botest_end ;PinA5 nicht auf 1
- sbis _SFR_IO_ADDR(PINA),PINA4
- rjmp owinit_botest_end ;PinA4 nicht auf 1
- cbi _SFR_IO_ADDR(PORTA),PINA4
- sbi _SFR_IO_ADDR(DDRA),PINA4 ;PINA4 AUSGANG und 0
- rcall spause
- sbic _SFR_IO_ADDR(PINA),PINA5
- rjmp owinit_botest_end ;PINA5 nicht 0.... nicht verbunden
- cbi _SFR_IO_ADDR(DDRA),PINA4
- ldi r_temp,0xC0
- push r_temp
- ldi r_temp,0x0E
- push r_temp
- ret ; Direkter Sprung zum Bootloader*/
-owinit_botest_end:
-#endif
- HW_INIT //Microcontroller specific
- CHIP_INIT //1-Wire device specific
-#ifdef _CHANGEABLE_ID_
- rcall read_EEPROM_ID
-#endif
- ldi r_temp,0
- sts mode,r_temp
- sts bcount,r_temp
- sts alarmflag,r_temp
- RESETZEROMARKER
- pop r_temp
- ret
-
-
-.global EXTERN_SLEEP
-EXTERN_SLEEP:
- cli
- push r_temp
- ldi r_temp,0
- sts mode,r_temp ;SLEEP
- sts gcontrol,r_temp
- sts sendflag,r_temp
- sts bcount,r_temp
- RESETZEROMARKER
- pop r_temp
- sei
+// Copyright (c) 2017, Tobias Mueller tm(at)tm3d.de\r
+// All rights reserved. \r
+// \r
+// Redistribution and use in source and binary forms, with or without \r
+// modification, are permitted provided that the following conditions are \r
+// met: \r
+// \r
+// * Redistributions of source code must retain the above copyright \r
+// notice, this list of conditions and the following disclaimer. \r
+// * Redistributions in binary form must reproduce the above copyright \r
+// notice, this list of conditions and the following disclaimer in the \r
+// documentation and/or other materials provided with the \r
+// distribution. \r
+// * All advertising materials mentioning features or use of this \r
+// software must display the following acknowledgement: This product \r
+// includes software developed by tm3d.de and its contributors. \r
+// * Neither the name of tm3d.de nor the names of its contributors may \r
+// be used to endorse or promote products derived from this software \r
+// without specific prior written permission. \r
+// \r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR \r
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY \r
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \r
+\r
+\r
+\r
+.macro cjmp val,addr\r
+ cpi r_rwbyte,\val\r
+ breq \addr\r
+.endm\r
+.macro cljmp val,addr; Weiter sprung, wenn das ziel zu weit entfernt fuer brxx\r
+ cpi r_rwbyte,\val\r
+ brne 1f\r
+ rjmp \addr\r
+1:\r
+.endm\r
+\r
+.macro cset val,mod ;Nur der Mode wird gesetzt. Abkuerzung da oft nur das noch bleibt\r
+ cpi r_rwbyte,\val\r
+ brne 1f\r
+ ldi r_mode,\mod\r
+ rjmp handle_end\r
+1:\r
+.endm\r
+\r
+\r
+\r
+\r
+#define OW_SLEEP 0\r
+#define OW_READ_ROM_COMMAND 1\r
+#define OW_MATCHROM 2\r
+#define OW_SEARCHROMS 3 ;next send two bit\r
+#define OW_SEARCHROMR 4 ; next resive master answer\r
+#define OW_READROM 5\r
+#define OW_READ_COMMAND 6\r
+#define OW_FWCONFIGINFO 7\r
+\r
+\r
+#ifdef _CHANGEABLE_ID_\r
+#define OW_WRITE_NEWID 8\r
+#define OW_READ_NEWID 9\r
+#define OW_SET_NEWID 10\r
+#define OW_FIRST_COMMAND 11\r
+.comm newid,8\r
+\r
+ \r
+.macro CHANGE_ID_COMMANDS\r
+ cset 0x75,OW_WRITE_NEWID\r
+ cljmp 0xA7,hrc_set_readid\r
+ cljmp 0x79,hrc_set_setid\r
+.endm\r
+\r
+\r
+#else\r
+#define OW_FIRST_COMMAND 8\r
+#endif\r
+\r
+#ifndef _DIS_FLASH_\r
+; test auf run flasher command 0x88 in h_readcommand\r
+.macro FLASH_COMMANDS\r
+ cpi r_rwbyte,0x88\r
+ brne 1f\r
+ rjmp hrc_jmp_flasher\r
+1: ldi r_temp,0 ;Anderes Kommando flashmarker zuruecksetzen...\r
+ sts flashmarker,r_temp\r
+.endm\r
+#endif\r
+\r
+.macro FW_CONFIG_INFO\r
+ cljmp 0x85,hrc_fw_configinfo\r
+.endm\r
+\r
+\r
+#ifdef _CHANGEABLE_ID_\r
+; lesen der ID aus dem EEPROM beim Start\r
+read_EEPROM_ID: \r
+ push r_bytep\r
+ push r_rwbyte//r_temp2 and Z is not in gnu C save area\r
+ ldi r_temp2,lo8(E2END)\r
+ ldi zh,hi8(E2END)\r
+ subi r_temp2,7\r
+ out _SFR_IO_ADDR(EEARH), zh\r
+ ldi r_bytep,0\r
+ ldi zl,lo8(owid) \r
+ ldi zh,hi8(owid)\r
+read_EEPROM_ID_loop:\r
+ sbic _SFR_IO_ADDR(EECR), EEPE\r
+ rjmp read_EEPROM_ID_loop\r
+ out _SFR_IO_ADDR(EEARL),r_temp2\r
+ sbi _SFR_IO_ADDR(EECR), EERE\r
+ in r_rwbyte,_SFR_IO_ADDR(EEDR)\r
+ cpi r_rwbyte,0xFF\r
+ breq read_EEPROM_ID_end\r
+ st Z+,r_rwbyte\r
+ inc r_bytep\r
+ inc r_temp2\r
+ cpi r_bytep,8\r
+ brne read_EEPROM_ID_loop\r
+read_EEPROM_ID_end:\r
+ pop r_rwbyte\r
+ pop r_bytep\r
+ ret\r
+#endif\r
+\r
+\r
+\r
+\r
+\r
+\r
+handle_stable: \r
+ rjmp handle_end_no_bcount // sleep eventuell reset, nichts tun und auf Timeout warten\r
+ rjmp h_readromcommand \r
+ rjmp h_matchrom \r
+ rjmp h_searchroms \r
+ rjmp h_searchromr\r
+ rjmp h_readrom\r
+ rjmp h_readcommand \r
+ rjmp h_fwconfiginfo\r
+#ifdef _CHANGEABLE_ID_\r
+ rjmp h_writeid\r
+ rjmp h_readid\r
+ rjmp h_setid\r
+#endif\r
+ COMMAND_TABLE\r
+\r
+\r
+\r
+h_readromcommand:\r
+ clr r_bytep\r
+ cset 0x55,OW_MATCHROM \r
+ cjmp 0xF0,hrc_set_searchrom\r
+ cjmp 0xCC,hrc_start_read_command ;skip rom\r
+ cjmp 0x33,hrc_set_read_rom\r
+ cjmp 0xEC,hrc_set_alarm_search\r
+ \r
+ rjmp handle_end_sleep\r
+\r
+#ifndef _DIS_FLASH_\r
+;sprung zum flasher\r
+hrc_jmp_flasher:\r
+ lds r_temp,flashmarker\r
+ cpi r_temp,2\r
+ brne hrc_jmp_flasher_inc\r
+ JMP_FLASHER\r
+hrc_jmp_flasher_inc:\r
+ inc r_temp\r
+ sts flashmarker,r_temp\r
+ rjmp handle_end_sleep\r
+#endif\r
+\r
+\r
+hrc_set_searchrom: \r
+ lds r_rwbyte,owid ;erstes Byte lesen\r
+ rjmp h_searchrom_next_bit\r
+\r
+\r
+\r
+hrc_start_read_command: ;Skip rom und Matchrom ok...\r
+ ldi r_mode,OW_READ_COMMAND\r
+ CRCInit1\r
+ rjmp handle_end\r
+\r
+hrc_set_read_rom:\r
+ ldi r_mode,OW_READROM\r
+ ldi r_sendflag,1\r
+ rjmp h_readrom\r
+\r
+hrc_set_alarm_search:\r
+ lds r_temp,alarmflag\r
+ tst r_temp\r
+ brne hrc_set_searchrom ;alarm flag nicht 0 also gehe zu searchrom\r
+ ; sonst tue nichts\r
+ rjmp handle_end_sleep\r
+\r
+\r
+hrc_fw_configinfo:\r
+ ldi r_mode,OW_FWCONFIGINFO\r
+ ldi r_sendflag,1\r
+ CRCInit2\r
+ rjmp h_fwconfiginfo\r
+\r
+\r
+;---------------------------------------------------\r
+; MATCH ROM\r
+;---------------------------------------------------\r
+ \r
+\r
+h_matchrom:\r
+ configZ owid,r_bytep\r
+ ld r_temp,Z\r
+ cp r_temp,r_rwbyte\r
+ breq hmr_next_byte\r
+ rjmp handle_end_sleep\r
+\r
+hmr_next_byte:\r
+ cpi r_bytep,7\r
+ breq hrc_start_read_command ;Starten von Read Command\r
+ rjmp handle_end_inc\r
+\r
+\r
+\r
+;---------------------------------------------------\r
+; SEARCH ROM\r
+;---------------------------------------------------\r
+\r
+\r
+h_searchrom_next_bit: ;Setup next Bit of ID\r
+ sts srbyte,r_rwbyte ;erstes Byte speichern von der Aufrufenden Ebene\r
+ mov r_temp2,r_rwbyte\r
+ com r_rwbyte ; negieren\r
+ ror r_temp2 ; erstes unnegiertes bit in Carry\r
+ rol r_rwbyte ;und dann als erstes bit in r_rwbyte\r
+ ldi r_sendflag,1\r
+ ldi r_bcount,0x40 ; zwei bits sensden dann zu Searchromr \r
+ ldi r_mode,OW_SEARCHROMR\r
+ rjmp handle_end_no_bcount\r
+\r
+\r
+\r
+h_searchroms: ; Modus Send zwei bit\r
+ clr r_temp\r
+ sbrc r_rwbyte,7 ; bit gesetz (1 empfangen)\r
+ ldi r_temp,1\r
+ lds r_bcount,srbyte ;r_bcount wird am ende gesetzt\r
+ eor r_temp,r_bcount\r
+ sbrs r_temp,0\r
+ rjmp h_searchroms_next ; Vergleich des letzen gelesenen bits mit der id\r
+ ;Ungleich....\r
+ ;goto sleep\r
+ ;clr r_sendflag\r
+ ; ist ja auf lesen\r
+ rjmp handle_end_sleep\r
+h_searchroms_next: ; Setup next bit\r
+ inc r_bytep ; zaehler der Bits erhoehen\r
+ sbrc r_bytep,6 ; 64 bit erreicht \r
+ rjmp h_searchrom_end_ok ;alles ok auf Command warten\r
+ mov r_temp,r_bytep \r
+ andi r_temp,0x07\r
+ brne h_searchroms_next_bit ; bit zwischen 0 und 8\r
+ mov r_bcount,r_bytep ; next Byte lesen\r
+ lsr r_bcount \r
+ lsr r_bcount\r
+ lsr r_bcount\r
+\r
+ configZ owid,r_bcount\r
+ ld r_rwbyte,Z\r
+ sts srbyte,r_rwbyte ;#################### Doppelung ist schon in h_searchrom_next_bit\r
+ rjmp h_searchrom_next_bit\r
+ \r
+h_searchroms_next_bit: ;next Bit lesen\r
+ ;sts srbytep,r_bcount\r
+ lds r_rwbyte,srbyte\r
+ lsr r_rwbyte ;aktuelles byte weiterschieben r_rwbyte hier zweckefrei verwendet\r
+ rjmp h_searchrom_next_bit ;algemeine routine zum vorbereiten\r
+h_searchrom_end_ok:\r
+ clr r_sendflag\r
+ rjmp hrc_start_read_command\r
+\r
+h_searchromr:\r
+ clr r_sendflag\r
+ ldi r_mode,OW_SEARCHROMS\r
+ ldi r_bcount,0\r
+ rjmp handle_end_no_bcount\r
+\r
+\r
+;---------------------------------------------------\r
+; READ ROM\r
+;---------------------------------------------------\r
+\r
+h_readrom:\r
+ cpi r_bytep,8\r
+ breq h_readrom_all\r
+ configZ owid,r_bytep\r
+ ld r_rwbyte,Z\r
+ rjmp handle_end_inc\r
+h_readrom_all:\r
+ rjmp handle_end_sleep\r
+\r
+\r
+;---------------------------------------------------\r
+; FW_CONFIG_INFO\r
+;---------------------------------------------------\r
+\r
+h_fwconfiginfo:\r
+ cpi r_bytep,24\r
+ breq h_fwconfiginfo_crc\r
+#if defined(_CRC8_) || defined( _CRC8_16_) \r
+ cpi r_bytep,25\r
+ breq h_fwconfiginfo_all\r
+#elif defined _CRC16_\r
+ cpi r_bytep,26\r
+ breq h_fwconfiginfo_all\r
+#else\r
+ cpi r_bytep,25\r
+ breq h_fwconfiginfo_all\r
+#warning No CRC known code implemented\r
+#endif\r
+h_fwconfiginfo_end:\r
+ configZ config_info,r_bytep\r
+ ld r_rwbyte,Z\r
+ rjmp handle_end_inc\r
+h_fwconfiginfo_crc:\r
+#ifdef _CRC8_\r
+ lds r_rwbyte,crc\r
+ rjmp handle_end_inc\r
+#elif defined _CRC16_\r
+ lds r_temp,crc\r
+ com r_temp\r
+ sts config_info+24,r_temp\r
+ lds r_temp,crc+1\r
+ com r_temp\r
+ sts config_info+25,r_temp\r
+ rjmp h_fwconfiginfo_end\r
+#endif\r
+h_fwconfiginfo_all:\r
+ rjmp handle_end_sleep\r
+\r
+\r
+;---------------------------------------------------\r
+; CHANGE ROM FUNCTIONS\r
+;---------------------------------------------------\r
+\r
+\r
+#ifdef _CHANGEABLE_ID_\r
+\r
+h_writeid:\r
+ configZ newid,r_bytep\r
+ st Z,r_rwbyte\r
+ cpi r_bytep,7\r
+ breq h_writeid_all\r
+ rjmp handle_end_inc\r
+h_writeid_all:\r
+ rjmp handle_end_sleep\r
+\r
+\r
+hrc_set_readid:\r
+ ldi r_mode,OW_READ_NEWID\r
+ ldi r_sendflag,1\r
+h_readid:\r
+ cpi r_bytep,8\r
+ breq h_readid_all\r
+ configZ newid,r_bytep\r
+ ld r_rwbyte,Z\r
+ rjmp handle_end_inc\r
+h_readid_all:\r
+ clr r_sendflag\r
+ rjmp handle_end_sleep\r
+\r
+hrc_set_setid:\r
+ ldi r_mode,OW_SET_NEWID\r
+ ;ldi r_bytep,1 ;start to write in 2\r
+ rjmp handle_end_inc ;set r_bytep to 1!!!\r
+\r
+h_setid:\r
+ configZ owid,r_bytep\r
+ ld r_temp,Z\r
+ cp r_rwbyte,r_temp\r
+ brne h_setid_bad_code_all\r
+ cpi r_bytep,1\r
+ breq h_setid_set2\r
+ cpi r_bytep,5 \r
+ breq h_setid_set3\r
+ cpi r_bytep,6\r
+ breq h_setid_copy_id\r
+ rjmp h_setid_bad_code_all ;sollte eigentlich nicht passieren\r
+h_setid_set2:\r
+ ldi r_temp,3\r
+ add r_bytep,r_temp\r
+h_setid_set3:\r
+ inc r_bytep\r
+ rjmp handle_end\r
+h_setid_copy_id:\r
+ ldi r_temp2,lo8(E2END)\r
+ ldi zh,hi8(E2END)\r
+ ldi r_temp,7\r
+ sub r_temp2,r_temp\r
+ ;ldi r_temp,0 ;kommt nicht vor das ein E2ROM genau n*256+(0 bis 7) byte gross ist\r
+ ;sbc zh\r
+ out _SFR_IO_ADDR(EEARH),zh\r
+ ldi zl,lo8(newid)\r
+ ldi zh,hi8(newid)\r
+ ldi r_bytep,0\r
+h_setid_EEPROM_write:\r
+ sbic _SFR_IO_ADDR(EECR), EEPE \r
+ rjmp h_setid_EEPROM_write\r
+ ldi r_temp, (0<<EEPM1)|(0<<EEPM0)\r
+ out _SFR_IO_ADDR(EECR), r_temp\r
+ ;nur adresse L schreiben H bleibt aus oben genannten grund gleich.\r
+ out _SFR_IO_ADDR(EEARL),r_temp2\r
+ ld r_rwbyte,Z+\r
+ out _SFR_IO_ADDR(EEDR), r_rwbyte\r
+ sbi _SFR_IO_ADDR(EECR), EEMPE\r
+ sbi _SFR_IO_ADDR(EECR), EEPE\r
+ inc r_bytep\r
+ inc r_temp2\r
+ cpi r_bytep,8\r
+ brne h_setid_EEPROM_write\r
+ rcall read_EEPROM_ID\r
+h_setid_bad_code_all:\r
+ rjmp handle_end_sleep\r
+\r
+\r
+\r
+#endif\r
+\r
+\r
+spause:\r
+ nop\r
+ nop\r
+ nop\r
+ nop\r
+ ret\r
+\r
+\r
+.global OWINIT\r
+OWINIT:\r
+ push r_temp\r
+#ifndef _DIS_FLASH_\r
+ CHECK_BOOTLOADER_PIN \r
+#endif\r
+ HW_INIT //Microcontroller specific\r
+ CHIP_INIT //1-Wire device specific\r
+#ifdef _CHANGEABLE_ID_\r
+ rcall read_EEPROM_ID\r
+#endif\r
+ ldi r_temp,0\r
+ sts mode,r_temp\r
+ sts bcount,r_temp\r
+ sts alarmflag,r_temp\r
+ RESETZEROMARKER\r
+ pop r_temp\r
+ ret\r
+\r
+\r
+.global EXTERN_SLEEP\r
+EXTERN_SLEEP:\r
+ cli\r
+ push r_temp\r
+ ldi r_temp,0\r
+ sts mode,r_temp ;SLEEP\r
+ sts gcontrol,r_temp\r
+ sts sendflag,r_temp\r
+ sts bcount,r_temp\r
+ RESETZEROMARKER\r
+ pop r_temp\r
+ sei\r
ret
\ No newline at end of file