みなさん、こんにちは。
ケロタン少佐デあります・・・(^_^)ヾ
今日は・・・
ちょびっと蔵出しを・・・
以前、作っていたドアミラー自動格納プログラムに
バック連動昇降機能を追加したハイブリッド版の紹介デあります♪
『ドアミラー自動格納・昇降制御 プログラム (M・A・C)』
【C言語ソース(AVR)】
(一部抜粋)
/*****************************************************************************
AVR Studio 4 C言語用 Ver1.2(ATtiny2313用) 2008.8.6
ドアミラー自動格納・昇降制御 プログラム (M・A・C)
Program Name : mirror-auto-close-ver1.2.c
Version : 1.2
Language : AVR C言語 (WinAVR)
Device : ATtiny2313
Clock : 1MHz(内蔵RC発振)
Author : ケロタン少佐
******************************************************************************
I/O
RESET,PA2 | 1****20| VCC
RXD,PD0 | 2****19| PB7
TXD,PD1 | 3****18| PB6
XTAL2,PA1 | 4****17| PB5
XTAL1,PA0 | 5****16| PB4
INT0,PD2 | 6****15| PB3
INT1,PD3 | 7****14| PB2
T0,PD4 | 8****13| PB1
T1,PD5 | 9****12| PB0
GND |10****11| PD6,ICP
PA0 ; XTAL1 ;
PA1 ; XTAL2 ;
PA2 ; RESET ; 入力 ; L ; 内部プルアップ,立下り検出-
PB0 ; ; 出力 ; H ; mirror_close
PB1 ; ; 出力 ; H ; mirror_open
PB2 ; ; 出力 ; H ; mirror_down
PB3 ; ; 出力 ; H ; mirror_up
PB4 ; ; 入力 ; L ; LOCK
PB5 ; ; 入力 ; L ; KEY
PB6 ; ; 入力 ; L ; IGN
PB7 ; ; 入力 ; L ; BACK
PD0 ; RXD ; 出力 ; H ; status-LED01(green)
PD1 ; TXD ; 出力 ; H ; status-LED02(red)
PD2 ; INT0 ; 出力 ; H ; status-LED03(red)
PD3 ; INT1 ; 出力 ; H ;
PD4 ; T0 ; 出力 ; H ;
PD5 ; T1 ; 出力 ; H ;
PD6 ; ICP ; 出力 ; H ; power_active
******************************************************************************
動作仕様
1.IGNがONでドアミラーがオープン
2.IGNがOFFかつドアロックにてドアミラーがクローズ
3.シフトがバックにて、ドアミラーがダウン
4.シフトがバック以外にて、ドアミラーがアップ
5.純正手動スイッチと共存
**************************************************************************** */
#include
#define T 5 //wait関数の基礎値(1MHz)
#define PINB4 LOCK // 0:有り 1:無し
#define PINB5 KEY // 0:有り 1:無し
#define PINB6 IGN // 0:有り 1:無し
#define PINB7 BACK // 0:有り 1:無し
/*****************************************************************************
**** グローバル変数 */
unsigned char mirr_status = 0; // 0:閉 1:開 2:下げ 3:上げ
unsigned char power_active = 0; // 0:電力供給無し 1:電力供給有り
unsigned char lock_status = 1; // 0:lock 1:unlock
/*****************************************************************************
**** プロトタイプ宣言 */
void mirror_close(); // ミラー閉-動作
void mirror_open(); // ミラー開-動作
void mirror_down(); // ミラー下げ-動作
void mirror_up(); // ミラー上げ-動作
void power_on(); // 電力供給
void power_off(); // 電力遮断
void wait_100us(); //
void wait_1ms(); //
void wait_10ms(); //
void wait_1s(); //
/*****************************************************************************
**** メイン */
int main( void ) {
//初期化
PORTA = 0b00000100; // bit2のプルアップを有効に設定
DDRA = 0b00000011; // bit2のみ入力に設定
PORTB = 0b11110000; // bit7-4のプルアップを有効に設定
DDRB = 0b00001111; // bit7-4を入力に設定
PORTD = 0b00000000; // 初期値0に設定
DDRD = 0b11111111; // 全出力に設定
mirr_status = 0; // ミラーモード初期値0
power_active = 0; // 電力モード初期値0
lock_status = 1; // ロックモード初期値1
//メインループ
while(1) {
PORTD ^= _BV(0); // 排他的論理和 PD0を反転
lock_status = PINB4 //
//ミラーが下がっている状態
if(mirr_status == 2){ // ミラー上がっている状態
if((IGN == 0) && (BACK == 1)){ // IGN =有 & BACK =有
power_on(); //
mirror_up(); // ミラー上がる
power_off(); //
}
}
//ミラーが開いている状態
if(mirr_status == 1){ // ミラー開いた状態
if((IGN == 1) && (lock_status == 0)){ // IGN =無 & LOCK =有
power_on(); //
mirror_close(); // ミラー閉じる
power_off(); //
}
if((IGN == 0) && (BACK == 0)){ // IGN =有 & BACK =有
power_on(); //
mirror_down(); // ミラー下がる
power_off(); //
}
}
//ミラーが閉じている状態
if(mirr_status == 0) { // ミラー閉じた状態
if(PINB6 == 0){ // IGN =有
power_on(); //
mirror_open(); //
power_off(); //
}
}
wait_10ms(); // 10ms待ち
}
}
/*****************************************************************************
**** wait */
void wait_100us(){
uint8_t i;
for(i=0;i<T;i++);
}
void wait_1ms(){
uint8_t i;
for(i=0;i<10;i++) t_100us();
}
void wait_10ms(){
uint8_t i;
for(i=0;i<100;i++) t_100us();
}
void wait_1s(){
uint8_t i;
for(i=0;i<100;i++) t_10ms();
}
/*****************************************************************************
**** ミラー閉-動作 */
void mirror_close(){
PORTD |= _BV(1); // PD1=1,動作LED(red)点灯
PORTB |= _BV(0); // PB0=1,ミラー閉-動作開始
wait_1s(); // 1s待ち
wait_1s(); // 1s待ち
wait_1s(); // 1s待ち
wait_1s(); // 1s待ち
wait_1s(); // 1s待ち;5s
PORTB &= ~_BV(0); // PB0=0,ミラー閉-動作終了
mirr_status = 0; // ミラーモード ← 0 ;閉
PORTD &= ~_BV(1); // PD1=0,動作LED(red)消灯
}
/*****************************************************************************
**** ミラー開-動作 */
void mirror_open(){
PORTD |= _BV(1); // PD1=1,動作LED(red)点灯
PORTB |= _BV(1); // PB1=1,ミラー開-動作開始
wait_1s(); // 1s待ち
wait_1s(); // 1s待ち
wait_1s(); // 1s待ち
wait_1s(); // 1s待ち
wait_1s(); // 1s待ち;5s
PORTB &= ~_BV(1); // PB1=0,ミラー開-動作終了
mirr_status = 1; // ミラーモード ← 1 ;開
PORTD &= ~_BV(1); // PD1=0,動作LED(red)消灯
}
/*****************************************************************************
**** ミラー下げ-動作 */
void mirror_down(){
PORTD |= _BV(1); // PD1=1,動作LED(red)点灯
PORTB |= _BV(2); // PB2=1,ミラー下げ-動作開始
wait_1s(); // 1s待ち
wait_1s(); // 1s待ち
wait_1s(); // 1s待ち;3s
PORTB &= ~_BV(2); // PB2=0,ミラー下げ-動作終了
mirr_status = 2; // ミラーモード ← 2 ;下げ
PORTD &= ~_BV(1); // PD1=0,動作LED(red)消灯
}
/*****************************************************************************
**** ミラー上げ-動作 */
void mirror_upn(){
PORTD |= _BV(1); // PD1=1,動作LED(red)点灯
PORTB |= _BV(3); // PB3=1,ミラー上げ-動作開始
wait_1s(); // 1s待ち
wait_1s(); // 1s待ち
wait_1s(); // 1s待ち;3s
PORTB &= ~_BV(3); // PB3=0,ミラー上げ-動作終了
mirr_status = 1; // ミラーモード ← 1 ;開
PORTD &= ~_BV(1); // PD1=0,動作LED(red)消灯
}
/*****************************************************************************
**** 電力供給 */
void power_on(){
PORTD |= _BV(2); // PD2=1,状態LED(red)点灯
power_active = 1; // 電力ステータス ← 1
PORTB |= _BV(0); // PB0=1,電力供給開始
}
/*********************************************************************************
******* 電力遮断 */
void power_off(){
PORTB &= ~_BV(0); // PB0=0,電力供給終了
power_active = 0; // 電力ステータス ← 0
PORTD &= ~_BV(2); // PD2=0,状態LED(red)消灯
}
/*****************************************************************************
**** END */
Posted at 2008/08/06 15:12:51 | |
トラックバック(0) |
プログラミング | 日記