Many changes from 2018
[owSlave2.git] / common / owSlave_tools.h
diff --git a/common/owSlave_tools.h b/common/owSlave_tools.h
new file mode 100644 (file)
index 0000000..3dbba63
--- /dev/null
@@ -0,0 +1,187 @@
+#ifndef OWSLAVE_TOOLS_H\r
+#define OWSLAVE_TOOLS_H\r
+\r
+#if  defined(__AVR_ATtiny44__)  || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny24A__)||defined(__AVR_ATtiny44A__)  || defined(__AVR_ATtiny84A__)\r
+#define OWST_INIT_ALL_OFF \\r
+       PRR|=(1<<PRUSI)|(1<<PRADC);  /*Switch off usi and adc for save Power*/\\r
+       ACSR|=(1<<ACD);  /*Disable Comparator*/\\r
+       ADCSRB|=(1<<ACME); /*Disable Analog multiplexer*/\\r
+       PORTB|=~(1<<PINB2)|(1<<PORTB0); /*Make PullUp an all Pins but not OW_PIN*/\\r
+       /*Schalter kann gegen Masse sein und zieht dann immer Strom*/ \\r
+       DDRB|=(1<<PORTB0); /*Als Ausgang und 0*/\\r
+       PORTA|=0xFF;\r
+\r
+#define OWST_INIT_ADC_ON \\r
+PRR|=(1<<PRUSI);  /*Switch off usi and adc for save Power*/\\r
+ACSR|=(1<<ACD);  /*Disable Comparator*/\\r
+PORTB=~((1<<PINB2)|(1<<PORTB0)); /*Make PullUp an all Pins but not OW_PIN*/\\r
+/*Schalter kann gegen Masse sein und zieht dann immer Strom*/ \\r
+DDRB|=(1<<PORTB0); /*Als Ausgang und 0*/\\r
+PORTA|=0xFF;   \r
+\r
+#define OWST_INIT_USI_ON \\r
+PRR|=(1<<PRADC);  /*Switch off usi and adc for save Power*/\\r
+ACSR|=(1<<ACD);  /*Disable Comparator*/\\r
+ADCSRB|=(1<<ACME); /*Disable Analog multiplexer*/\\r
+PORTB|=~(1<<PINB2)|(1<<PORTB0); /*Make PullUp an all Pins but not OW_PIN*/\\r
+/*Schalter kann gegen Masse sein und zieht dann immer Strom*/ \\r
+DDRB|=(1<<PORTB0); /*Als Ausgang und 0*/\\r
+PORTA|=0xFF;\r
+\r
+#define OWST_INIT_ALL_ON \\r
+PORTB|=~(1<<PINB2)|(1<<PORTB0); /*Make PullUp an all Pins but not OW_PIN*/\\r
+/*Schalter kann gegen Masse sein und zieht dann immer Strom*/ \\r
+DDRB|=(1<<PORTB0); /*Als Ausgang und 0*/\\r
+PORTA|=0xFF;\r
+\r
+       \r
+#define OWST_EN_PULLUP MCUCR &=~(1<<PUD); /*All Pins Pullup...*/\r
+\r
+#define OWST_WDT_ISR \\r
+uint8_t wdcounter=0;\\r
+ISR(WATCHDOG_vect) {/* #else ISR(WDT_vect) {           #endif*/\\r
+               wdcounter++;\\r
+               if (reset_indicator==1) reset_indicator++;\\r
+               else if (reset_indicator==2) mode=0;\\r
+}\r
+\r
+#define OWST_WDR_CONFIG8\\r
+       WDTCSR |= ((1<<WDCE) );   /* Enable the WD Change Bit//| (1<<WDE)*/\\r
+       WDTCSR |=   (1<<WDIE) |              /* Enable WDT Interrupt*/\\r
+       (1<<WDP3) | (1<<WDP0);   /*Set Timeout to ~8 seconds*/\r
+\r
+#define OWST_WDR_CONFIG4\\r
+       WDTCSR |= ((1<<WDCE) );   /* Enable the WD Change Bit//| (1<<WDE)*/\\r
+       WDTCSR |=   (1<<WDIE) |              /* Enable WDT Interrupt*/\\r
+       (1<<WDP3) ;   /*Set Timeout to ~2 seconds*/\r
+\r
+#define OWST_WDR_CONFIG2\\r
+       WDTCSR |= ((1<<WDCE) );   /* Enable the WD Change Bit//| (1<<WDE)*/\\r
+       WDTCSR |=   (1<<WDIE) |              /* Enable WDT Interrupt*/\\r
+       (1<<WDP2) | (1<<WDP1)| (1<<WDP0);   /*Set Timeout to ~1 seconds*/\r
+\r
+#define OWST_WDR_CONFIG1\\r
+       WDTCSR |= ((1<<WDCE) );   /* Enable the WD Change Bit//| (1<<WDE)*/\\r
+       WDTCSR |=   (1<<WDIE) |              /* Enable WDT Interrupt*/\\r
+       (1<<WDP2) | (1<<WDP1);   /*Set Timeout to ~1 seconds*/\r
+\r
+\r
+#define OWST_TESTSW \\r
+       int testSW(void) {\\r
+               uint8_t r;\\r
+               DDRB&=~(1<<PORTB0);  /*Eingang*/\\r
+               __asm__ __volatile__ ("nop");\\r
+               PORTB|=(1<<PORTB0); /*Pullup*/\\r
+               __asm__ __volatile__ ("nop");\\r
+               __asm__ __volatile__ ("nop");\\r
+               __asm__ __volatile__ ("nop");\\r
+               __asm__ __volatile__ ("nop");\\r
+               __asm__ __volatile__ ("nop");\\r
+               r=PINB&(1<<PORTB0);\\r
+               __asm__ __volatile__ ("nop");\\r
+               PORTB&=~(1<<PORTB0);\\r
+               __asm__ __volatile__ ("nop");\\r
+               DDRB|=(1<<PORTB0);  /*Eingang*/\\r
+               return (r==0);\\r
+       }\\r
+\r
+#define OWST_EXTERN_VARS\r
+extern uint8_t mode;\\r
+extern uint8_t gcontrol;\\r
+extern uint8_t reset_indicator;\\r
+extern uint8_t alarmflag; \\r
+extern void OWINIT(void);\\r
+extern void EXTERN_SLEEP(void);\\r
+\r
+\r
+\r
+#define OWST_MAIN_END \\r
+       if (((TIMSK0 & (1<<TOIE0))==0)&& (mode==0))       {\\r
+               MCUCR|=(1<<SE)|(1<<SM1);\\r
+               MCUCR&=~(1<<ISC01);\\r
+       } else {\\r
+               MCUCR|=(1<<SE);\\r
+               MCUCR&=~(1<<SM1);\\r
+       }\\r
+       asm("SLEEP");\r
+\r
+#endif\r
+\r
+//********************** AD_WANDLER ********************************\r
+//******************************************************************\r
+//clock fuer ADC 50kHz - 200kHz     8M / 128 = 62500   = 4M/64   erste Messng 25 = 0,4ms / zweite Messung 13 rund 0,21ms\r
+#ifdef __4MHZ__\r
+#define OWST_INIT_ADC \\r
+ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1);\r
+#else\r
+#define OWST_INIT_ADC \\r
+ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);\r
+#endif\r
+\r
+#define OWST_ADC_CONF ADCSRA|=(1<<ADSC); while ((ADCSRA&(1<<ADSC)));\r
+\r
+#define OWST_ADCREF_VCC 0\r
+#define OWST_ADCREF_AREF (1<<REFS0)\r
+#define OWST_ADCREF_INT ((1<<REFS0)|(1<<REFS1))\r
+\r
+#define OWST_ADCIN_PA0 0\r
+#define OWST_ADCIN_PA1 1\r
+#define OWST_ADCIN_PA2 2\r
+#define OWST_ADCIN_PA3 3\r
+#define OWST_ADCIN_PA4 4\r
+#define OWST_ADCIN_PA5 5\r
+#define OWST_ADCIN_PA6 6\r
+#define OWST_ADCIN_PA7 7\r
+\r
+\r
+#if  defined(__AVR_ATtiny44__)  || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny24A__)||defined(__AVR_ATtiny44A__)  || defined(__AVR_ATtiny84A__)\r
+#define OWST_ADCIN_REFINT 0b0100001\r
+#endif\r
+#if  defined(__AVR_ATmega168__)||defined(__AVR_ATmega168A__) ||defined(__AVR_ATmega328__) ||defined(__AVR_ATmega328P__) ||defined(__AVR_ATmega328PB__)\r
+#define OWST_ADCIN_REFINT 0b00001110\r
+#endif\r
+#if  defined(__AVR_ATtiny24__)||defined(__AVR_ATtiny44__)  || defined(__AVR_ATtiny84__)||defined(__AVR_ATtiny24A__)||defined(__AVR_ATtiny44A__)  || defined(__AVR_ATtiny84A__)\r
+#define AD_PORT PORTA\r
+#define AD_DDR DDRA\r
+#endif\r
+\r
+#if  defined(__AVR_ATmega168__)||defined(__AVR_ATmega168A__) ||defined(__AVR_ATmega328__) ||defined(__AVR_ATmega328P__) ||defined(__AVR_ATmega328PB__)\r
+#define AD_PORT PORTC\r
+#define AD_DDR DDRC\r
+#endif\r
+\r
+#define OWST_ADC_CONF16_FUNC \\r
+uint16_t owst_ADC_run() {/*14,5ms*/\\r
+       uint16_t r=0;\\r
+       for(uint8_t i=0;i<64;i++) {     OWST_ADC_CONF   r+=ADC; }\\r
+       return r;\\r
+} \\r
+double owst_ADC_runf() {/*16,5ms*/\\r
+       double r=0;\\r
+       for(uint8_t i=0;i<64;i++) {     OWST_ADC_CONF   r+=ADC; }\\r
+       r*=0.9993;\\r
+       return r;\\r
+}\r
+\r
+#define OWST_ADC_CONF16_OSS_FUNC \\r
+uint16_t owst_ADC_OSS_run() {/*896ms*/\\r
+       uint32_t r=0;\\r
+       for(uint16_t i=0;i<4096;i++) {\\r
+               OWST_ADC_CONF \\r
+               r+=ADC;\\r
+       }\\r
+       return r>>6;\\r
+} \\r
+double owst_ADC_OSS_runf() {/*964ms*/\\r
+       double r=0;\\r
+       for(uint16_t i=0;i<4096;i++) {\\r
+               OWST_ADC_CONF \\r
+               r+=ADC;\\r
+       }\\r
+       r+=5150;\\r
+       r*=0.9993;\\r
+       return r/64.0;\\r
+} \r
+\r
+\r
+#endif
\ No newline at end of file