Many changes from 2018
[owSlave2.git] / DS2423 / DS2423.c
1 \r
2 // Copyright (c) 2017, Tobias Mueller tm(at)tm3d.de\r
3 // All rights reserved.\r
4 //\r
5 // Redistribution and use in source and binary forms, with or without\r
6 // modification, are permitted provided that the following conditions are\r
7 // met:\r
8 //\r
9 //  * Redistributions of source code must retain the above copyright\r
10 //    notice, this list of conditions and the following disclaimer.\r
11 //  * Redistributions in binary form must reproduce the above copyright\r
12 //    notice, this list of conditions and the following disclaimer in the\r
13 //    documentation and/or other materials provided with the\r
14 //    distribution.\r
15 //  * All advertising materials mentioning features or use of this\r
16 //    software must display the following acknowledgement: This product\r
17 //    includes software developed by tm3d.de and its contributors.\r
18 //  * Neither the name of tm3d.de nor the names of its contributors may\r
19 //    be used to endorse or promote products derived from this software\r
20 //    without specific prior written permission.\r
21 //\r
22 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
23 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
24 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
25 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
26 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
27 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
28 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
29 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
30 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
31 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
32 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
33 \r
34 #define _4_COUNTERS_\r
35 #define _CPULLUP_\r
36 \r
37 #define F_CPU 8000000UL\r
38 #include <avr/io.h>\r
39 #include <avr/interrupt.h>\r
40 #include <util/delay.h>\r
41 #include <avr/wdt.h>\r
42 #include <avr/sleep.h>\r
43 \r
44 \r
45 \r
46 extern void OWINIT();\r
47 \r
48 uint8_t owid[8]={0x1D, 0xA2, 0xD9, 0x84, 0x00, 0x26, 0x02, 0x5C};/**/\r
49 uint8_t config_info[26]={9,13,9,13,9,13,9,13,0x02,19,19,19,19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //+2 for CRC\r
50 \r
51         \r
52 \r
53 extern uint8_t mode;\r
54 extern uint8_t gcontrol;\r
55 extern uint8_t reset_indicator;\r
56 \r
57 \r
58 volatile uint8_t wdcounter;\r
59 \r
60 \r
61 \r
62 \r
63 typedef union {\r
64         volatile uint8_t bytes[45];\r
65         struct {\r
66                 uint16_t addr;\r
67                 uint8_t status;\r
68                 uint8_t scratch[32];//3\r
69                 uint32_t counter;  //35\r
70                 uint32_t zero;   //39\r
71                 uint16_t crc;  //43\r
72         };\r
73 } counterpack_t;\r
74 counterpack_t pack;\r
75 \r
76 volatile uint8_t lastcps;\r
77 typedef union {\r
78         uint32_t c32[4];\r
79         uint8_t c8[16];\r
80 } counters_t;\r
81 \r
82 volatile counters_t counters;\r
83 \r
84 volatile uint8_t istat;\r
85 \r
86 #if  defined(__AVR_ATtiny24__)||defined(__AVR_ATtiny44__)  || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny24A__)||defined(__AVR_ATtiny44A__)  || defined(__AVR_ATtiny84A__)\r
87 #define PCINT_VECTOR PCINT0_vect\r
88 #define PIN_REG PINA\r
89 #define PIN_DDR DDRA\r
90 #define PIN_CH2 (1<<PINA4)\r
91 #define PIN_CH3 (1<<PINA5)\r
92 #define PIN_CH0 (1<<PINA6)\r
93 #define PIN_CH1 (1<<PINA7)\r
94 #define PORT_EE PINA //WARNING have to be the same PORT like PINREG because of istat\r
95 #define PIN_EE (1<<PINA0)\r
96 #define TEST_TIMER  ((TIMSK0 & (1<<TOIE0))==0)\r
97 \r
98 #endif\r
99 \r
100 \r
101 ISR(PCINT0_vect) {\r
102         if (((PIN_REG&PIN_CH2)==0)&&((istat&PIN_CH2)==PIN_CH2)) {       counters.c32[2]++;      }\r
103         if (((PIN_REG&PIN_CH3)==0)&&((istat&PIN_CH3)==PIN_CH3)) {       counters.c32[3]++;      }\r
104         #ifdef _4_COUNTERS_\r
105         if (((PIN_REG&PIN_CH0)==0)&&((istat&PIN_CH0)==PIN_CH0)) {       counters.c32[0]++;      }\r
106         if (((PIN_REG&PIN_CH1)==0)&&((istat&PIN_CH1)==PIN_CH1)) {       counters.c32[1]++;      }\r
107         #endif\r
108         istat=PIN_REG;\r
109 }\r
110 \r
111 \r
112 int main(void){\r
113     PRR|=(1<<PRUSI)|(1<<PRADC);  //Switch off usi and adc for save Power\r
114         OWINIT();\r
115         \r
116         pack.zero=0;\r
117         counters.c32[0]=0;\r
118         counters.c32[2]=0;\r
119         counters.c32[1]=0;\r
120         counters.c32[3]=0;\r
121         ACSR|=(1<<ACD);  //Disable Comparator\r
122         ADCSRB|=(1<<ACME); //Disable Analog multiplexer\r
123         MCUCR &=~(1<<PUD); //All Pins Pullup...\r
124         \r
125 \r
126 #if  defined(__AVR_ATtiny24__)||defined(__AVR_ATtiny44__)  || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny24A__)||defined(__AVR_ATtiny44A__)  || defined(__AVR_ATtiny84A__)\r
127 \r
128         PORTB|=0xFF-(1<<PINB2); //Make PullUp an all Pins but not OW_PIN\r
129         PORTA|=0xFF; \r
130         if (PINB&(1<<PINB0)) { \r
131         } else {//SW set, PINB0 =0 no pullup, clear PORT of ios\r
132                 PORTA&=~((1<<PINA4)|(1<<PINA5));\r
133 #ifdef _4_COUNTERS_\r
134                 PORTA&=~((1<<PINA6)|(1<<PINA7));\r
135 #endif\r
136                 PORTB&=~(1<<PINB0);  //Disable Pullup io switch to save Power\r
137                                 \r
138         } \r
139 \r
140         GIMSK|=(1<<PCIE0);\r
141         PCMSK0=(1<<PCINT4)|(1<<PCINT5)\r
142 #ifdef _4_COUNTERS_\r
143                 |(1<<PCINT6)|(1<<PCINT7)\r
144 #endif\r
145         ;\r
146         istat=PINA;\r
147 #endif\r
148 \r
149         sei();\r
150     while(1)   {\r
151                 \r
152                 //Test if timer active and no sleep then Idle else Power Down\r
153                 if (TEST_TIMER&&(mode==0)) {\r
154                         MCUCR|=(1<<SE)|(1<<SM1); //Power Down, only low level on 1-Wire and pin change on PCINT wakes up\r
155                         MCUCR&=~(1<<ISC01);\r
156                 } else {\r
157                         MCUCR|=(1<<SE);\r
158                         MCUCR&=~(1<<SM1); \r
159                 }\r
160                 asm("SLEEP");\r
161    }\r
162 }