#include #include #include #include #include #define C500us 12 #define LeftHold 0x01 //F: 1:LeftHold #define RightHold 0x02 //F: 1:RightHold #define DSW 0x10 //F: Dual SW 0:off, 1:on #define SW0 0x20 //F: SW0 0:off, 1:on #define SW1 0x40 //F: SW1 0:off, 1:on #define TO 0x80 //F: TimeOut 0:off, 1:on prog_char ctab[]={234,165,117}; // 10ms,7ms,5ms prog_char dirtab[]={ // direction 0<<2, 1<<2, 3<<2, 2<<2, // R 0<<4, 1<<4, 3<<4, 2<<4, // D 0<<2, 2<<2, 3<<2, 1<<2, // L 0<<4, 2<<4, 3<<4, 1<<4 // U }; uint8_t sw0cntr, sw1cntr,c500us, c10ms, t500us, t10ms, c, m, x, cxms, S, dir, F, b, i, u; SIGNAL(SIG_OVERFLOW0){ // 0.167 * 256 = 42.6666 us if(++c10ms>=234){ t10ms++; c10ms=0; } // 10ms sync if(++c500us>=C500us){ // 500us sync c500us=0; if(b>0){ outp(inp(PORTD)^0x40,PORTD); b--; } if(bit_is_clear(PINB,0))sw0cntr=100; // 50ms hold else if(sw0cntr>0) sw0cntr--; if(bit_is_clear(PINB,1))sw1cntr=100; // 50ms hold else if(sw1cntr>0) sw1cntr--; } if(S==14 && ++x>=cxms){ // xms sync x=0; u=PRG_RDB(&dirtab[(uint8_t)(dir+m)]); m++; m&=0x03; outp(u|(inp(PORTD)&0x03),PORTD); } } int main(void){ // xxxRCUDL xBUDLRLR outp(0xfc,PORTB); outp(0x03,PORTD); // uuuuuuxx x0000011 outp(0x00,DDRB); outp(0x7f,DDRD); // iiiiiiii xooooooo outp(0,TCNT0); outp(1,TCCR0); // TCNT0=0 T0=0.167 us outp(1<2) eeprom_wb(0,1); if(bit_is_set(PINB,1)) F|=DSW; // SW1オフなら2個のSWで操作 sei(); for(;;){ F&=0x1f; if(sw0cntr>0) F|=SW0; if(sw1cntr>0) F|=SW1; if(t10ms>=100){ F|=TO; t10ms=0; } if(S==0){ if(F&SW0){ S=1; t10ms=0; b=100; } else if(F&DSW && F&SW1){S=14;t10ms=0;cxms=PRG_RDB(&ctab[eeprom_rb(0)]);} }else if(S==1){ if(F&TO){ S=2; b=100; F&=0xfc;} // Hold off else if(!(F&SW0)){ if(F&DSW){ S=0; dir=(dir+4)&0x0c; } else{ S=12; t10ms=0; } } }else if(S==2){ if(F&TO){ S=3; b=100; } else if(!(F&SW0)){S=5; t10ms=0; } }else if(S==3){ if(F&TO){ S=4; b=100; } else if(!(F&SW0)){S=7; t10ms=0; } }else if(S==4){ if(F&TO){ S=15; b=100; } else if(!(F&SW0)){S=9; t10ms=0; } }else if(S==5){ if(F&TO){ S=0; b=100; } else if(F&SW0){ S=6; t10ms=0; b=100; } }else if(S==6){ if(F&TO){ S=15; b=100; F|=LeftHold;} else if(!(F&SW0)){S=5; t10ms=0; } }else if(S==7){ if(F&TO){ S=0; b=100; } else if(F&SW0){ S=8; t10ms=0; b=100; } }else if(S==8){ if(!(F&SW0)){ S=7; t10ms=0; } }else if(S==9){ if(F&TO){ S=0; b=100; } else if(F&SW0){ S=10; t10ms=0; b=100; } }else if(S==10){ if(F&TO){ S=11; b=100; } else if(!(F&SW0)){S=0; t10ms=0; eeprom_wb(0,0);} //低速 }else if(S==11){ if(F&TO){ S=15; b=100; eeprom_wb(0,2);} //高速 else if(!(F&SW0)){S=0; t10ms=0; eeprom_wb(0,1);} //標準 }else if(S==12){ if(F&TO){ S=0; b=100; } else if(F&SW0){ S=13; t10ms=0; b=100; } }else if(S==13){ if(F&TO){ S=14; b=100; cxms=PRG_RDB(&ctab[eeprom_rb(0)]); x=0;} else if(!(F&SW0)){S=12; t10ms=0; dir=(dir+4)&0x0c; } }else if(S==14){ if(F&DSW){ if(!(F&SW1))S=0; }else{ if(!(F&SW0)){S=12; t10ms=0; } } }else if(S==15){ if(!(F&SW0)) S=0; } if(S==6 || F&LeftHold) cbi(PORTD,0); // LB on else sbi(PORTD,0); // LB off if(S==8) cbi(PORTD,1); // RB on else sbi(PORTD,1); // RB off } }