Esempio n. 1
0
/***************************************************************************
 * SLIP_TASK: Is run as often as possible to collect all incoming UART chars
 */
void slip_task(void){
	if (uart_rxc()){			// If uart chart is received
		char c = uart_rx_ch();
		if (slip_add_to_packet(slip_rx_buffer, c, SLIP_BUFFER_SIZE)){
			// SLIP package received
			// THIS COULD BE SET TO RUN IN A SEPERATE TIMING!!!
			int8_t len = slip_unwrap_data(slip_rx_buffer, SLIP_DATA_SIZE);
			if (len > 0 && len <= SLIP_BUFFER_SIZE){
				// This is the sending command
				slip_wrap_data(slip_rx_buffer, 0x01, len, SLIP_HEADER_SIZE);
				// Control the PWM signals
				motion_control((int8_t*)slip_rx_buffer, len);
			}
			slip_clear_buffer(slip_rx_buffer, SLIP_BUFFER_SIZE);
			// END OF THIS COULD BE SE... ...IMING!!!
			slip_received = 1;
		}
	}
}
Esempio n. 2
0
/*==============================================================================
*   MODULE        : main
*   FUNCTION      : IR Remocon リモコンメイン関数
*   ARGUMENT      : none
*   RETURN        : none
*   NOTE          : none
*===============================================================================*/
void main()
{
    unsigned char   i;              /* LED 点滅回数カウンタ         */
    unsigned char   ir_state;       /* 受信状態 (成功/不明/ノイズ)  */
    unsigned char   key_code;       /* キーコード取得用             */
    unsigned char   func_key_type;  /* ファンクションキー種別       */
    unsigned char   eep_offset;     /* EEPROM保存先 オフセット      */


    /* PORT A/B/C 入出力設定 (1b:Input 0b:Output)   */
    TRISA   = 0xCF; /* Port A 入出力設定            */
	TRISB   = 0x00; /* Port B 入出力設定            */    /* masa すべてのPORTをOUTPUTにする。*/
    //TRISB   = 0xC1; /* Port B 入出力設定            */
    TRISC   = 0x81; /* Port C 入出力設定            */

    /* A/Dコンバータ設定                            */
    ADCON0  = 0x00; /* ADコンバータ電源OFF(未使用)  */
    ANSEL   = 0x00; /* AN0~AN7  Pin Digital I/O     */
    ANSELH  = 0x00; /* AN8~AN13 Pin Digital I/O     */

    /* コンパレータ設定                             */
    CM1CON0 = 0x07; /* Comparator 1 Disable         */
    CM2CON0 = 0x07; /* Comparator 2 Disable         */

    /* キャリア周波数設定 (PWM用 TIMER2 の設定)     */
    PR2     = 0x19; /* 38KHz (1cycle = 25~26us)     */
    T2CON   = 0x0C; /* Postscaler   -> 1:2          */
                    /* Timer2       -> ON           */
                    /* Prescaler    -> 1            */
    CCPR2L  = 0x0C; /* Duty         -> 50% (0x32)   */
                    /* CCPR2L:1100b                 */
                    /* CCP2CON(bit5~4):10b->110010b */
    CCP2CON = PWM_STOP; /* PWM      -> OFF          */
                        /* 2LSB of duty cycle->10b  */

    /* 受信データ解析用 TIMER1 設定                 */
    T1CON   = 0x01; /* Prescaler      -> 1:1 (65ms) */
                    /* Clock Source   -> Internal   */
                    /* Timer1        -> Start       */
    TMR1L   = 0;    /* Timer1 Value MSB 8bit Clear  */
    TMR1H   = 0;    /* Timer1 Value LSB 8bit Clear  */
    TMR1IF  = 0;    /* Timer1 Interrupt Flag Clear  */
    TMR1IE  = 1;    /* Timer1 Interrupt Enable      */

    /* Port 初期化 */
    PORTA   = 0x00; /* PortA RA7~0:Lo               */
    PORTB   = 0x00; /* PortB RB7~1:Lo    RB0:Hi     */    /* masa */
	//PORTB   = 0x01; /* PortB RB7~1:Lo    RB0:Hi     */
    PORTC   = 0x01; /* PortC RC7~1:Lo    RC0:Hi     */

    /****************************************************************/
    /* Dip SW が両方 Hi ⇒ 送信モード                               */
    /****************************************************************/
    if ((PORTA & MODE_MASK) == RUN_MODE_1) {
        /* Function Type Init (Function 1 で初期化) */
        func_key_type = KEY_CODE01;
        /* Function1 LED On */
        led_control(LED_MASK);

        for (;;)
        {
            /* Key Check */
            key_code = key_input_check();

            /* Key 押下なし -> CPU Sleep    */
            if (key_code == KEY_OFF) {
                /* CPU Sleep -> Wake Up     */
                cpu_sleep();
            }
            /* Key 押下あり -> 何れかの動作 */
            else {
                /* Function Key 押下された  */
                if (key_code <= KEY_CODE04) {
                    /* Function Type 保持   */
                    func_key_type = key_code;
                    /* 対応した LED On      */
                    led_control((LED_MASK << key_code));
                }
                /* 動作キーが押下された     */
                else {
                    /* 対応したコードを送信 */
                    ir_out_start(func_key_type, key_code);
                }
            }
        }
    }

    /****************************************************************/
    /* Dip SW 1:Lo  Dip SW 2:Hi ⇒ 受信モード (EEPROMへの保存)      */
    /****************************************************************/
    if ((PORTA & MODE_MASK) == RUN_MODE_2) {
        /* Function LED All Off */
        led_control(ALL_ON);

        for (;;) {
            /* Key Check */
            key_code = key_input_check();
            /* Function Key が押されたら受信モードへ    */
            if (key_code <= KEY_CODE04) {
                /* Function Key Code 保持               */
                func_key_type = key_code;
                /* Key に対応した LED 点灯              */
                led_control((LED_MASK << key_code));
                break;
            } else {
                /* Key 押下されるまでチェックを続ける   */
                ;
            }
        }

        /* 何か受信するまでIRチェック */
        for (;;) {
            /* 赤外線コード受信                         */
            ir_state = ir_recieve();
            /* 受信成功 (NEC/家電協フォーマット)        */
            if (ir_state == SUCCESS) {
                /* LED制御 & データ保存処理へ遷移       */
                break;
            }
            /* 不明のフォーマットを受信                 */
            else if (ir_state == UNKNOWN) {
                for (;;) {
                    /* 電源OFFまで 150ms 間隔で全LED点滅    */
                    led_control(ALL_OFF);
                    __delay_ms(150);
                    led_control(ALL_ON);
                    __delay_ms(150);
                }
            }
            /* 何らかのノイズを受信                     */
            else {
                /* もう一度受信処理                     */
                ;
            }
        }

        /* 受信完了状態通知 */
        for (i=0; i<2; i++) {
            /* 選択した Key に対応した LED 点滅 (2回)   */
            /* 150ms 間隔で点滅                         */
            led_control(ALL_OFF);
            __delay_ms(150);
            led_control((LED_MASK << func_key_type));
            __delay_ms(150);
        }
        /* IR format 一時保持       */
        eep_wdata.format = rx_format;
        /* 受信データ一時保持       */
        memcpy(&eep_wdata.data, &rcv_data, sizeof(rcv_data));
        /* EEPROM 書込み先取得      */
        eep_offset = (key_code * EEPROM_DATA_SIZE);
        /* FormatをEEPROMへ書込み   */
        EEPROM_WRITE(eep_offset, eep_wdata.format);
        /* 書込んだ分オフセット移動 */
        eep_offset++;
        /* DataCodeをEEPROMへ書込み */
        for (i=0; i < TBL_CODE_SIZE; i++) {
            /* HI-TECH C 標準関数   */
            /* 1byte ずつ書込み     */
            EEPROM_WRITE((eep_offset + i), eep_wdata.data[i]);
        }
        /* IR Data 記録後無限ループ */
        for (;;);
    }

    /****************************************************************/
    /* Dip SW 1:Hi  Dip SW 2:Lo ⇒ 学習モード (EEPROM Data 送信)    */
    /****************************************************************/
    if ((PORTA & MODE_MASK) == RUN_MODE_3) {
        /* EEPROM Data を RAM へ展開 */
        for (i = 0; i < EEPROM_TABLE_SIZE; i++) {
            eep_rdata[i] = EEPROM_READ(i);
        }

        for (;;)
        {
            /* Key Check */
            key_code = key_input_check();

            /* KEYが押されてなかったらSleepにする   */
            if (key_code == KEY_OFF) {
                /* CPU Sleep -> Key INT -> Wake Up  */
                cpu_sleep();
            }
            else {
                /* Function Key (4つ) のみ対応      */
                if (key_code <= KEY_CODE04) {
                    /* Key に対応したRAM読込先取得  */
                    eep_offset = (key_code * EEPROM_DATA_SIZE);
                    /* Data存在する場合のみ送信     */
                    if ((eep_rdata[eep_offset] == FORM_NEC) ||
                        (eep_rdata[eep_offset] == FORM_KDN)) {
                        /* 送信中 -> 対応したLED On */
                        led_control((LED_MASK << key_code));
                        /* フォーマット -> NEC      */
                        if (eep_rdata[eep_offset] == FORM_NEC) {
                            /* Keyに対応したDataを  */
                            /* NEC formatで送信     */
                            /* 読込んだ分オフセット移動 */
                            eep_offset++;
                            IR_NEC_format((unsigned char*)&eep_rdata[eep_offset]);
                        }
                        /* フォーマット -> 家電協   */
                        else {
                            /* Keyに対応したDataを  */
                            /* 家電協 formatで送信  */
                            /* 読込んだ分オフセット移動 */
                            eep_offset++;
                            IR_KDN_format((unsigned char*)&eep_rdata[eep_offset]);
                        }
                        /* 送信終了 -> LED Off      */
                        led_control(ALL_OFF);
                    }
                }
            }
        }
    }
    /****************************************************************/
    /* Dip SW 1:Lo  Dip SW 2:Lo ⇒ LCD表示モード                   */
	/* このモードがmainの役目を果たす                              */
    /****************************************************************/
    if ((PORTA & MODE_MASK) == RUN_MODE_4) {
        /* LCD Initialize       */
        lcd_init();
        /* IR 比較データ初期化  */
        memset(&pre_data, 0x00, sizeof(pre_data));
        for (;;)
        {
            /* IR受信 */
            ir_state = ir_recieve();

        	
        	/*以下がmotion controlを制御するpart  masa */
        	switch(rcv_data[5]){
        	case FORWARD:
        		motion_control(MOVE_FORWARD);
        		break;
        	case BACKWARD:
        		motion_control(MOVE_BACKWARD);
        		break;
        	case STOP:
        		motion_control(MOVE_STOP);
        		break;
        	case LEFT:
        		motion_control(MOVE_LEFT);
        		break;
        	case RIGHT:
        		motion_control(MOVE_RIGHT);
        		break;
        	}
        	/* ここまで   masa  */
        	
        	
        	/* 受信データと比較データが異なる場合のみ表示を更新         */
//            if ((memcmp(&pre_data, &rcv_data, sizeof(rcv_data))) != 0) {    /* comment out 開放 masa  */
            if ((memcmp(&pre_data, &rcv_data, sizeof(rcv_data))) != 0) {
                if (ir_state == SUCCESS) {
                    lcd_clear();                    /* LCD All Clear        */
                    lcd_put_ir_format(rx_format);   /* IR format Type 表示  */
                    switch (rx_format) {
                      case FORM_NEC:        /* 受信コード = NEC format      */
                        /* NEC format の IR 受信データ表示                  */
                        lcd_put_ir_data(&rcv_data, FORMAT_DISP_SIZE_NEC);
                        break;
                      case FORM_KDN:        /* 受信コード = 家電協 format   */
                        /* 家電協 format の IR 受信データ表示               */
                        lcd_put_ir_data(&rcv_data, FORMAT_DISP_SIZE_KDN);
                        break;
                      default:              /* 受信コード = 未対応 format   */
                        break;
                    }
                } else if (ir_state == UNKNOWN) {
                    /* 未対応 format の IR 受信データ表示               */
                    lcd_clear();                    /* LCD All Clear        */
                    lcd_put_ir_format(FORM_UKN);   /* IR format Type 表示  */
//                    lcd_put_ir_data(&rcv_data, FORMAT_DISP_SIZE_UKN);
                } else {
                    ;   /* ノイズの為、もう一度受信処理 */
                }
                /* IR 比較データ保持 */
                memcpy(&pre_data, &rcv_data, sizeof(rcv_data));
            }
        }
    }
}