亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? f_14_34_robot.c

?? PIC_Hi-Tech_C_Mike_Pearces_I2C_routines Microchi PIC_Hi-Tech C_I2C_for_EEPROM_24LC01B Code
?? C
字號:
#include "config.h"
#include "serial.c"
#include "serio.c"
#include "i2cmsu.c"
#include "delay.h"

// Robot Code



volatile unsigned int last_capture, this_capture;
volatile unsigned long delta;
volatile unsigned char tmr1_ov;  // timer 1 overflow cnt
#define MAXBYTES 32
volatile unsigned char cbuff[MAXBYTES]; 
volatile unsigned char bitcount, bytecount,bit_edge;
volatile unsigned char state,edge_capture,current_bit;
volatile unsigned char this_byte, cmd,last_cmd, mode;


#define IDLE_TIME 4
#define BITCHANGE   10000
#define IDLE         0
#define START_PULSE  1
#define BIT_CAPTURE  2
#define IO_FINISH    3



#define PWM_MAX 10  // # of timer1 interrupts for one PWM period
#define OP_LEFT 5   // left wheel port bit
#define OP_RIGHT 6  // right wheel port bit
#define OP_LDIR 3   // left wheel direction port bit
#define OP_RDIR 4   // right wheel direction port bit

void do_ircap(void);

//Manual PWM control variables
unsigned char dc_left,dc_right, period_left, period_right;

// use timer3, CCPR2 for PWM generation
#define MATCH_INTERVAL 0x0800
unsigned int match;
unsigned char adc_val, old_adc_val;

#if defined(HI_TECH_C)
void interrupt isr(void)
#endif
#if defined(__18CXX)
#pragma interrupt isr
void isr(void)
#endif
{
  if (CCP2IF) {
    CCP2IF = 0;
    adc_val = ADRESH;  // get AD value
    GODONE = 1;  // new conversion
    // don't clear timer1, change compare register
    match = match + MATCH_INTERVAL;
    CCPR2H = match >> 8;
    CCPR2L = match & 0xFF;
    CCP2IF = 0;
    period_left++;
    if (period_left == PWM_MAX) {
      period_left = 0;
      if (!dc_left) bitclr(PORTB,OP_LEFT);
	else bitset(PORTB,OP_LEFT);
    } else if (period_left == dc_left) {
      bitclr(PORTB,OP_LEFT);
      old_adc_val = adc_val;
    }
    period_right++;
    if (period_right == PWM_MAX) {
      period_right = 0;
      if (!dc_right) bitclr(PORTB,OP_RIGHT);
	else bitset(PORTB,OP_RIGHT);
    } else if (period_right == dc_right) {
      bitclr(PORTB,OP_RIGHT);
    }
  }
  if (TMR1IF) {
    tmr1_ov++;  // increment timer1 overflow
  }
  if (CCP1IF) {
    // read CCPR1 as 16-bit value
    this_capture = CCPR1;
    if (!tmr1_ov) { 
      // no overflow at all
      delta = this_capture - last_capture ;
    } else {
      delta = tmr1_ov - 1;
      // delta valid from 0x000000 to 0x07FFFFF
      delta = (delta << 16);
      last_capture = 0 - last_capture;  // time to overflow
      delta = delta + last_capture;
      delta = delta + this_capture;
    }
    last_capture = this_capture;
    tmr1_ov = 0;  // clear timer 1 overflow count
    if (CCP1CON & 0x01)  {//test LSb
      CCP1CON = 0x0; //reset first
      CCP1CON = 0x4; //falling edge
    }
    else {
      CCP1CON = 0x0; //reset first 
      CCP1CON = 0x5; // rising edge
    }
    edge_capture = 1;
  }
  if (TMR1IF || CCP1IF)  do_ircap();
}

