질문게시판 > atmega 횡단보도 신호등 만들기 질문있습니다.

TODAY878 TOTAL2,160,889
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 질문게시판 | atmega 횡단보도 신호등 만들기 질문있습니다.

페이지 정보

작성자 어이캑 작성일2021-12-11 15:13 조회1,815회 댓글12건

본문

	

 

#define F_CPU 16000000

#define NIGHT 0

#define MORNING 1

#define CHOICE_R 1

#define CHOICE_G 0

 

#define C1 523//도

#define E1 659//미

#define DLY_4 4 // 4분음표

#define DLY_8 2 // 8분음표

 

#include <avr/io.h>

#include <util/delay.h>

#include <avr/interrupt.h>

const unsigned char Segment_Data[] =

{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F};

void Show4Digit12(int number12);

void Show4Digit34(int number34);

void RED();

void GREEN();

void Sound();

int day=NIGHT;

volatile int choice;

char COLUMN[4]={0,0,0,0};

 

volatile int admit_sound=0;

 

volatile int select_RED=6;

volatile int select_GREEN=6;

unsigned int count_int=0;

unsigned int count_int2=0;

 

volatile int RED12=6;

volatile int GREEN34=0;

unsigned char keyin=0;

 

volatile int siren[10]=

{E1};

 

volatile int sound_length[10]= 

{DLY_8};

 

volatile unsigned char TIMERvalue;

volatile int freq = 1000, i;

void Sound(void);

void Shimpyo(int time);

 

ISR(TIMER0_OVF_vect){ //타이머0

if (day==MORNING)

{

count_int++;

if(count_int == 244){ // 1초

if( GREEN34==0){

            RED();

}

else if (RED12==0 && GREEN34<=select_GREEN){

GREEN();

}

count_int=0;

}

}//횡단보도의 빨간불 초록불 교차신호

  

else if(day==NIGHT){

count_int++;

if(count_int == 244){

//PORTG ^=0x03;

count_int=0;

}

}

}

ISR(TIMER2_OVF_vect){

 if (day==MORNING){//밤에는 숫자가 안뜨게하기

 

Show4Digit12(RED12);

Show4Digit34(GREEN34);

 }

}

 

ISR(INT0_vect){

if(day==NIGHT){

if(choice==CHOICE_R){

   select_RED++;

}

else if(choice==CHOICE_G){

select_GREEN++;

 }

}

}//숫자 올리기

 

ISR(INT1_vect){

if(day==NIGHT){

if(choice==CHOICE_R){

select_RED--;

}

else if(choice==CHOICE_G){

select_GREEN--;

}

}

}//숫자 내리기

 

ISR(INT2_vect) {

if(day==MORNING) {

day=NIGHT;

PORTG=0x01;

select_RED=6;

select_GREEN=6;

RED12=6;

GREEN34=0;

choice=CHOICE_R;

}

else if(day==NIGHT){

day=MORNING;

}

}//야간모드

 

 ISR(INT3_vect){

if(day==NIGHT){

if(choice==CHOICE_G){

choice=CHOICE_R;

PORTG=0x01;

}

    else if(choice==CHOICE_R){

choice=CHOICE_G;

PORTG=0x02;

}

}

 }

 

int main(void) {

DDRC = 0xff; //세그먼트

DDRA = 0xff; 

DDRG = 0x03; //푸쉬버튼

DDRE = 0x80;//스피커

EICRA = 0xFF; // 인터럽트 4개

EICRB = 0xFF;

EIMSK = 0xFF; // Set INT0 & INT

PORTC = 0x00;

PORTG = 0x01;

TCCR0 = 0x06; // Normal mode, prescale 256, 16M/256=65000Hz

TCNT0= 0x00; //

     TCCR2 = 0x06; // Normal mode, prescale 256, 16M/256=65000Hz

TCNT2= 254; //208부터

TCCR3B=0x0B; 

OCR3A=249;    

ETIMSK=0x10;

TIMSK = 0x01; //타이머0,2 허용

SREG |= 0x80; // Global Interrupt Enable

while (1) {

}

if (day==MORNING){//밤에는 숫자가 안뜨게하기

Show4Digit12(RED12);

Show4Digit34(GREEN34);

}

}

 

void Sound(void) {

TIMERvalue = 66;// _`ON/OFFabcdef@^.

_delay_ms(200);

}

 

void Show4Digit12(int number12) {

COLUMN[0] = number12/10; COLUMN[1] = (number12%10)/1;

 

for(int i=0;i<2;i++) {

ShowDigit12(COLUMN[i],i); //qqs

_delay_ms(2); // wait for a second

}

}

 

void Show4Digit34(int number34) {

COLUMN[2] = number34/10;COLUMN[3] = (number34%10)/1;

for(int j=2;j<4;j++) {

ShowDigit34(COLUMN[j],j); 

_delay_ms(2); // wait for a second

}

}

 

