#include <avr/io.h>
void _delay_ms(unsigned int m)
{
// 스텝모터의 펄스 크기값
unsigned int i,j;
for(i=0;i<m;i++)
for(j=0;j<1200;j++);
}
// 스텝모터 정방향으로 회전 하기 위한 위상값
void rotation()
{unsigned int j=1;
PORTB = 0x60;
_delay_ms(j);
PORTB = 0x20;
_delay_ms(j);
PORTB = 0x30;
_delay_ms(j);
PORTB = 0x10;
_delay_ms(j);
PORTB = 0x90;
_delay_ms(j);
PORTB = 0x80;
_delay_ms(j);
PORTB = 0xC0;
_delay_ms(j);
PORTB = 0x40;
_delay_ms(j);
}
// 스텝모터 역방향으로 회전 하기 위한 위상값
void rerotation()
{unsigned int j=1;
PORTB = 0x40;
_delay_ms(j);
PORTB = 0xC0;
_delay_ms(j);
PORTB = 0x80;
_delay_ms(j);
PORTB = 0x90;
_delay_ms(j);
PORTB = 0x10;
_delay_ms(j);
PORTB = 0x30;
_delay_ms(j);
PORTB = 0x20;
_delay_ms(j);
PORTB = 0x60;
_delay_ms(j);
}
int main(void)
{
unsigned int r=0;
DDRB = 0xFF; // 포트 B 출력핀으로 지정
DDRD = 0x00; // 포트 D 입력핀으로 지정
DDRF = 0X00; // 포트 F 입력핀으로 지정
PORTB = 0x00; // 포트 B 초기화
PORTD = 0X00; // 포트 D 초기화
PORTF = 0X00; // 포트 F 초기화
_delay_ms(100);
while(1)
{
// OPEN 스위가 눌리거나 적외선 센서에 물체가 감지되면 ( 포트D와 F에 값이 들어오면)
if((PIND & 0X04)==4||(PINF & 0X02)==2)
{
while((PIND & 0X08)==0)
{
// OPEN 스위치가 눌린후 STOP 스위치가 눌릴때 까지 스텝모터 회전수 카운팅이 됨
// _delay_ms의 내부함수를 통해 I값을 상승시키고 그것을 받아 r값을 세고 있는다.
// D포트에 신호가 들어와서 (PIND & 0X08)==8이 되면 이 while구문은 실행이 되지
// 않고 그동안 r값이 상승하엿기 때문에 아래 while구문이 실행되고 된다.
rotation();
r++;
}
// 문이 열린후 대기 시간
_delay_ms(2000);
// 카운팅한 r값이 0이 될 때까지 스텝모터 회전수를 역방향으로 회전하여 문을 닫음
while(r>0 )
{
r--;
rerotation();
}
}
}
}
----------------------------------------------------------------------------------------------------
#include <avr/io.h>
#define SENSER (PIND & 0X04)==4
#define OPEN (PINF & 0X02)==2
#define STOP (PIND & 0X08)==0
void _delay_ms(unsigned int m)
{
// 스텝모터의 펄스 크기값
unsigned int i,j;
for(i=0;i<m;i++)
for(j=0;j<1200;j++);
}
// 스텝모터 정방향으로 회전 하기 위한 위상값
void rotation(){
unsigned char data[8] = {0x08, 0x0b, 0x04, 0x06, 0x02, 0x03, 0x01, 0x09};
unsigned int j=1 ;
for(j=0; j<1; j++){
PORTB = data[j];
_delay_ms(j);
}
}
}
// 스텝모터 역방향으로 회전 하기 위한 위상값
void rerotation(){
unsigned char data[8] = {0x09, 0x01, 0x03, 0x02, 0x06, 0x04, 0x0b, 0x08};
unsigned int j=1 ;
for(j=0; j<1; j++){
PORTB = data[j];
_delay_ms(j);
}
}
int main(void)
{
unsigned int r=0;
DDRB = 0xFF; // 포트 B 출력핀으로 지정
DDRD = 0x00; // 포트 D 입력핀으로 지정
DDRF = 0X00; // 포트 F 입력핀으로 지정
PORTB = 0x00; // 포트 B 초기화
PORTD = 0X00; // 포트 D 초기화
PORTF = 0X00; // 포트 F 초기화
_delay_ms(100);
while(1)
{
// OPEN 스위가 눌리거나 적외선 센서에 물체가 감지되면 ( 포트D와 F에 값이 들어오면)
if((SENSER) || (OPEN)
{
while(STOP)
{
// OPEN 스위치가 눌린후 STOP 스위치가 눌릴때 까지 스텝모터 회전수 카운팅이 됨
// _delay_ms의 내부함수를 통해 I값을 상승시키고 그것을 받아 r값을 세고 있는다.
// D포트에 신호가 들어와서 (PIND & 0X08)==8이 되면 이 while구문은 실행이 되지
// 않고 그동안 r값이 상승하엿기 때문에 아래 while구문이 실행되고 된다.
rotation();
r++;
}
// 문이 열린후 대기 시간 2초
_delay_ms(2000);
// 카운팅한 r값이 0이 될 때까지 스텝모터 회전수를 역방향으로 회전하여 문을 닫음
while(r>0 )
{
r--;
rerotation();
}
}
}
}
위코드를 아래 코드로 수정해봤는데 for문을 제대로 옮겼는지 define으로 정의하는게 제대로 한건지좀 봐주실수 있으세요 ?감사합니다.
좋아하는것을 해주는것보다 싫어하는것을 하지말자.
http://jspstudy.co.kr/
2012 7 27 일
저도 저보다 키크고 손크고 남자답고 깔끔한손과 얼굴
조용한바다
[박준혁]님의 과학기술인등록번호는 1113 1093 입니다.
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.