AVR ATmega128A 를 이용한 신호등 동작 구현
* 동작원리
1. 청신호 각방향 10초
2. 노란신호 2초
3. 보행신호 마지막 3초 점멸시키기
STEP1
Traffic2 - 빨간불ON
Traffic3 - 빨간불ON
Traffic4 - 파란불ON
시간 8초
STEP2
Traffic2 - 빨간불ON
Traffic3 - 빨간불ON
Traffic4 - 파란불OFF, 노란불ON
시간 2초
STEP3
Traffic2 - 빨간불OFF, 파란불ON
Traffic3 - 빨간불OFF, 파란불ON
Traffic4 - 노란불OFF, 빨간불ON
시간 7초
STEP4
Traffic2 - 파란불 점멸
Traffic3 - 파란불ON
Traffic4 - 빨간불ON
시간 1초
STEP5
Traffic2 - 파란불 점멸
Traffic3 - 파란불OFF, 노란불ON
Traffic4 - 빨간불ON
시간 2초
* 코드
#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 (int RED, int GREEN) //트래픽2(LED 2개짜리) ON OFF 지정하는 함수
{
if(RED) led2 |=0x24; //16진수임 // 2진수로 나타내면 0b00100100
else led2 &=~0x24; //16진수임 // 2진수로 나타내면 0b00100100
if(GREEN) led2 |=0x18; //16진수임 // 2진수로 나타내면 0b00011000
else led2 &=~0x18; //16진수임 // 2진수로 나타내면 0b00011000
LED_SEL2=~led2; // 회로도에서 신호가 0이 되어야지 LED에 불이 켜지므로 인버팅 시켜주는 것임.
}
// ------------------------------------------------------------------------------트래픽3 함수
void traffic3 (int RED, int YELLOW, int GREEN) //트래픽3(LED 3개짜리) ON OFF 지정하는 함수 // 3개짜리 2세트
{
if(RED)
led1 |=0xc0; //16진수임 // 2진수로 나타내면 0b11000000
else
led1 &=~0xc0; //16진수임 // 2진수로 나타내면 0b11000000
if(YELLOW)
{
led1 |=0x20; //16진수임 // 2진수로 나타내면 0b00100000
led2 |=0x01; //16진수임 // 2진수로 나타내면 0b00100000
}
else
{
led1 &=~0x20; //16진수임 // 2진수로 나타내면 0b00100000
led2 &=~0x01; //16진수임 // 2진수로 나타내면 0b00100000
}
if(GREEN)
{
led1 |=0x10; //16진수임 // 2진수로 나타내면 0b00010000
led2 |=0x02; //16진수임 // 2진수로 나타내면 0b00000010
}
else
{
led1 &=~0x10; //16진수임 // 2진수로 나타내면 0b00010000
led2 &=~0x02; //16진수임 // 2진수로 나타내면 0b00000010
}
LED_SEL1=~led1; // 회로도에서 신호가 0이 되어야지 LED에 불이 켜지므로 인버팅 시켜주는 것임.
LED_SEL2=~led2; // 회로도에서 신호가 0이 되어야지 LED에 불이 켜지므로 인버팅 시켜주는 것임.
}
// ------------------------------------------------------------------------------트래픽4 함수
void traffic4 (int RED, int YELLOW, int LEFT, int GREEN) // 트래픽4(LED 4개짜리) ON OFF 지정하는 함수
{
if(RED) led1 |=0x01; //16진수임 // 2진수로 나타내면 0b00000001
else led1 &=~0x01; //16진수임 // 2진수로 나타내면 0b00000001
if(YELLOW) led1 |=0x02; //16진수임 // 2진수로 나타내면 0b00000010
else led1 &=~0x02; //16진수임 // 2진수로 나타내면 0b00000010
if(LEFT) led1 |=0x04; //16진수임 // 2진수로 나타내면 0b00000100
else led1 &=~0x04; //16진수임 // 2진수로 나타내면 0b00000100
if(GREEN) 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(1,0); //트래픽2(보행신호) 빨간불
traffic3(1,0,0); //트래픽3(차량신호) 빨간불
traffic4(0,0,1,1); //트래픽4(삼거리신호) 초록불,왼쪽불
_delay_ms(8000); //초록불 유지시간 8초
traffic2(1,0); //트래픽2(보행신호) 빨간불
traffic4(0,1,0,0); //트래픽4(삼거리신호) 노란불
_delay_ms(2000); //노란불 유지시간 2초
//----------------------------------------------------------------------------
traffic2(0,1); //트래픽2(보행신호) 초록불
traffic3(0,0,1); //트래픽3(차량신호) 초록불
traffic4(1,0,0,0); //트래픽4(삼거리신호) 빨간불
_delay_ms(7000); //초록불 유시시간 (10-3=7) 7 초
//---------------------------------------------------------------------------- 트래픽2 1초 초록불 점멸(주기 0.5초) 동작
traffic2(0,0); //트래픽2(보행신호) 초록불꺼짐
traffic3(0,0,1); //트래픽3(차량신호) 초록불
traffic4(1,0,0,0); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유시시간 0.25 초
traffic2(0,1); //트래픽2(보행신호) 초록불켜짐
traffic3(0,0,1); //트래픽3(차량신호) 초록불
traffic4(1,0,0,0); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유시시간 0.25 초
traffic2(0,0); //트래픽2(보행신호) 초록불꺼짐
traffic3(0,0,1); //트래픽3(차량신호) 초록불
traffic4(1,0,0,0); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유시시간 0.25 초
traffic2(0,1); //트래픽2(보행신호) 초록불켜짐
traffic3(0,0,1); //트래픽3(차량신호) 초록불
traffic4(1,0,0,0); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유시시간 0.25 초
//---------------------------------------------------------------------------- 트래픽2 2초 초록불 점멸(주기 0.5초)
//---------------------------------------------------------------------------- 트래픽3 노란불 & 트래픽4 빨간불 동작
traffic2(0,0); //트래픽2(보행신호) 초록불꺼짐
traffic3(0,1,0); //트래픽3(차량신호) 노란불
traffic4(1,0,0,0); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유시시간 0.25 초
traffic2(0,1); //트래픽2(보행신호) 초록불켜짐
traffic3(0,1,0); //트래픽3(차량신호) 노란불
traffic4(1,0,0,0); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유시시간 0.25 초
traffic2(0,0); //트래픽2(보행신호) 초록불꺼짐
traffic3(0,1,0); //트래픽3(차량신호) 노란불
traffic4(1,0,0,0); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유시시간 0.25 초
traffic2(0,1); //트래픽2(보행신호) 초록불켜짐
traffic3(0,1,0); //트래픽3(차량신호) 노란불
traffic4(1,0,0,0); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유시시간 0.25 초
traffic2(0,0); //트래픽2(보행신호) 초록불꺼짐
traffic3(0,1,0); //트래픽3(차량신호) 노란불
traffic4(1,0,0,0); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유시시간 0.25 초
traffic2(0,1); //트래픽2(보행신호) 초록불켜짐
traffic3(0,1,0); //트래픽3(차량신호) 노란불
traffic4(1,0,0,0); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유시시간 0.25 초
traffic2(0,0); //트래픽2(보행신호) 초록불꺼짐
traffic3(0,1,0); //트래픽3(차량신호) 노란불
traffic4(1,0,0,0); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유시시간 0.25 초
traffic2(0,1); //트래픽2(보행신호) 초록불켜짐
traffic3(0,1,0); //트래픽3(차량신호) 노란불
traffic4(1,0,0,0); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유시시간 0.25 초
}
return 0;
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
//for문을 이용한 또다른 방법
while(1)
{
traffic2(1,0); //트래픽2(보행신호) 빨간불
traffic3(1,0,0); //트래픽3(차량신호) 빨간불
traffic4(0,0,1,1); //트래픽4(삼거리신호) 초록불,왼쪽불
_delay_ms(8000); //초록불 유지시간 8초
traffic2(1,0); //트래픽2(보행신호) 빨간불
traffic4(0,1,0,0); //트래픽4(삼거리신호) 노란불
_delay_ms(2000); //노란불 유지시간 2초
//----------------------------------------------------------------------------
traffic2(0,1); //트래픽2(보행신호) 초록불
traffic3(0,0,1); //트래픽3(차량신호) 초록불
traffic4(1,0,0,0); //트래픽4(삼거리신호) 빨간불
_delay_ms(7000); //초록불 유지시간 (10-3=7) 7 초
//---------------------------------------------------------------------------- 트래픽2 1초 초록불 점멸(주기 0.5초) 동작
traffic2(0,0); //트래픽2(보행신호) 초록불꺼짐
traffic3(0,0,1); //트래픽3(차량신호) 초록불
traffic4(1,0,0,0); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유지시간 0.25 초
traffic2(0,1); //트래픽2(보행신호) 초록불켜짐
traffic3(0,0,1); //트래픽3(차량신호) 초록불
traffic4(1,0,0,0); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유지시간 0.25 초
traffic2(0,0); //트래픽2(보행신호) 초록불꺼짐
traffic3(0,0,1); //트래픽3(차량신호) 초록불
traffic4(1,0,0,0); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유지시간 0.25 초
traffic2(0,1); //트래픽2(보행신호) 초록불켜짐
traffic3(0,0,1); //트래픽3(차량신호) 초록불
traffic4(1,0,0,0); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유지시간 0.25 초
//---------------------------------------------------------------------------- 노란불ON & 초록불2초 점멸
traffic3(0,1,0); //노란불
for(i=0; i<3; i++) //------------------------------------------------------보행 2초 깜빡
{
traffic2(0,0);
_delay_ms(250);
traffic2(0,1);
_delay_ms(250);
}
}
return 0;
}
'전자공학 > 포트폴리오' 카테고리의 다른 글
4bit Integer Divider (Binary 0000~1111) Dividing by decimal 3 (0) | 2014.06.14 |
---|