BASIC4MCU | 질문게시판 | ATMEGA 코드에 오류가 있을까요?
페이지 정보
작성자 skanl 작성일2022-06-15 18:04 조회320회 댓글0건본문
#include <mega16.h>
#include <delay.h>
#define SW1 PINA.7
#define SW2 PINA.6
#define SW3 PINA.5
#define SW4 PIND.7
#define SD PINA.4
#define SC PINA.3
#define SB PINA.2
#define SA PINA.1
#define H PINC.7
#define G PINC.6
#define F PINC.5
#define E PINC.4
#define D PINC.3
#define C PINC.2
#define B PINC.1
#define A PINC.0
#define FB PORTB.7
#define FA PORTB.6
#define IN2 PORTB.5
#define IN1 PORTB.4
#define SCK PORTB.2
#define RCK PORTB.1
#define SER PORTB.0
#define reset PORTA.0
#define SCK2 PORTD.5
#define RCK2 PORTD.4
#define SER2 PORTD.2
void shiftout(unsigned char num)
{
unsigned char maski,i;
maski=0x80; //maski=10000000
i=8;
while(i)
{
if(num&maski) {SER=1;}
else{SER=0;}
SCK=1;SCK=0;
maski>>=1;
i--;
}
}
void shiftout2(unsigned char num)
{
unsigned char maski,i;
maski=0x80; //maski=10000000
i=8;
while(i)
{
if(num&maski) {SER2=1;}
else{SER2=0;}
SCK2=1;SCK2=0;
maski>>=1;
i--;
}
}
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
delay_ms(50);
}
void main(void){
//cf=current floor, tf=target floor, df=delta floor
unsigned char cf, tf, df, s, k, n, n1, n10, ibcd;
DDRA=0x01; PORTA=0x00; DDRB=0xff; PORTB=0x80;
DDRC=0x00; PORTC=0x00; DDRD=0x34; PORTD=0x00;
TCCR0=(1<<WGM00) | (1<<COM01) | (0<<COM00) | (1<<WGM01) | (0<<CS02) | (1<<CS01) | (1<<CS00);
TCNT0=0x00;
OCR0=0x00;
GICR|=(0<<INT1) | (1<<INT0) | (0<<INT2);
MCUCR=(0<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00);
MCUCSR=(0<<ISC2);
GIFR=(0<<INTF1) | (1<<INTF0) | (0<<INTF2);
cf=1; //프로그램 내부적으로 현재층=1층으로 설정
tf=1; //프로그램 내부적으로 목표층=1층으로 설정
FB=0;FA=1; //세븐세그먼트에 현재층 1층 표시
IN1=0;IN2=0; //motor break
reset=1;reset=0; //카운터 reset
shiftout(0x37);//두 자리 세븐세그먼트에 카운터값 37로 표시
RCK=1;RCK=0;
k=0; //while(k) deactivated
if(SW4==0)
{ ibcd = 0x41;
shiftout2(ibcd);
RCK2=1; RCK2=0;
while (1)
{
//target floor setting
if(SW1==0)
{
tf=1;
if(SW4==0)
{
ibcd = 0x59;
shiftout2(ibcd);
RCK2=1; RCK2=0;
}
}
if(SW2==0)
{
tf=2;
if(SW4==0)
{
ibcd = 0x59;
shiftout2(ibcd);
RCK2=1; RCK2=0;
}
}
if(SW3==0)
{
tf=3;
if(SW4==0)
{
ibcd = 0x59;
shiftout2(ibcd);
RCK2=1; RCK2=0;
}
}
//회전량 및 회전방향 설정
if(tf>cf)
{
df=(tf-cf)*20; //한 층=20 slits, 두 층=40 slits
IN1=1;IN2=0; //모터 회전방향 CW
reset=1;reset=0; //카운터 reset
k=1; //while(k) activated
}
if(tf<cf)
{
df=(cf-tf)*20; //한 층=20 slits
IN1=0;IN2=1; //모터 회전방향 CCW
reset=1;reset=0; //카운터 reset
k=1; //while(k) activated
}
while(k)
{
//read speed value from BCD switch
s=0;
if(SA==0) s=s+1;
if(SB==0) s=s+2;
if(SC==0) s=s+4;
if(SD==0) s=s+8;
OCR0=50+s*20; //duty를 인가하여 모터회전 시작
//카운터 일의 자리 BCD값 읽음
n1=0;
if(A==1) n1=n1+1;
if(B==1) n1=n1+2;
if(C==1) n1=n1+4;
if(D==1) n1=n1+8;
//카운터 십의 자리 BCD값 읽음
n10=0;
if(E==1) n10=n10+1;
if(F==1) n10=n10+2;
if(G==1) n10=n10+4;
if(H==1) n10=n10+8;
n=n10*10+n1; //카운터값 구성
//카운터값 표시
shiftout((n/10)*16+(n%10));
RCK=1;RCK=0;
if(df-n<=0) //목표회전량이 만족되면
{
OCR0=0; //motor stop
IN1=0;IN2=0; //motor brake
k=0; //while(k) deactivated
cf=tf; //현재층=목표층
//현재층 표시
if(cf==1){FB=0;FA=1;}
if(cf==2){FB=1;FA=0;}
if(cf==3){FB=1;FA=1;}
}
} //while(k)의 끝
} //while(1)의 끝
}//if(SW4==0)의 끝
} //void main의 끝
이게 분명히 적용이 되었었는데, 갑자기 적용이 안되기 시작하네요...
SW1,2,3은 정상적으로 작동을 하는데, SW4만 작동을 하지 않습니다.
SW4가 한번 스위치를 클릭했을시 o를 나타나게 해야되고, 그 다음에는 c를 나타나도록 설게를 했는데,...
갑자기 먹통이 되어버렸네요...
왜 이럴까요?
댓글 0
조회수 320등록된 댓글이 없습니다.