/* * owdevice.c * * Created: 24.01.2012 14:11:43 * Author: Tobias Mueller, mail(at)tobynet.de */ #include #include #ifdef __AVR_ATmega32__ #include "uart.h" #include #endif //DEVICES #ifdef __AVR_ATtiny13A__ #define OW_PORT PORTB #define OW_PIN PINB #define OW_PORTN (1<20024) {TCNT1=0;lmode=OWM_SLEEP;} TCNT1=0; DIS_OWINT; switch (lmode) { case OWM_SLEEP: TCNT1=0; EN_OWINT; break; case OWM_MATCH_ROM: case OWM_WRITE_SCRATCHPAD: case OWM_READ_COMMAND: TCNT1=~(OWT_READLINE); break; case OWM_SEARCH_ROM: if (srcount<2) { TCNT1=~(OWT_LOWTIME); lwmode=OWW_NO_WRITE; } else TCNT1=~(OWT_READLINE); break; case OWM_READ_SCRATCHPAD: TCNT1=~(OWT_LOWTIME); lwmode=OWW_NO_WRITE; break; } if (lmode!=OWM_SLEEP) EN_TIMER; } else { //Steigente flanke if ((TCNT1>OWT_MIN_RESET)&&(TCNT1=8) { lmode=OWM_SLEEP; break; } } lsrcount=0; lactbit=(owid[lbytep]&lbitp)==lbitp; lwmode=lactbit; } break; } break; case OWM_MATCH_ROM: if (p==((owid[lbytep]&lbitp)==lbitp)) { lbitp=(lbitp<<1); if (!lbitp) { lbytep++; lbitp=1; if (lbytep>=8) { lmode=OWM_READ_COMMAND; cbuf=0; break; } } } else { lmode=OWM_SLEEP; } break; case OWM_WRITE_SCRATCHPAD: if (p) { scratchpad[lbytep]|=lbitp; } lbitp=(lbitp<<1); if (!lbitp) { lbytep++; lbitp=1; if (lbytep==5) { lmode=OWM_SLEEP; break; } else scratchpad[lbytep]=0; } break; case OWM_READ_SCRATCHPAD: RESET_LOW; if ((lscrc&1)!=lactbit) lscrc=(lscrc>>1)^0x8c; else lscrc >>=1; lbitp=(lbitp<<1); if (!lbitp) { lbytep++; lbitp=1; if (lbytep>=9) { lmode=OWM_SLEEP; break; } else if (lbytep==8) scratchpad[8]=lscrc; } lactbit=(lbitp&scratchpad[lbytep])==lbitp; lwmode=lactbit; break; } if (lmode!=OWM_PRESENT) EN_OWINT; mode=lmode; wmode=lwmode; bytep=lbytep; bitp=lbitp; srcount=lsrcount; actbit=lactbit; scrc=lscrc; #ifdef _DB_ // dbbuf[b1]=lmode;b1++; #endif } int main(void) { mode=OWM_SLEEP; wmode=OWW_NO_WRITE; OW_DDR&=~OW_PINN; MCUCR=(1<