본문 바로가기

Cadence Certificate Specialist/AVR

AVR ATmega128A 를 이용한 신호등 동작 구현 - 2 -


신호완성2가지경우로완성 고승완.zip





#define F_CPU 16000000UL  // 16Mhz에서 동작하는 ATmega128A를 실제시간으로 동작을 맞추기 위해 사용

#include <avr/io.h>

#include <util/delay.h>



#define LED_SEL1 (*(volatile unsigned char*)0xA000) //0xA000 -> LED(0~7)를 가리키는 주소

#define LED_SEL2 (*(volatile unsigned char*)0xB000) //0xB000 -> LED(8~15)를 가리키는 주소



unsigned char led1=0x00, led2=0x00;   // 양수범위로 지정하기 위해서 사용


void io_init(void) //입력, 출력 초기화시키는 함수

{

MCUCR|=(1<<SRE)|(1<<SRW10);

XMCRA|=(1<<SRL2)|(0<<SRL1)|(0<<SRL0)|

(1<<SRW01)|(1<<SRW00)|(1<<SRW11);

XMCRB|0x00;

}



// ------------------------------------------------------------------------------트래픽2 함수

void traffic2 (char a, char b)  //트래픽2 a=위치, b=온오프

{

if(a==25&b==1) led2 |=0x24;    //16진수임  // 2진수로 나타내면 0b00100100

else    led2 &=~0x24;   //16진수임  // 2진수로 나타내면 0b00100100

if(a==26&b==1) led2 |=0x18;    //16진수임  // 2진수로 나타내면 0b00011000

else    led2 &=~0x18;   //16진수임  // 2진수로 나타내면 0b00011000

LED_SEL2=~led2; // 회로도에서 신호가 0이 되어야지 LED에 불이 켜지므로 인버팅 시켜주는 것임.

}



// ------------------------------------------------------------------------------트래픽3 함수

void traffic3 (char a, char b)  //트래픽3(LED 3개짜리) ON OFF 지정하는 함수 // 3개짜리 2세트


{

if(a==21)

{

if(b==1)

{

led1 |=0xc0;   //16진수임  // 2진수로 나타내면 0b11000000

}

else led1 &=~0xc0;  //16진수임  // 2진수로 나타내면 0b11000000

}

if(a==20)

{

if(b==1)

{

led1 |=0x20;   //16진수임  // 2진수로 나타내면 0b00100000

led2 |=0x01;   //16진수임  // 2진수로 나타내면 0b00100000

}

else

{

led1 &=~0x20;   //16진수임  // 2진수로 나타내면 0b00100000

led2 &=~0x01;   //16진수임  // 2진수로 나타내면 0b00100000

}

}

if(a==19)

{

if(b==1)

{

led1 |=0x10;    //16진수임  // 2진수로 나타내면 0b00010000

led2 |=0x02;    //16진수임  // 2진수로 나타내면 0b00000010

}

else

{

led1 &=~0x10;   //16진수임  // 2진수로 나타내면 0b00010000

led2 &=~0x02;   //16진수임  // 2진수로 나타내면 0b00000010

}

}

LED_SEL1=~led1;

LED_SEL2=~led2;

}




// ------------------------------------------------------------------------------트래픽4 함수

void traffic4 (char a, char b) // 트래픽4(LED 4개짜리) ON OFF 지정하는 함수

{

if(a==15&b==1) led1 |=0x01;  //16진수임  // 2진수로 나타내면 0b00000001

else    led1 &=~0x01; //16진수임  // 2진수로 나타내면 0b00000001

if(a==16&b==1) led1 |=0x02;  //16진수임  // 2진수로 나타내면 0b00000010

else    led1 &=~0x02; //16진수임  // 2진수로 나타내면 0b00000010

if(a==17)

{ if(b==1)

{

led1 |=0x04;

}  //16진수임  // 2진수로 나타내면 0b00000100

else    led1 &=~0x04;

} //16진수임  // 2진수로 나타내면 0b00000100

if(a==18)

{

if(b==1)

{

led1 |=0x08;

}  //16진수임  // 2진수로 나타내면 0b00001000

else    led1 &=~0x08; //16진수임  // 2진수로 나타내면 0b00001000

}

LED_SEL1=~led1; // 회로도에서 신호가 0이 되어야지 LED에 불이 켜지므로 인버팅 시켜주는 것임.

}






