Many changes from 2018
[owSlave2.git] / DS2450 / DS2450.c
index e2fb6c3..0e92255 100644 (file)
@@ -38,6 +38,7 @@
 #include <avr/wdt.h>\r
 #include <avr/sleep.h>\r
 #include <avr/pgmspace.h>\r
+#include "../common/I2C/TWI_Master.h"\r
 \r
 extern void OWINIT();\r
 extern void EXTERN_SLEEP();\r
@@ -49,12 +50,25 @@ uint8_t config_info[26]={0x06,0x09,0x06,0x09,0x06,0x09,0x06,0x09,0x02,20,20,20,2
 #error "Variable not correct"\r
 #endif\r
 \r
-extern uint8_t mode;\r
+extern volatile uint8_t mode;\r
 extern uint8_t gcontrol;\r
 extern uint8_t reset_indicator;\r
 extern uint8_t alarmflag;\r
 \r
 \r
+\r
+#if  defined(__AVR_ATtiny24__)||defined(__AVR_ATtiny44__)  || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny24A__)||defined(__AVR_ATtiny44A__)  || defined(__AVR_ATtiny84A__)\r
+ISR(WATCHDOG_vect) {\r
+       #else\r
+       ISR(WDT_vect) {\r
+       // mode=0;\r
+               #endif\r
+       //wdcounter++;\r
+                       if (reset_indicator==1) reset_indicator++;\r
+               else if (reset_indicator==2) mode=0;\r
+       }\r
+\r
+\r
 typedef union {\r
        volatile uint8_t bytes[0x20];\r
        struct {\r
@@ -99,8 +113,15 @@ typedef union {
 volatile pack_t pack;\r
 \r
 \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
-\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
 \r
 int main(void){\r
@@ -125,20 +146,31 @@ int main(void){
        pack.HD=0xFF;\r
        pack.LD=0x00;\r
        pack.VCCP=0;\r
+        MCUCR &=~(1<<PUD); //All Pins Pullup...\r
+        MCUCR |=(1<<BODS);\r
+        MCUSR=0;\r
 \r
-       PORTA=0xFF;\r
-       PORTB=0xFF;\r
 \r
-       OWINIT();\r
 \r
+       OWINIT();\r
+       DDRC=0xFF;\r
+       DDRB=0xFF;\r
+       DDRD=0xFF-(1<<PIND2);\r
+       PORTB=0xFF;\r
+       PORTC=0xFF;\r
+       PORTD=0xFF-(1<<PIND2);\r
+       PRR=0xCF;\r
+               \r
        MCUCR &=~(1<<PUD); //All Pins Pullup...\r
-       MCUCR |=(1<<BODS);\r
+       //MCUCR |=(1<<BODS);\r
        //PORTA&=~((1<<PINA0)|(1<<PINA1)|(1<<PINA2)|(1<<PINA3));\r
 \r
-       ADCSRA=(1<<ADEN)|(1<ADPS0)|(1<<ADPS2);\r
+       //ADCSRA=(1<<ADEN)|(1<ADPS0)|(1<<ADPS2);\r
 \r
        \r
-       \r
+               WDTCSR |= (1<<WDCE) |(1<<WDE);   // Enable the WD Change Bit//| (1<<WDE)\r
+               WDTCSR  =   (1<<WDIE) |              // Enable WDT Interrupt\r
+               (1<<WDP2) | (1<<WDP0);   // Set Timeout to ~8 seconds\r
        gcontrol=1;\r
        ADCSRB|=(1<<ADLAR); \r
        sei();\r
@@ -215,34 +247,53 @@ int main(void){
                }\r
 \r
                uint8_t bb=1;\r
-               for(uint8_t i=0;i<4;i++) {\r
+               for(volatile uint8_t i=0;i<4;i++) {\r
                        if (pack.bytes[8+i*2]&0x80) {  //Chanel as output\r
                                if (pack.bytes[8+i*2]&0x40) {\r
-                                       DDRA|=bb;\r
+                               //      AD_DDR|=bb;\r
                                } else {\r
-                                       DDRA&=~bb;\r
+                                       cli();\r
+                               //      AD_DDR&=~bb;\r
+                                       sei();\r
                                }\r
                        } else {\r
-                               DDRA&=~bb;\r
+                               cli();\r
+                       //      AD_DDR&=~bb;\r
+                               sei();\r
                        }\r
                        bb=bb*2;\r
                }\r
                \r
+\r
+#if defined(__AVR_ATmega168__)||defined(__AVR_ATmega168A__)  ||defined(__AVR_ATmega328__) ||defined(__AVR_ATmega328P__) ||defined(__AVR_ATmega328PB__) \r
+       if (((TIMSK0 & (1<<TOIE0))==0)&& (mode==0)){\r
+       //if ( mode==0){\r
+               SMCR|=(1<<SE)|(1<<SM1);\r
+               EICRA&=~(1<<ISC01);\r
+       } else {\r
+               SMCR|=(1<<SE);\r
+               SMCR&=~(1<<SM1);\r
+       }\r
+       asm("SLEEP");\r
+#else\r
+\r
 #if  defined(__AVR_ATtiny25__)||defined(__AVR_ATtiny45__)  || defined(__AVR_ATtiny85__)\r
                        if (((TIMSK & (1<<TOIE0))==0)&& (mode==0))\r
 #endif                 \r
-#if  defined(__AVR_ATtiny24__)||defined(__AVR_ATtiny44__)  || defined(__AVR_ATtiny84__) ||defined(__AVR_ATtiny24A__)||defined(__AVR_ATtiny44A__)  || defined(__AVR_ATtiny84A__)\r
+#if  defined(__AVR_ATtiny24__)||defined(__AVR_ATtiny44__)  || defined(__AVR_ATtiny84__) ||defined(__AVR_ATtiny24A__)||defined(__AVR_ATtiny44A__)  || defined(__AVR_ATtiny84A__) \r
                        if (((TIMSK0 & (1<<TOIE0))==0)&& (mode==0))\r
 #endif\r
                          {\r
 \r
                        MCUCR|=(1<<SE)|(1<<SM1);\r
+                       MCUCR&=~(1<<SM0);\r
                        MCUCR&=~(1<<ISC01);\r
                } else {\r
                        MCUCR|=(1<<SE);\r
                        MCUCR&=~(1<<SM1);\r
                }\r
-       //      asm("SLEEP");\r
+               asm("SLEEP");\r
+#endif\r
    }\r
 \r
 \r