Many changes from 2018
[owSlave2.git] / common / owSlave_tools.h
1 #ifndef OWSLAVE_TOOLS_H\r
2 #define OWSLAVE_TOOLS_H\r
3 \r
4 #if  defined(__AVR_ATtiny44__)  || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny24A__)||defined(__AVR_ATtiny44A__)  || defined(__AVR_ATtiny84A__)\r
5 #define OWST_INIT_ALL_OFF \\r
6         PRR|=(1<<PRUSI)|(1<<PRADC);  /*Switch off usi and adc for save Power*/\\r
7         ACSR|=(1<<ACD);  /*Disable Comparator*/\\r
8         ADCSRB|=(1<<ACME); /*Disable Analog multiplexer*/\\r
9         PORTB|=~(1<<PINB2)|(1<<PORTB0); /*Make PullUp an all Pins but not OW_PIN*/\\r
10         /*Schalter kann gegen Masse sein und zieht dann immer Strom*/ \\r
11         DDRB|=(1<<PORTB0); /*Als Ausgang und 0*/\\r
12         PORTA|=0xFF;\r
13 \r
14 #define OWST_INIT_ADC_ON \\r
15 PRR|=(1<<PRUSI);  /*Switch off usi and adc for save Power*/\\r
16 ACSR|=(1<<ACD);  /*Disable Comparator*/\\r
17 PORTB=~((1<<PINB2)|(1<<PORTB0)); /*Make PullUp an all Pins but not OW_PIN*/\\r
18 /*Schalter kann gegen Masse sein und zieht dann immer Strom*/ \\r
19 DDRB|=(1<<PORTB0); /*Als Ausgang und 0*/\\r
20 PORTA|=0xFF;    \r
21 \r
22 #define OWST_INIT_USI_ON \\r
23 PRR|=(1<<PRADC);  /*Switch off usi and adc for save Power*/\\r
24 ACSR|=(1<<ACD);  /*Disable Comparator*/\\r
25 ADCSRB|=(1<<ACME); /*Disable Analog multiplexer*/\\r
26 PORTB|=~(1<<PINB2)|(1<<PORTB0); /*Make PullUp an all Pins but not OW_PIN*/\\r
27 /*Schalter kann gegen Masse sein und zieht dann immer Strom*/ \\r
28 DDRB|=(1<<PORTB0); /*Als Ausgang und 0*/\\r
29 PORTA|=0xFF;\r
30 \r
31 #define OWST_INIT_ALL_ON \\r
32 PORTB|=~(1<<PINB2)|(1<<PORTB0); /*Make PullUp an all Pins but not OW_PIN*/\\r
33 /*Schalter kann gegen Masse sein und zieht dann immer Strom*/ \\r
34 DDRB|=(1<<PORTB0); /*Als Ausgang und 0*/\\r
35 PORTA|=0xFF;\r
36 \r
37         \r
38 #define OWST_EN_PULLUP MCUCR &=~(1<<PUD); /*All Pins Pullup...*/\r
39 \r
40 #define OWST_WDT_ISR \\r
41 uint8_t wdcounter=0;\\r
42 ISR(WATCHDOG_vect) {/*  #else ISR(WDT_vect) {           #endif*/\\r
43                 wdcounter++;\\r
44                 if (reset_indicator==1) reset_indicator++;\\r
45                 else if (reset_indicator==2) mode=0;\\r
46 }\r
47 \r
48 #define OWST_WDR_CONFIG8\\r
49         WDTCSR |= ((1<<WDCE) );   /* Enable the WD Change Bit//| (1<<WDE)*/\\r
50         WDTCSR |=   (1<<WDIE) |              /* Enable WDT Interrupt*/\\r
51         (1<<WDP3) | (1<<WDP0);   /*Set Timeout to ~8 seconds*/\r
52 \r
53 #define OWST_WDR_CONFIG4\\r
54         WDTCSR |= ((1<<WDCE) );   /* Enable the WD Change Bit//| (1<<WDE)*/\\r
55         WDTCSR |=   (1<<WDIE) |              /* Enable WDT Interrupt*/\\r
56         (1<<WDP3) ;   /*Set Timeout to ~2 seconds*/\r
57 \r
58 #define OWST_WDR_CONFIG2\\r
59         WDTCSR |= ((1<<WDCE) );   /* Enable the WD Change Bit//| (1<<WDE)*/\\r
60         WDTCSR |=   (1<<WDIE) |              /* Enable WDT Interrupt*/\\r
61         (1<<WDP2) | (1<<WDP1)| (1<<WDP0);   /*Set Timeout to ~1 seconds*/\r
62 \r
63 #define OWST_WDR_CONFIG1\\r
64         WDTCSR |= ((1<<WDCE) );   /* Enable the WD Change Bit//| (1<<WDE)*/\\r
65         WDTCSR |=   (1<<WDIE) |              /* Enable WDT Interrupt*/\\r
66         (1<<WDP2) | (1<<WDP1);   /*Set Timeout to ~1 seconds*/\r
67 \r
68 \r
69 #define OWST_TESTSW \\r
70         int testSW(void) {\\r
71                 uint8_t r;\\r
72                 DDRB&=~(1<<PORTB0);  /*Eingang*/\\r
73                 __asm__ __volatile__ ("nop");\\r
74                 PORTB|=(1<<PORTB0); /*Pullup*/\\r
75                 __asm__ __volatile__ ("nop");\\r
76                 __asm__ __volatile__ ("nop");\\r
77                 __asm__ __volatile__ ("nop");\\r
78                 __asm__ __volatile__ ("nop");\\r
79                 __asm__ __volatile__ ("nop");\\r
80                 r=PINB&(1<<PORTB0);\\r
81                 __asm__ __volatile__ ("nop");\\r
82                 PORTB&=~(1<<PORTB0);\\r
83                 __asm__ __volatile__ ("nop");\\r
84                 DDRB|=(1<<PORTB0);  /*Eingang*/\\r
85                 return (r==0);\\r
86         }\\r
87 \r
88 #define OWST_EXTERN_VARS\r
89 extern uint8_t mode;\\r
90 extern uint8_t gcontrol;\\r
91 extern uint8_t reset_indicator;\\r
92 extern uint8_t alarmflag; \\r
93 extern void OWINIT(void);\\r
94 extern void EXTERN_SLEEP(void);\\r
95 \r
96 \r
97 \r
98 #define OWST_MAIN_END \\r
99         if (((TIMSK0 & (1<<TOIE0))==0)&& (mode==0))       {\\r
100                 MCUCR|=(1<<SE)|(1<<SM1);\\r
101                 MCUCR&=~(1<<ISC01);\\r
102         } else {\\r
103                 MCUCR|=(1<<SE);\\r
104                 MCUCR&=~(1<<SM1);\\r
105         }\\r
106         asm("SLEEP");\r
107 \r
108 #endif\r
109 \r
110 //********************** AD_WANDLER ********************************\r
111 //******************************************************************\r
112 //clock fuer ADC 50kHz - 200kHz     8M / 128 = 62500   = 4M/64   erste Messng 25 = 0,4ms / zweite Messung 13 rund 0,21ms\r
113 #ifdef __4MHZ__\r
114 #define OWST_INIT_ADC \\r
115 ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1);\r
116 #else\r
117 #define OWST_INIT_ADC \\r
118 ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);\r
119 #endif\r
120 \r
121 #define OWST_ADC_CONF ADCSRA|=(1<<ADSC); while ((ADCSRA&(1<<ADSC)));\r
122 \r
123 #define OWST_ADCREF_VCC 0\r
124 #define OWST_ADCREF_AREF (1<<REFS0)\r
125 #define OWST_ADCREF_INT ((1<<REFS0)|(1<<REFS1))\r
126 \r
127 #define OWST_ADCIN_PA0 0\r
128 #define OWST_ADCIN_PA1 1\r
129 #define OWST_ADCIN_PA2 2\r
130 #define OWST_ADCIN_PA3 3\r
131 #define OWST_ADCIN_PA4 4\r
132 #define OWST_ADCIN_PA5 5\r
133 #define OWST_ADCIN_PA6 6\r
134 #define OWST_ADCIN_PA7 7\r
135 \r
136 \r
137 #if  defined(__AVR_ATtiny44__)  || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny24A__)||defined(__AVR_ATtiny44A__)  || defined(__AVR_ATtiny84A__)\r
138 #define OWST_ADCIN_REFINT 0b0100001\r
139 #endif\r
140 #if  defined(__AVR_ATmega168__)||defined(__AVR_ATmega168A__) ||defined(__AVR_ATmega328__) ||defined(__AVR_ATmega328P__) ||defined(__AVR_ATmega328PB__)\r
141 #define OWST_ADCIN_REFINT 0b00001110\r
142 #endif\r
143 #if  defined(__AVR_ATtiny24__)||defined(__AVR_ATtiny44__)  || defined(__AVR_ATtiny84__)||defined(__AVR_ATtiny24A__)||defined(__AVR_ATtiny44A__)  || defined(__AVR_ATtiny84A__)\r
144 #define AD_PORT PORTA\r
145 #define AD_DDR DDRA\r
146 #endif\r
147 \r
148 #if  defined(__AVR_ATmega168__)||defined(__AVR_ATmega168A__) ||defined(__AVR_ATmega328__) ||defined(__AVR_ATmega328P__) ||defined(__AVR_ATmega328PB__)\r
149 #define AD_PORT PORTC\r
150 #define AD_DDR DDRC\r
151 #endif\r
152 \r
153 #define OWST_ADC_CONF16_FUNC \\r
154 uint16_t owst_ADC_run() {/*14,5ms*/\\r
155         uint16_t r=0;\\r
156         for(uint8_t i=0;i<64;i++) {     OWST_ADC_CONF   r+=ADC; }\\r
157         return r;\\r
158 } \\r
159 double owst_ADC_runf() {/*16,5ms*/\\r
160         double r=0;\\r
161         for(uint8_t i=0;i<64;i++) {     OWST_ADC_CONF   r+=ADC; }\\r
162         r*=0.9993;\\r
163         return r;\\r
164 }\r
165 \r
166 #define OWST_ADC_CONF16_OSS_FUNC \\r
167 uint16_t owst_ADC_OSS_run() {/*896ms*/\\r
168         uint32_t r=0;\\r
169         for(uint16_t i=0;i<4096;i++) {\\r
170                 OWST_ADC_CONF \\r
171                 r+=ADC;\\r
172         }\\r
173         return r>>6;\\r
174 } \\r
175 double owst_ADC_OSS_runf() {/*964ms*/\\r
176         double r=0;\\r
177         for(uint16_t i=0;i<4096;i++) {\\r
178                 OWST_ADC_CONF \\r
179                 r+=ADC;\\r
180         }\\r
181         r+=5150;\\r
182         r*=0.9993;\\r
183         return r/64.0;\\r
184\r
185 \r
186 \r
187 #endif