/* ------------------------------------------------------------------------------------------------

여기까지가 함수를 정의하는 부분이고, 아래쪽은 정의한 함수를 이용한 동작구현하기


1.청신호 각방향 10초

2.노란신호 2초

3.보행신호 마지막 3초 점멸시키기

*/



//동작 구현하기


int main(void)

{

int i;

io_init();

LED_SEL1=~led1; //led1 변수정의

LED_SEL2=~led2; //led2 변수정의

while(1)

{

traffic2(25,1);         //트래픽2(보행신호)   빨간불

traffic3(21,1);         //트래픽3(차량신호)   빨간불

traffic4(17,1);         //트래픽4(삼거리신호) 초록불,왼쪽불

traffic4(18,1);         //트래픽4(삼거리신호) 초록불,왼쪽불

_delay_ms(8000);        //초록불 유지시간 8초

traffic4(17,0);     //트래픽4(보행신호)   초록불오프

traffic4(18,0);     //트래픽4(보행신호)   초록불오프

traffic4(16,1);     //트래픽4(삼거리신호) 노란불

_delay_ms(2000);       //노란불 유지시간 2초

//----------------------------------------------------------------------------

traffic4(16,0);     //트래픽4(삼거리신호) 노란불오프

traffic2(26,1);         //트래픽2(보행신호)   초록불

traffic3(21,0);         //트래픽3(차량신호)   빨간불

traffic3(19,1);       //트래픽3(차량신호)   초록불

traffic4(15,1);     //트래픽4(삼거리신호) 빨간불

_delay_ms(7000);       //초록불 유지시간 (10-3=7) 7 초



//---------------------------------------------------------------------------- 트래픽2 1초 초록불 점멸(주기 0.5초) 동작


traffic2(26,0);         //트래픽2(보행신호)   초록불꺼짐

traffic3(19,1);       //트래픽3(차량신호)   초록불

traffic4(15,1);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);        //초록불 유지시간 0.25 초


traffic2(26,1);         //트래픽2(보행신호)   초록불꺼짐

traffic3(19,1);       //트래픽3(차량신호)   초록불

traffic4(15,1);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);        //초록불 유지시간 0.25 초

traffic2(26,0);         //트래픽2(보행신호)   초록불꺼짐

traffic3(19,1);       //트래픽3(차량신호)   초록불

traffic4(15,1);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);        //초록불 유지시간 0.25 초


traffic2(26,1);         //트래픽2(보행신호)   초록불꺼짐

traffic3(19,1);       //트래픽3(차량신호)   초록불

traffic4(15,1);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);        //초록불 유지시간 0.25 초


//---------------------------------------------------------------------------- 노란불ON & 초록불2초 점멸

traffic3(19,0);       //트래픽3(차량신호)   초록불

traffic3(20,1);       //노란불

for(i=0; i<3; i++)     //------------------------------------------------------보행 2초 깜빡

{

traffic2(26,0);         //트래픽2(보행신호)   초록불꺼짐

traffic3(19,0);       //트래픽3(차량신호)   초록불

traffic4(15,1);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);        //초록불 유지시간 0.25 초


traffic2(26,1);         //트래픽2(보행신호)   초록불꺼짐

traffic3(19,0);       //트래픽3(차량신호)   초록불

traffic4(15,1);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);        //초록불 유지시간 0.25 초

}

traffic3(20,0);       //노란불

}

return 0;

}



'Cadence Certificate Specialist > AVR' 카테고리의 다른 글

각각의 FND 숫자 표시  (0) 2014.06.18
7SEGMENT를 이용한 숫자 이동  (0) 2014.06.17
ATmega128 Datasheet /AVR KIT  (0) 2014.06.15