7d8a71151cf84d7af34faff03f9147cb12547c3c
[owSlave2.git] / common / OWPinInterrupt.s
1 // Copyright (c) 2015, Tobias Mueller tm(at)tm3d.de\r
2 // All rights reserved. \r
3 // \r
4 // Redistribution and use in source and binary forms, with or without \r
5 // modification, are permitted provided that the following conditions are \r
6 // met: \r
7 // \r
8 //  * Redistributions of source code must retain the above copyright \r
9 //    notice, this list of conditions and the following disclaimer. \r
10 //  * Redistributions in binary form must reproduce the above copyright \r
11 //    notice, this list of conditions and the following disclaimer in the \r
12 //    documentation and/or other materials provided with the \r
13 //    distribution. \r
14 //  * All advertising materials mentioning features or use of this \r
15 //    software must display the following acknowledgement: This product \r
16 //    includes software developed by tm3d.de and its contributors. \r
17 //  * Neither the name of tm3d.de nor the names of its contributors may \r
18 //    be used to endorse or promote products derived from this software \r
19 //    without specific prior written permission. \r
20 // \r
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR \r
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY \r
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \r
32 \r
33         \r
34 .global PIN_INTERRUPT  \r
35 PIN_INTERRUPT:\r
36         ;leitung auf Low ziehen\r
37         TESTZEROMARKER ; ueberspringe wenn zeromarker=0   ;sbic und cbi/sbi andern SREG nicht\r
38         sbi OW_DDR,OW_PINN  \r
39         push r_temp2                //; wichtig: Benutzte Register und das\r
40     in r_temp2,_SFR_IO_ADDR(SREG)     //; Status-Register (SREG) sichern!\r
41         ;Zeromarker loeschen\r
42         RESETZEROMARKER \r
43         ;Weitere Register sichern\r
44     push r_temp2 \r
45         push r_temp\r
46         sdb\r
47         ; Wegen Power Down Mode Widerherstellen der fallenden Flanke und disable von POWER DONW \r
48         SET_FALLING_RESET_SLEEP\r
49         push r_bcount\r
50         push r_rwbyte\r
51         push r_sendflag\r
52         ;schauen ob noch ein Bit in der Pipeline \r
53         lds r_bcount,bcount\r
54         lds r_rwbyte,rwbyte\r
55         lds r_sendflag,sendflag\r
56 int_internal_start:\r
57         ;Timer zuruecksetzen\r
58         ldi r_temp,~OWT_MIN_RESET\r
59         out TCNT_REG,r_temp\r
60         EN_TIM_INT\r
61         tst r_sendflag\r
62         breq receive_bit ; sendflag=0 Slave empfaengt\r
63 \r
64 send_bit: ; bit senden\r
65         ;nachstes bit vorbereiten\r
66         tst r_bcount\r
67         brne send_bit_no_handle ;noch bits da \r
68         rcall handle_byte ; neues Byte muss bearbeitet werden\r
69         tst r_sendflag  \r
70         breq send_bit_low_loop ; Nach dem Gelesen byte koennte gesendet werden muessen....\r
71 send_bit_no_handle:  ;noch bits da\r
72         ldi r_temp2,0   ; fuer die CRC berechnung in CRCS\r
73         ror r_rwbyte\r
74         brcs send_bit_no_low\r
75         SETZEROMARKER\r
76         ldi r_temp2,1 ;WICHTIG fuer CRC berechnung\r
77 send_bit_no_low: ;ueberspringen von r_wzero=1 wenn leitung nicht auf 0 gezogen wird\r
78         CRCS\r
79         ;naechstes byte ....\r
80         lsl r_bcount\r
81         sbis OW_DDR,OW_PINN\r
82         rjmp iend ;abkuerzung wenn leitung nicht low\r
83 send_bit_low_loop:\r
84         in r_temp,TCNT_REG\r
85         cpi r_temp,(~OWT_MIN_RESET)+OWT_WRITE ;aller zwei us zaehlt der timer\r
86         brlo send_bit_low_loop ;wenn kleiner \r
87         cbi OW_DDR,OW_PINN  ;Leitung auf hochohmig \r
88 \r
89         rjmp iend\r
90 \r
91 receive_bit: ;or reset \r
92         ;beim lesen zuerst zeit bis zum lesen abwarten \r
93         ;(9us nach den 6 us vom low impuls) \r
94         in r_temp,TCNT_REG\r
95         cpi r_temp,(~OWT_MIN_RESET)+OWT_READ ;aller zwei us zaehlt der timer\r
96         brlo receive_bit ;wenn kleiner \r
97         lsr r_rwbyte \r
98         ldi r_temp2,1  ;fuer CRC Berechnung\r
99         sbis OW_PIN,OW_PINN\r
100         rjmp receive_bit_crc\r
101         ori r_rwbyte,0x80\r
102         ldi r_temp2,0 ;fuer CRC Berechnung\r
103 receive_bit_crc:\r
104         sdb\r
105         CRCR\r
106         \r
107         lsl r_bcount\r
108         brne recive_bit_no_handle ;bcount nicht 0\r
109         ;naechstes byte ....\r
110         rcall handle_byte\r
111         tst r_sendflag  \r
112         brne send_bit ; Nach dem Gelesen byte koennte gesendet werden muessen....\r
113 recive_bit_no_handle:   \r
114 iend:\r
115 #ifdef _ZERO_POLLING_\r
116         ;--------------------------------------- Polling for set low... for 4us low impuls of DS2490\r
117         TESTZEROMARKER ; ueberspringe wenn zeromarker=0  \r
118         rjmp zeropolling\r
119         rjmp no_zerromaker\r
120 zeropolling:\r
121         sbrc r_sendflag,1  ; sendflag bit 1 -> switch off zeropolling in software eg for asking convert is donne (DS2450, DS18B20 and others)\r
122         rjmp no_zerromaker\r
123 zeropolling_h_loop:\r
124         sbic OW_PIN,OW_PINN ;warten bis leitung wieder h \r
125         rjmp zeropolling_wait  ;leitung ist low ->Schleie\r
126         in r_temp,TCNT_REG\r
127         cpi r_temp,(~OWT_MIN_RESET)+OWT_ZP_WAIT_LOW_TO;aller zwei us zaehlt der timer\r
128         brsh  zeropolling_timeout ;Timeout Reset?\r
129         rjmp zeropolling_h_loop\r
130 zeropolling_wait:\r
131         sbis OW_PIN,OW_PINN ;warten bis leitung wieder l\r
132         rjmp zeropolling_low_imp ;Leitung ist low raus aus schleufe\r
133         in r_temp,TCNT_REG\r
134         cpi r_temp,(~OWT_MIN_RESET)+OWT_ZP_WAIT_HIGH_TO ;aller zwei us zaehlt der timer\r
135         sbis OW_PIN,OW_PINN ;noch eine Abfrage, da sonst schleife zu lang (sbis aendert keine flags)\r
136         rjmp zeropolling_low_imp ;Leitung ist low raus aus schleufe\r
137         brlo zeropolling_wait\r
138         rjmp zeropolling_timeout \r
139 zeropolling_low_imp:\r
140         sbi OW_DDR,OW_PINN \r
141         RESETZEROMARKER \r
142         rjmp int_internal_start\r
143 \r
144 zeropolling_timeout:\r
145         //in r_temp,TCNT_REG\r
146         //clr r_sendflag\r
147         //RESETZEROMARKER \r
148 \r
149 no_zerromaker:  \r
150 #endif\r
151         CLEAR_INTERRUPT_FLAG  ; wichtig falls inzwischen wider ein Interrupt aufgelaufen ist\r
152         sts sendflag,r_sendflag\r
153         sts bcount,r_bcount\r
154         sts rwbyte,r_rwbyte\r
155         pop r_sendflag\r
156         pop r_rwbyte\r
157         pop r_bcount\r
158         pop r_temp\r
159         cdb\r
160         cbi OW_DDR,OW_PINN  ;vorsichtsmassname Nicht dauerhaft auf low\r
161         pop r_temp2                       //; die benutzten Register wiederherstellen\r
162     out _SFR_IO_ADDR(SREG),r_temp2\r
163     pop r_temp2\r
164     reti\r
165 \r
166 \r
167 \r
168 \r
169 handle_byte:\r
170         push zl\r
171         push zh\r
172         push r_mode\r
173         push r_bytep\r
174         //cdb\r
175         lds r_mode,mode\r
176         lds r_bytep,bytep\r
177 \r
178 \r
179         ldi zl,lo8(pm(handle_stable)) \r
180         ldi zh,hi8(pm(handle_stable)) \r
181         add zl,r_mode\r
182 #if ((handle_stable&0xFE00)!=(handle_stable_end&0xFE00))\r
183         ldi r_temp,0 \r
184         adc zh,r_temp\r
185 #endif\r
186         ijmp \r
187 handle_end_sleep:\r
188         clr r_bcount\r
189         ldi r_mode,OW_SLEEP\r
190         clr r_sendflag\r
191         rjmp handle_end_no_bcount\r
192 handle_end_inc:\r
193         inc r_bytep\r
194 handle_end:\r
195         ldi r_bcount,1\r
196 handle_end_no_bcount:\r
197         sts mode,r_mode\r
198         sts bytep,r_bytep\r
199         //sdb\r
200         pop r_bytep\r
201         pop r_mode\r
202         pop zh\r
203         pop zl\r
204         ret\r