void ShowDigit12(int i, int digit12) {

PORTC=~(0x01<<digit12);

if(digit12==1)

PORTA = Segment_Data[i]|0x80;

else

PORTA = Segment_Data[i];

}

 

void ShowDigit34(int j, int digit34) {

PORTC=~(0x01<<digit34);

if(digit34==1)

PORTA = Segment_Data[j]|0x80;

else

PORTA = Segment_Data[j];

}

 

void RED(){

if (day=MORNING)

{PORTG = 0x01;// 밤에서 낮으로 바뀔때 신호등 두개 다켜지는 것 방지

RED12--; 

if(RED12<=0){

RED12=0;

GREEN34=select_GREEN;

PORTG = 0x02;//초록불로 바뀔때 PG1로 변경

admit_sound=1;

}

}

}

 

void GREEN(){

PORTG = 0x02;//밤에서 낮으로 바뀔때 신호등 두개 다켜지는 것 방지

GREEN34--;

if(GREEN34<=0){

GREEN34=0;

RED12=select_RED;

PORTG = 0x01;//빨간불로 바뀔때 PG0로 변경

admit_sound=0;

}

}

 

처음에 빨간불6초로 시작해서 0초되면 초록불이 6초되면서 다시 줄어드는 방식입니다. 외부인터럽트로 시간을 변경하는것은 만들었는데

while문에 세븐세그먼트를 넣어놨고 타이머0에 시계를 맞춰서 넣어놨습니다.  그런데 초록불일때 소리를 내고싶은데 할 수 있는 방법이 있나요?

저는 타이머2를 이용해서 소리를 구현해보고싶은데 맘처럼 되지가 않네요 타이머0과 2를 연동하는 법이 있나요?

 

 

 

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 12

조회수 1,815

master님의 댓글

master 작성일

EIMSK=0xFF;
사용하는 외부인터럽트만 이네이블 시키세요
인터럽트 함수 없이 이네이블만 시키면 심각한 동작오류가 발생합니다.

master님의 댓글

master 작성일

TIMSK=0x01; //타이머0,2 허용
TIMSK는 타이머0만 이네이블 되어 있군요 타이머2도 이네이블 시켜야합니다.

master님의 댓글

master 작성일

void Sound(void){ TIMERvalue=66; _delay_ms(200); } // _`ON/OFFabcdef@^
TIMERvalue 이 변수는 어떤 용도로 사용하려는 것일까요?

master님의 댓글

master 작성일

시간의 오차를 줄이려면 오버플로우 인터럽트를 사용하지 말고 CTC비교매치 인터럽트를 사용하는 것이 좋습니다.

master님의 댓글

master 작성일

TCCR2=0x06;
타이머2의 분주는 0~5 까지입니다.
6은 의도하고 작성한 것일까요?

어이캑님의 댓글

어이캑 댓글의 댓글 작성일

제가 계산을 잘못한거 같습니다!!

master님의 댓글

master 작성일