// decode IO pulses
void do_ircap(void){
  TMR1IF = 0; CCP1IF = 0;
  switch (state) {
  case IDLE: 
    // wait for line to become idle
    if (tmr1_ov > IDLE_TIME){
      tmr1_ov = 0;
      state = START_PULSE;
      edge_capture = 0;
    }
    break;
  case START_PULSE: 
    if (edge_capture) { // wait for edge
      edge_capture = 0;
      bit_edge = 0;
      state = BIT_CAPTURE;
    }
    break;
  case BIT_CAPTURE: 
    // wait for edge or idle condition
    if (tmr1_ov > 1) {
      // finished
      CCP1IE = 0;   // disable interrupts
      TMR1IE = 0;   // allow timer 1 interrupts
      TMR1ON = 0;   // disable timer 1
      state = IO_FINISH;
    } else if (edge_capture) {
      edge_capture = 0;
      //accumulating bits, LSB to MSB 
      if ((delta > BITCHANGE) || bit_edge) {
	if (delta > BITCHANGE) {
	  // toggle current bit if wide pulse
	  current_bit = ~current_bit;
	}
	if (current_bit) this_byte = this_byte | 0x01; //set LSb
	bitcount++;
	bit_edge = 0; // next edge is not a bit
	if (bitcount == 8) {
	  bitcount = 0;
	  cbuff[bytecount] = this_byte;
	  bytecount++;
	  this_byte = 0;
	} else{
	  this_byte = this_byte << 1;
	}
      } else if (!bit_edge) bit_edge = 1;
    }
    break;
  }
}

void reset_ir(void) {
    state = IDLE;    // look for idle
    CCP1CON = 0;  // turn off when changing modes
    CCP1CON = 0x4; // capture every falling edge 
    current_bit = ~(0);
    bitcount = 0;
    bytecount = 0;
    tmr1_ov = 0;  // clear timer 1 overflow count
    last_capture = 0;
    // enable interrupts 
    CCP1IF = 0;   // clear CCP1IF interupt flag 
    CCP1IE = 1;   // capture interrupt enable 
    TMR1IF = 0;   // clear timer 1 interrupt flag
    TMR1IE = 1;   // allow timer 1 interrupts
    TMR1ON = 1;   // enable timer 1
}


unsigned char i;

// convert last byte to philip format
// 0x32 - rewind
// 0x35 - play
// 0x34 - FF
// 0x37 - rec
// 0x36 - stop
// 0x29 - pause

// on radio shack universal remote code 333 VCR
// 0x0 - 0x9  buttons 0-9.
#define STOP       0x36  // stop (stop)
#define SPEEDUP    0x29  // speedup (pause)
#define SLOWDOWN   0x37  // slowdown (rec)
#define GOFORWARD  0x35  // forward (play)
#define TURNLEFT   0x32  // turn left (rewind)
#define TURNRIGHT  0x34  // turn right (fast fwd)
#define REVERSE    0x05  // reverse (#5)
#define SPIN       0x09  // spin (#9)
#define MODESWAP   0x01  // man/auto tgl (#1)

#define MAN_DRIVE  0x00
#define AUTO_DRIVE 0x01

void philips_convert(void){
  i = cbuff[0] ; // last full byte
  if (i & 0x01) bitset(cmd,6);
  else  bitclr(cmd,6);
  cmd = cmd >> 1;
}

void Delay_tens(char k){
  while(k){
    DelayMs(100);
    k--;
  }
}

void all_stop(void) {
  while(dc_left || dc_right) {
    if (dc_left) dc_left--;
    if (dc_right)dc_right--;
    DelayMs(50);
  }
  Delay_tens(2);
}

void dir_fwd(void) {
  bitclr(PORTB,OP_RDIR); bitclr(PORTB,OP_LDIR);
}

void dir_back(void) {
  bitset(PORTB,OP_RDIR); bitset(PORTB,OP_LDIR);
}

void do_speedup (char target) {
  dc_left = 0; dc_right = 0;
  while (dc_left != target) {
    dc_left++;dc_right++;
    DelayMs(75);
  }
}

void do_turn (char ltarg,char rtarg) {
  dc_left = 0;  dc_right = 0;
  while ((dc_left != ltarg) || (dc_right != rtarg)) {
    if (dc_left != ltarg) dc_left++;
    if (dc_right != rtarg) dc_right++;
    DelayMs(75);
  }
}

