VOC Optimation
[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_INTERRIPT  \r
35 PIN_INTERRIPT:\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         rjmp iend\r
89 \r
90 receive_bit: ;or reset \r
91         ;beim lesen zuerst zeit bis zum lesen abwarten \r
92         ;(9us nach den 6 us vom low impuls) \r
93         in r_temp,TCNT_REG\r
94         cpi r_temp,(~OWT_MIN_RESET)+OWT_READ ;aller zwei us zaehlt der timer\r
95         brlo receive_bit ;wenn kleiner \r
96         lsr r_rwbyte \r
97         ldi r_temp2,1  ;fuer CRC Berechnung\r
98         sbis OW_PIN,OW_PINN\r
99         rjmp receive_bit_crc\r
100         ori r_rwbyte,0x80\r
101         ldi r_temp2,0 ;fuer CRC Berechnung\r
102 receive_bit_crc:\r
103         CRCR\r
104         lsl r_bcount\r
105         brne recive_bit_no_handle ;bcount nicht 0\r
106         ;naechstes byte ....\r
107         rcall handle_byte\r
108         tst r_sendflag  \r
109         brne send_bit ; Nach dem Gelesen byte koennte gesendet werden muessen....\r
110 recive_bit_no_handle:   \r
111 iend:\r
112 #ifdef _ZERO_POLLING_\r
113         ;--------------------------------------- Polling for set low... for 4us low impuls of DS2490\r
114         TESTZEROMARKER ; ueberspringe wenn zeromarker=0  \r
115         rjmp zeropolling\r
116         rjmp no_zerromaker\r
117 zeropolling:\r
118         sbrc r_sendflag,1  ; sendflag bit 1 -> switch off zeropolling in software eg for asking convert is donne (DS2450, DS18B20 and others)\r
119         rjmp no_zerromaker\r
120 zeropolling_h_loop:\r
121         sbic OW_PIN,OW_PINN ;warten bis leitung wieder h \r
122         rjmp zeropolling_wait  ;leitung ist low ->Schleie\r
123         in r_temp,TCNT_REG\r
124         cpi r_temp,(~OWT_MIN_RESET)+OWT_ZP_WAIT_LOW_TO;aller zwei us zaehlt der timer\r
125         brsh  zeropolling_timeout ;Timeout Reset?\r
126         rjmp zeropolling_h_loop\r
127 zeropolling_wait:\r
128         sbis OW_PIN,OW_PINN ;warten bis leitung wieder l\r
129         rjmp zeropolling_low_imp ;Leitung ist low raus aus schleufe\r
130         in r_temp,TCNT_REG\r
131         cpi r_temp,(~OWT_MIN_RESET)+OWT_ZP_WAIT_HIGH_TO ;aller zwei us zaehlt der timer\r
132         sbis OW_PIN,OW_PINN ;noch eine Abfrage, da sonst schleife zu lang (sbis aendert keine flags)\r
133         rjmp zeropolling_low_imp ;Leitung ist low raus aus schleufe\r
134         brlo zeropolling_wait\r
135         rjmp zeropolling_timeout \r
136 zeropolling_low_imp:\r
137         sbi OW_DDR,OW_PINN \r
138         RESETZEROMARKER \r
139         rjmp int_internal_start\r
140 \r
141 zeropolling_timeout:\r
142         //in r_temp,TCNT_REG\r
143         //clr r_sendflag\r
144         //RESETZEROMARKER \r
145 \r
146 no_zerromaker:  \r
147 #endif\r
148         CLEAR_INTERRUPT_FLAG  ; wichtig falls inzwischen wider ein Interrupt aufgelaufen ist\r
149         sts sendflag,r_sendflag\r
150         sts bcount,r_bcount\r
151         sts rwbyte,r_rwbyte\r
152         pop r_sendflag\r
153         pop r_rwbyte\r
154         pop r_bcount\r
155         pop r_temp\r
156         cdb\r
157         cbi OW_DDR,OW_PINN  ;vorsichtsmassname Nicht dauerhaft auf low\r
158         pop r_temp2                       //; die benutzten Register wiederherstellen\r
159     out _SFR_IO_ADDR(SREG),r_temp2\r
160     pop r_temp2\r
161     reti\r
162 \r
163 \r
164 \r
165 \r
166 handle_byte:\r
167         push zl\r
168         push zh\r
169         push r_mode\r
170         push r_bytep\r
171         //cdb\r
172         lds r_mode,mode\r
173         lds r_bytep,bytep\r
174 \r
175 \r
176         ldi zl,lo8(pm(handle_stable)) \r
177         ldi zh,hi8(pm(handle_stable)) \r
178         add zl,r_mode\r
179 #if ((handle_stable&0xFE00)!=(handle_stable_end&0xFE00))\r
180         ldi r_temp,0 \r
181         adc zh,r_temp\r
182 #endif\r
183         ijmp \r
184 handle_end_sleep:\r
185         clr r_bcount\r
186         ldi r_mode,OW_SLEEP\r
187         clr r_sendflag\r
188         rjmp handle_end_no_bcount\r
189 handle_end_inc:\r
190         inc r_bytep\r
191 handle_end:\r
192         ldi r_bcount,1\r
193 handle_end_no_bcount:\r
194         sts mode,r_mode\r
195         sts bytep,r_bytep\r
196         //sdb\r
197         pop r_bytep\r
198         pop r_mode\r
199         pop zh\r
200         pop zl\r
201         ret\r