#define F_CPU    16000000UL
#define NIGHT    0
#define MORNING  1
#define CHOICE_R 1
#define CHOICE_G 0
//
#define C1    523 //도
#define E1    659 //미
#define DLY_4 4  // 4분음표
#define DLY_8 2  // 8분음표
//
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
//
volatile char COLUMN[4]={0,0,0,0};
volatile unsigned char Segment_Data[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F};
volatile unsigned char TIMERvalue,keyin=0;
volatile int siren[10]={E1},sound_length[10]={DLY_8};
volatile int freq=1000,i,day=NIGHT,choice,admit_sound=0;
volatile int select_RED=6,select_GREEN=6,RED12=6,GREEN34=0;
volatile unsigned int count_int=0,count_int2=0;
//
void Sound(void){ TIMERvalue=66; _delay_ms(200); } // _`ON/OFFabcdef@^.
//
void RED(){
  if(day=MORNING){
    PORTG=0x01; // 밤에서 낮으로 바뀔때 신호등 두개 다켜지는 것 방지
    if(--RED12<=0){ RED12=0; GREEN34=select_GREEN; PORTG=0x02; admit_sound=1; } //초록불로 바뀔때 PG1로 변경
    COLUMN[0]=RED12/10; COLUMN[1]=RED12%10; COLUMN[2]=GREEN34/10; COLUMN[3]=GREEN34%10;
  }
}
//
void GREEN(){
  PORTG=0x02; //밤에서 낮으로 바뀔때 신호등 두개 다켜지는 것 방지
  if(--GREEN34<=0){
    GREEN34=0; RED12=select_RED; PORTG=0x01; admit_sound=0; //빨간불로 바뀔때 PG0로 변경
    COLUMN[0]=RED12/10; COLUMN[1]=RED12%10; COLUMN[2]=GREEN34/10; COLUMN[3]=GREEN34%10;
  }
}
//
ISR(TIMER0_COMP_vect){  // 1ms
  static char c=0;
  if(++count_int==1000){ // 1초
    if(day==MORNING){
      if    (GREEN34==0                      ){ RED();  }
      else if(RED12==0 && GREEN34<=select_GREEN){ GREEN(); }
    }
    count_int=0; //PORTG^=0x03;
  }
  //
  if(day==MORNING){ //밤에는 숫자가 안뜨게하기
    PORTC=~(1<<c); PORTA=Segment_Data[COLUMN[c]];
    if(c==1)PORTA|=0x80;
    if(++c>3)c=0;
  }
  else PORTC=0xFF; // 밤에는 끄기
}
//
ISR(TIMER2_OVF_vect){
}
//
ISR(INT0_vect){
  if(day==NIGHT){
    if    (choice==CHOICE_R){ select_RED++;  }
    else if(choice==CHOICE_G){ select_GREEN++; }
  }
}//숫자 올리기
//
ISR(INT1_vect){
  if(day==NIGHT){
    if    (choice==CHOICE_R){ select_RED--;  }
    else if(choice==CHOICE_G){ select_GREEN--; }
  }
}//숫자 내리기
//
ISR(INT2_vect){
  if(day==MORNING){
    day=NIGHT; PORTG=0x01; select_RED=6; select_GREEN=6; RED12=6; GREEN34=0; choice=CHOICE_R;
    COLUMN[0]=RED12/10; COLUMN[1]=RED12%10; COLUMN[2]=GREEN34/10; COLUMN[3]=GREEN34%10;
  }
  else if(day==NIGHT){ day=MORNING;}
}//야간모드
//
ISR(INT3_vect){
  if(day==NIGHT){
    if    (choice==CHOICE_G){ choice=CHOICE_R; PORTG=0x01; }
    else if(choice==CHOICE_R){ choice=CHOICE_G; PORTG=0x02; }
  }
}
//
int main(void){
  DDRA=0xff;
  DDRC=0xff;  //세그먼트
  DDRE=0x80;  //스피커
  DDRG=0x03;  PORTG=0x01; //푸쉬버튼
  TCCR0=0x0C;  OCR0=249;  TCCR2=0x04; TCNT2=254; TIMSK=0x42; //타이머0,2 허용
  TCCR3B=0x0B; OCR3A=249;  ETIMSK=0x10;
  EICRA=0xFF;  EICRB=0xFF; EIMSK=0x0F; // Set INT0 & INT
  SREG |=0x80; // Global Interrupt Enable
  while(1){}
}

이 코드를 기반으로 수정해서 만들어보세요
타이머2 오버플로우 인터럽트는 비워뒀습니다.

어이캑님의 댓글

어이캑 댓글의 댓글 작성일

혹시 세븐세그먼트에 숫자가 안떠서그러는데 궁금해서 그러는데 타이머0 인터럽트에 세븐세그먼트 넣으면 1초당 한번씩 빠르게 떠서 안보이지않나요?
그리고 static char c 의 c역할을 모르겠습니다 ㅜㅜ

어이캑님의 댓글

어이캑 댓글의 댓글 작성일

새로운 파일에 시험상 이런방법 생각해봐서 했는데 안되네요 ㅜㅜ 왜안되는지 알수있을까요? 이런것처럼 타이머 안에서 숫자뜨게 만들어야 타이머2에서 소리낼꺼같은데 어렵네요 ㅜㅜ 항상 감사합니다 ㅜㅜ
ISR(TIMER0_OVF_vect){

COLUMN[0] = 4; COLUMN[1] = 3;
COLUMN[2] = 2; COLUMN[3] = 1;


++count_int;


if(count_int%4==1){
PORTC=~(0x01<<0);
PORTA = Segment_Data[0];
}
else if(count_int%4==2){
PORTC=~(0x01<<1);
PORTA = Segment_Data[1];
}
else if(count_int%4==3){
PORTC=~(0x01<<1);
PORTA = Segment_Data[2];
}
else if(count_int%4==0){
PORTC=~(0x01<<1);
PORTA = Segment_Data[3];
}
}


int main(void){
DDRA=0xff;
DDRC=0xff;  //세그먼트
DDRE=0x80;  //스피커
DDRG=0x03;  PORTG=0x01; //푸쉬버튼
TCCR0=0x0C;  OCR0=249;  //타이머0,2 허용
TIMSK = 0x01;
EICRA=0xFF;  EICRB=0xFF; EIMSK=0x0F; // Set INT0 & INT
SREG |=0x80; // Global Interrupt Enable
while(1){}
}