#define BLOCKAGE_THRESHOLD 60
#define CLEAR_THRESHOLD 40
#define FWD_SPEED 6
#define BACK_SPEED 9

void handle_cmd(void){
  cmd = this_byte;
  philips_convert();
  if (last_cmd != cmd) {
    last_cmd = cmd;
    return;
  }
  last_cmd = 0;
  cbuff[0] =0 ;  cbuff[1] =0 ;
  switch (cmd) {
  case STOP: 
    all_stop();
    break;
  case SPEEDUP: 
    if (dc_left < PWM_MAX)dc_left += 2;
    if (dc_right < PWM_MAX)dc_right += 2;
    break;
  case SLOWDOWN: 
    if (dc_left) dc_left -= 2;
    if (dc_right)dc_right -= 2;
    break;
  case GOFORWARD: 
    bitclr(PORTB,OP_RDIR);
    bitclr(PORTB,OP_LDIR);
    if (dc_left > dc_right) dc_right = dc_left;
    else dc_left = dc_right;
    break;
  case TURNLEFT: 
    if (dc_left) dc_left -= 2;
    break;
  case TURNRIGHT: 
    if (dc_right) dc_right -= 2;
    break;
  case REVERSE: 
    dc_left = 0; dc_right = 0;
    DelayMs(200); DelayMs(200);
    bitset(PORTB,OP_RDIR);
    bitset(PORTB,OP_LDIR);
    dc_right = FWD_SPEED; dc_left = FWD_SPEED;
    break;
  case SPIN: 
    dc_left = 0; dc_right = 0;
    DelayMs(100); DelayMs(100);
    DelayMs(100); DelayMs(100);
    bitset(PORTB,OP_RDIR);
    dc_right = FWD_SPEED;dc_left = FWD_SPEED;
    break;
  case MODESWAP:
    if (mode == AUTO_DRIVE) mode = MAN_DRIVE;
    else mode = AUTO_DRIVE;
    all_stop();
    dir_fwd();
    break;
  }
}


void manual_drive(void){
  while(mode == MAN_DRIVE) {
    reset_ir(); 
    // wait for IR data to arrive
    while (state != IO_FINISH);
    handle_cmd();
  }
}


void auto_drive(void){
  reset_ir(); 
  while(mode == AUTO_DRIVE) {
    if (state == IO_FINISH) {
      // if IR arrives, execute it
      handle_cmd();
      reset_ir();
    } else {
      // auto driving
      if (dc_left || dc_right) {// moving....
		if (old_adc_val > BLOCKAGE_THRESHOLD) {
	  // STOP!!!!!!
	  dc_left = 0; dc_right = 0;
	  Delay_tens(3);
	}
      } else {
	// stopped
	if (old_adc_val < CLEAR_THRESHOLD) {
	  // go forward again 
	  dir_fwd(); do_speedup (FWD_SPEED);
	} else {
	  // backup, pivot
	  dir_back(); 
          do_speedup (BACK_SPEED);  
          Delay_tens(3);
	  // slow down on wheel so it pivots
	  dc_left = 2; 
	  Delay_tens(8); dc_left = 0; dc_right = 0; 
          Delay_tens(2);
	  dir_fwd(); do_turn (BACK_SPEED,2);
	  Delay_tens(6);
	  dc_left = FWD_SPEED; dc_right = FWD_SPEED;
	}
      }//end if(dc_left...)else{}...
    }//end if(state == IO_FINISH)else{}..
  } //end  while(mode == AUTO_DRIVE)
}// end auto_drive()

