BASIC4MCU | 질문게시판 | atmega128 atmel studio 코드 질문드립니다
페이지 정보
작성자 비공개 작성일2018-06-04 16:20 조회8,819회 댓글1건본문
#define IN1 PB7
// (IN1 IN2) = (H L)-->CW, (IN1 IN2)= (L H)--> CCW
#define IN2 PB6 //(IN1 IN2)= (H H) or (L L)--> STOP
#define IN3 PB5
// (IN3 IN4) = (H L)-->CW, (IN3 IN4)= (L H)--> CCW
#define IN4 PB4 //(IN3 IN4)= (H H) or (L L)--> STOP
#define Use_IE0_Interrupt (EIMSK |= (1<<INT0))
#define IE0_Detect_Falling (EICRA |= (1<<ISC01))
#define IE0_Detect_Rising (EICRA = (1<<ISC01) | (1<<ISC00))
#define Use_IE1_Interrupt (EIMSK |= (1<<INT1)) //인터럽트1 활성화
#define IE1_Detect_Falling (EICRA = (1<<ISC11)) //인터럽트1 하강엣지
#define IE1_Detect_Rising (EICRA = (1<<ISC11) | (1<<ISC10)) //인터럽트1 상승엣지
#define Use_IE2_Interrupt (EIMSK |= (1<<INT2)) //인터럽트2 활성화
#define IE2_Detect_Falling (EICRA = (1<<ISC21)) //인터럽트2 하강엣지
#define IE2_Detect_Rising (EICRA = (1<<ISC21) | (1<<ISC20)) //인터럽트2 상승엣지
#define Use_IE7_Interrupt (EIMSK |= (1<<INT7)) //인터럽트2 활성화
#define IE7_Detect_Falling (EICRA = (1<<ISC71)) //인터럽트2 하강엣지
#define IE7_Detect_Rising (EICRA = (1<<ISC71) | (1<<ISC70)) //인터럽트2 상승엣지
#define Use_IE4_Interrupt (EIMSK |= (1<<INT4)) //인터럽트4 활성화
#define IE4_Detect_Falling (EICRB = (1<<ISC41)) //인터럽트4 하강엣지
#define IE4_Detect_Rising (EICRB = (1<<ISC41) | (1<<ISC40)) //인터럽트4 상승엣지
#define TC0_PRESCALE_32 (1<<CS00 | 1<<CS01)
#define TC0_FAST_PWM (1<<WGM00| 1<<WGM01)
#define TC0_NONINVERT_PWM (1<<COM01)
void initial(void);
unsigned char num[4];
unsigned char vel, i, j, speed;volatile unsigned int tick = 0;
int state = 1;
void disp_digit(unsigned char num, unsigned char d);void movement0();
void movement1();
void movement2();
void movement3();
void movement4();
void movement5();
void movement6();
void movement7();
void movement8();
void movement9();
void stop();unsigned char digit[10] = {0x77, 0x41, 0x3B, 0x5B, 0x4D,
0x5e, 0x7c, 0x43, 0x7f, 0x4f};ISR(TIMER0_OVF_vect) {
tick++; // 0~125;
TCNT0=131;
}ISR(INT0_vect)
{
if ((EICRA & (1<<ISC00)) ==0) // 인터럽트 하강엣지가 검출되엇을 경우
{
num[0] ++;
_delay_ms(120);
if(num[0] == 10) num[0] = 0;
}
}
ISR(INT1_vect)
{
if ((EICRA & (1<<ISC10)) ==0) // 인터럽트 하강엣지가 검출되엇을 경우
{
num[1] ++;
_delay_ms(120);
if(num[1] == 10) num[1] = 0;
}
}ISR(INT2_vect)
{
if ((EICRA & (1<<ISC20)) ==0) // 인터럽트 하강엣지가 검출되엇을 경우
{
num[2] ++;
_delay_ms(120);
if(num[2] == 10) num[2] = 0;
}
}
ISR(INT7_vect)
{
if ((EICRA & (1<<ISC70)) ==0) // 인터럽트 하강엣지가 검출되엇을 경우
{
num[3] ++;
_delay_ms(120);
if(num[3] == 10) num[3] = 0;
}
}ISR(INT4_vect)
{
state = 2;
}
int main(void) {
initial ();
vel = 50;
num[0] = 0;
num[1] = 0;
num[2] = 0;
num[3] = 0;
while(1){
if(state == 1)
{
for (int i=0; i<4; i++)
{
disp_digit(num[i],i);
_delay_ms(1);
if(i%2 == 0) _delay_ms(1);
}
}
if(state == 2) break;
}
for (i=0; i<4; i++)
{
disp_digit(num[i],i);
_delay_ms(1);
if(i%2 == 0) _delay_ms(1);
}
for(i=0 ; i<4 ; i++)
{
if(num[i] == 0) movement0();
if(num[i] == 1) movement1();
if(num[i] == 2) movement2();
if(num[i] == 3) movement3();
if(num[i] == 4) movement4();
if(num[i] == 5) movement5();
if(num[i] == 6) movement6();
if(num[i] == 7) movement7();
if(num[i] == 8) movement8();
if(num[i] == 9) movement9();
if(i==3) stop();
}
}
void initial (){
DDRB=0x00;
DDRC=0xff;
DDRD=0x00;
DDRE=0x00;
DDRA=0x0f;
Use_IE0_Interrupt;
IE0_Detect_Falling;
Use_IE1_Interrupt;
IE1_Detect_Falling;
Use_IE2_Interrupt;
IE2_Detect_Falling;
Use_IE7_Interrupt;
IE7_Detect_Falling;
Use_IE4_Interrupt;
IE4_Detect_Falling;
sei();TCCR0 |= TC0_FAST_PWM | TC0_NONINVERT_PWM
| TC0_PRESCALE_32; //PRESCALE 32
TIMSK |= 1<<TOIE0;
}void disp_digit(unsigned char num, unsigned char d){
PORTC = digit[num];
PORTA = 0x01<<d;
}void movement0(){
PORTB|=(1<<IN1);
PORTB&=~(1<<IN2);
OCR0=255-vel;
PORTB|=(1<<IN3);
PORTB&=~(1<<IN4);
OCR0=255-vel;
_delay_ms(2000);
}
void movement1(){
PORTB &=~(1<<IN1);
PORTB|=(1<<IN2);
OCR0=vel;
PORTB &=~(1<<IN3);
PORTB|=(1<<IN4);
OCR0=vel;
_delay_ms(2000);
}
void movement2(){
PORTB|=(1<<IN1);
PORTB&=~(1<<IN2);
OCR0=255-vel;
PORTB|=(1<<IN3);
PORTB&=~(1<<IN4);
OCR0=255-vel;
_delay_ms(2000);}
void movement3(){
PORTB &=~(1<<IN1);
PORTB|=(1<<IN2);
OCR0=vel;
PORTB &=~(1<<IN3);
PORTB|=(1<<IN4);
OCR0=vel;
_delay_ms(2000);
}
void movement4(){
PORTB|=(1<<IN1);
PORTB&=~(1<<IN2);
OCR0=255-vel;
PORTB|=(1<<IN3);
PORTB&=~(1<<IN4);
OCR0=255-vel;
_delay_ms(2000);
}
void movement5(){
PORTB &=~(1<<IN1);
PORTB|=(1<<IN2);
OCR0=vel;
PORTB &=~(1<<IN3);
PORTB|=(1<<IN4);
OCR0=vel;
_delay_ms(2000);
}
void movement6(){
PORTB|=(1<<IN1);
PORTB&=~(1<<IN2);
OCR0=255-vel;
PORTB|=(1<<IN3);
PORTB&=~(1<<IN4);
OCR0=255-vel;
_delay_ms(2000);
}
void movement7(){
PORTB &=~(1<<IN1);
PORTB|=(1<<IN2);
OCR0=vel;
PORTB &=~(1<<IN3);
PORTB|=(1<<IN4);
OCR0=vel;
_delay_ms(2000);
}
void movement8(){
PORTB|=(1<<IN1);
PORTB&=~(1<<IN2);
OCR0=255-vel;
PORTB|=(1<<IN3);
PORTB&=~(1<<IN4);
OCR0=255-vel;
_delay_ms(2000);
}
void movement9(){
PORTB &=~(1<<IN1);
PORTB|=(1<<IN2);
OCR0=vel;
PORTB &=~(1<<IN3);
PORTB|=(1<<IN4);
OCR0=vel;
_delay_ms(2000);
}void stop () {
PORTB&=~(1<<IN1);
PORTB&=~(1<<IN2);
OCR0=0;
PORTB&=~(1<<IN3);
PORTB&=~(1<<IN4);
OCR0=0;
}정말 이 분야에 대해 무지해서 그런대 혹시 코드를 문단마다 짤라서 자세히 어떤역학을 하는지설명해주실 수 있나요.. 부탁드립니다.
댓글 1
조회수 8,819master님의 댓글
master 작성일
http://cafe.naver.com/circuitsmanual/207383
질문과 조금 다른 부분이 있지만 이 글 참고해서 공부해보세요
답변에 여러가지 내용의 기초적인 글들의 링크가 있습니다.