master님의 댓글

master 댓글의 댓글 작성일

//
  if(day==MORNING){ //밤에는 숫자가 안뜨게하기
    PORTC=~(1<<c); PORTA=Segment_Data[COLUMN[c]];
    if(c==1)PORTA|=0x80;
    if(++c>3)c=0;
  }
1ms마다 1자리씩 7세그먼트를 구동하는 데에서
자리수를 c로 관리하는겁니다.
LED는 속도가 빨라서 1ms씩 차례로 구동해도 잘 보입니다.

어이캑님의 댓글

어이캑 작성일

오 일단 위에 코드로 세븐세그먼트에 뜨게는 했는데 빨간불은 잘카운트되는데 초록불로 바뀌는 순간 6에서 멈춰있네요 근데 6초정도 지나면 다시 빨간불가는거 보면
첫쨰자리마 적용안되는거 같은데 혹시 0 1 2 3 이니까 c++ if(c>4)아닌가요? 이걸로도 바꿔서 해봤는데 안되네요 ㅜㅜ

어이캑님의 댓글

어이캑 작성일

아 괄호 수정해서 됐습니다!! 감사합니다!!

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
질문 360서보모터 질문입니다댓글[1] 한잔해2 22-05-14 96
질문 아두이노 초보 24V DC 제품 제어댓글[2] 제로펲시 22-05-13 106
질문 임베디드 시스템 디지털 도어락 구현댓글[1] 이미지첨부파일 ejdog 22-05-12 99
질문 임베디드 시스템 디지털 도어락 구현댓글[1] ejdog 22-05-12 88
질문 ATMEGA128 TCCR2 = 0X0B가 의미하는것은 무엇인지 궁금합니다. dfas123 22-05-12 129
답변 답변글 답변 : ATMEGA128 TCCR2 = 0X0B가 의미하는것은 무엇인지 궁금합니다.댓글[1] master 22-05-12 141
질문 ATMEGA128 0번핀과1번핀 스위치를 누르면 LED점등 속도 제어댓글[3] dfas123 22-05-11 166
질문 아두이노 로드셀 관련 질문드립니다.댓글[1] 끼약 22-05-11 109
질문 앱 인벤터 및 아두이노 질문 suhosin 22-05-10 137
답변 답변글 답변 : 앱 인벤터 및 아두이노 질문댓글[1] master 22-05-11 143
질문 블루투스 모듈, 적외선온도센서, 스피커 모듈댓글[4] 죠르디 22-05-10 208
질문 Hm-10블루투스 사용하여 rc카 조종기로부터 데이터 받는방법을 모르겠습니다.댓글[1] 뚱보개 22-05-10 834
질문 아두이노 로드셀 [졸업작품]댓글[1] 이미지 졸업작품 22-05-10 165
질문 아두이노 조이스틱으로 스텝모터2개제어댓글[4] 초보진 22-05-10 234
질문 초음파센서 스텝모터 질문입니다댓글[1] 응애 22-05-09 190
질문 아두이노 적외선온도센서 스피커모듈댓글[4] 죠르디 22-05-09 174
질문 stm32 uart serial 통신댓글[1] 하리 22-05-09 184
질문 적외선,금속,조도,서보모터 질문댓글[2] 하허히 22-05-08 174
질문 analogRead 관련 문의댓글[2] toemm 22-05-08 134
질문 아두이노 우노로 솔레노이드 자물쇠 동작 문의 드립니다.댓글[3] 응애응애 22-05-07 150
질문 초음파센서와 스텝모터댓글[2] 두팔 22-05-07 200
질문 아두이노 DHT11,팬모터,네오픽셀,적외선센서,블루투스(부기능코딩)댓글[5] 이미지첨부파일 조숩인 22-05-07 374
질문 atmega328p, CodevisionAVR을 이용한 MPU6050 값 받기 재공부 후 다시 질문드립니다댓글[5] 수명양말 22-05-06 154
질문 Atmega128 led 왕복 점등 및 스위치 방향 전환댓글[1] MaeuM 22-05-06 287
질문 네오픽셀 밝기조절댓글[4] 낭낭이 22-05-06 189
질문 아두이노 프로 미니에 네오픽셀 700개 구동시 너무 길어서 업로드 에러댓글[2] 이미지첨부파일 손문일 22-05-06 152
질문 아두이노 hm10 블루투스 관련 질문드립니다댓글[1] 냐옹 22-05-05 133
질문 pwm 출력과 ad conversion 과정댓글[18] 이미지첨부파일 412904 22-05-05 561
질문 ATmega128 모터 질문드립니다댓글[6] zzammo 22-05-03 290
질문 한개의 ISP로 2개의 MCU 프로그래밍댓글[3] ParkKH 22-05-03 186
게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기