void main(void){
  //serial_init(95,1); //debug only
  // initialize timer1, prescale by 1, internal clock
  T1CKPS1 = 0;  T1CKPS0 = 0;  T1OSCEN = 0;  TMR1CS = 0;  
  bitset(TRISC,2);// set CCP1 as input for IR Capture
  // set up everything for PWM, direction control
  bitclr(TRISB,OP_LEFT);  bitclr(TRISB,OP_RIGHT);
  bitclr(TRISB,OP_RDIR);  bitclr(TRISB,OP_LDIR);
  bitclr(PORTB,OP_LEFT);  bitclr(PORTB,OP_RIGHT);
  bitclr(PORTB,OP_RDIR);  bitclr(PORTB,OP_LDIR);
  // init timer3, prescale by 2, int. clock
  T3CKPS1 = 0; T3CKPS0 = 1; TMR3CS = 0;  T3SYNC = 0; 
  // TMR3 with CCP2, TMR1 with CCP1
  T3CCP2=0;T3CCP1=1; 
  // setup capture mode, enable capture interrupt
  CCP2CON = 0x02; CCP2IF = 0;  CCP2IE = 1; 
  CCPR2H = (MATCH_INTERVAL >> 8); 
  CCPR2L = (0xFF & MATCH_INTERVAL);
  TMR3ON = 1;
  // configure A/D for IR sensor, right. just, channel 0
  TRISA = 0xFF;	
  ADCON1 = 0x0E;  ADCON0 = 0x80;  ADON = 1; 
  IPEN = 0;  PEIE = 1;  GIE = 1; 
  mode = 0; 
  while(1) {
    switch (mode) {
      case 0:  manual_drive();
	break;
      case 1:  auto_drive();
	break;
    }
  }
}

//for MCC18, place the interrupt vector goto
#if defined(__18CXX)
#if defined(HIGH_INTERRUPT)
#pragma code HighVector=HIGH_INTERRUPT
#else
#pragma code HighVector=0x0008  
#endif
void HighVector (void)
{
    _asm goto isr _endasm
}
#pragma code
#endif




?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人av一区二区三区在线观看| 欧美日韩国产不卡| 欧美日韩和欧美的一区二区| 欧美r级电影在线观看| 亚洲三级免费观看| 国产成人自拍在线| 欧美一区二区三区四区视频| 亚洲视频一区在线| 国产成人免费视频| 精品国产一区久久| 日韩vs国产vs欧美| 欧美吞精做爰啪啪高潮| 国产精品久久久久影院亚瑟| 国内成人自拍视频| 日韩一级成人av| 天天操天天综合网| 在线观看精品一区| 一区二区在线观看免费视频播放| 粉嫩av一区二区三区粉嫩| 26uuu亚洲| 久久精品国产亚洲a| 91精品黄色片免费大全| 午夜久久久久久| 欧美日韩国产精选| 亚洲大片在线观看| 欧美日韩成人在线| 婷婷成人综合网| 欧美另类久久久品| 日韩精品久久理论片| 欧美日韩视频不卡| 亚洲国产裸拍裸体视频在线观看乱了 | 91成人免费网站| 国产精品家庭影院| 成人黄页在线观看| 中文字幕亚洲区| 日本韩国视频一区二区| 一区二区三区毛片| 在线成人免费观看| 欧美性猛交xxxxxxxx| 亚洲美女屁股眼交| 欧美四级电影在线观看| 五月婷婷综合在线| 日韩欧美在线影院| 国产福利精品导航| 国产精品你懂的| 91久久线看在观草草青青| 一区二区三区**美女毛片| 欧美日韩日日夜夜| 另类小说欧美激情| 国产日韩欧美a| 91天堂素人约啪| 亚洲第一福利一区| 久久一区二区三区四区| 99久久精品国产观看| 亚洲国产毛片aaaaa无费看| 日韩一卡二卡三卡四卡| 国产精品一二三在| 粉嫩蜜臀av国产精品网站| 伊人一区二区三区| 欧美xfplay| 97精品久久久午夜一区二区三区 | 成人毛片视频在线观看| 亚洲伦在线观看| 91精品国产日韩91久久久久久| 久久精品二区亚洲w码| 国产精品久久久久影院| 欧美日韩一区三区四区| 国产精品一线二线三线精华| 亚洲裸体xxx| 久久婷婷久久一区二区三区| 色综合久久九月婷婷色综合| 日本三级亚洲精品| 一区在线中文字幕| 欧美大片在线观看一区二区| 不卡的电影网站| 毛片基地黄久久久久久天堂| |精品福利一区二区三区| 欧美一区二区三区人| 一本色道久久综合亚洲aⅴ蜜桃| 蜜桃视频一区二区| 亚洲乱码一区二区三区在线观看| 欧美白人最猛性xxxxx69交| 一本在线高清不卡dvd| 国产一区二区久久| 视频一区二区三区入口| 中文字幕亚洲精品在线观看| 欧美精品一区二区三区视频 | www.亚洲色图| 久久国产欧美日韩精品| 亚洲一区二区视频| 最新欧美精品一区二区三区| 2020国产精品| 欧美一级精品在线| 欧美日韩的一区二区| 色女孩综合影院| 97久久超碰国产精品| 国产精品66部| 国产美女精品一区二区三区| 日韩国产高清影视| 日日摸夜夜添夜夜添精品视频 | 欧美精品一区二区三区一线天视频| 欧洲国产伦久久久久久久| 成人av电影在线观看| 国产精品18久久久久久久久久久久| 日韩精品免费专区| 丝袜诱惑制服诱惑色一区在线观看 | 亚洲欧美偷拍三级| 亚洲国产精品成人综合| 久久久噜噜噜久噜久久综合| 日韩欧美综合在线| 日韩欧美一区二区视频| 欧美一区欧美二区| 日韩欧美电影在线| 精品久久一区二区| 久久综合给合久久狠狠狠97色69| 欧美一二三四在线| 久久综合狠狠综合| 欧美国产一区二区在线观看| 中文字幕不卡的av| 国产精品日日摸夜夜摸av| 国产精品久久久久永久免费观看 | 亚洲韩国一区二区三区| 一区二区三区欧美日韩| 亚洲一区二区欧美日韩| 夜夜精品视频一区二区| 亚洲影视在线观看| 五月天婷婷综合| 麻豆国产一区二区| 国产伦精品一区二区三区免费 | 91在线porny国产在线看| 国产成人精品一区二| 99在线精品视频| 欧美日韩一区二区三区在线| 日韩一区二区免费高清| 欧美不卡123| 国产精品久久久久一区| 亚洲精品视频一区二区| 五月开心婷婷久久| 国产在线精品一区二区不卡了| 国产传媒日韩欧美成人| 91黄视频在线| 日韩女优av电影| 中文字幕在线不卡视频| 亚洲一级不卡视频| 国产一区二三区好的| 91影院在线免费观看| 在线不卡的av| 久久精品综合网| 亚洲高清视频的网址| 另类调教123区| 91小视频在线| 欧美xxxx老人做受| 亚洲精品视频免费观看| 韩国精品久久久| 在线免费观看成人短视频| 精品国产123| 亚洲va欧美va天堂v国产综合| 国产成人综合视频| 欧美高清视频在线高清观看mv色露露十八 | 欧美日韩一区不卡| 亚洲国产精品激情在线观看| 五月天视频一区| aaa亚洲精品一二三区| 精品国产乱子伦一区| 亚洲一区二区三区中文字幕| 国产一区二区三区不卡在线观看| 欧美日韩在线综合| 国产精品色哟哟| 极品美女销魂一区二区三区| 欧美在线一区二区| 亚洲欧洲无码一区二区三区| 久久精品国产一区二区三区免费看| 91高清在线观看| 国产精品伦理一区二区| 国产综合一区二区| 69av一区二区三区| 亚洲自拍偷拍麻豆| 99久久99久久免费精品蜜臀| 久久久国产午夜精品| 美国欧美日韩国产在线播放| 欧美唯美清纯偷拍| 亚洲自拍偷拍麻豆| 色综合视频在线观看| 亚洲欧洲成人自拍| 粉嫩绯色av一区二区在线观看| 精品国产a毛片| 久久国产精品99久久人人澡| 欧美日韩亚洲高清一区二区| 一区二区三区日本| 日本韩国一区二区| 亚洲一区二区三区国产| 色婷婷av久久久久久久| 中文字幕中文字幕一区二区| 成人教育av在线| 国产精品色哟哟| 91在线视频免费观看| 日韩理论片中文av| 91福利精品第一导航| 一区二区在线看| 欧美日韩成人综合在线一区二区|