BASIC4MCU | 질문게시판 | 안녕하세요 아트메가128 LED 질문입니다!
페이지 정보
작성자 아트메가공부중 작성일2021-11-28 21:35 조회1,384회 댓글2건본문
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
int led_cnt;
int sec;
char LED[9]={0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
ISR(INT4_vect)
{
가능하면 여기 스위치 버튼 PE4번을 눌러 동작이 시작되게 만들고 싶었으나 실패함.
}
ISR(INT6_vect)
{
PORTB= ~0x00; // clear 초기화시키겠다
}
void Init_IOport(void)
{
DDRB=0xFF;
PORTB=0xFF;
}
void Init_Interrupt(void)
{
EICRB=0x2A; // 0010 1010 4,5,6번 전부 하강엣지
EIMSK=0x70; // 0111 0000 4,5,6번을 쓰겠다
SREG = 0x80;
}
int main(void)
{
/* Replace with your application code */
Init_IOport();
Init_Interrupt();
while (1){
//switch(){ <<<< 여기를 스위치를 써서 break를 써야하지 않을까 생각합니다
PORTB = 0x80; //초록1
_delay_ms(5000);
PORTB = 0x40; //초록2
_delay_ms(5000);
PORTB = 0x20; //초록3
_delay_ms(5000);
//주황1,2,3 각 1초씩 점등 후
//붉은LED 1,2,3 각 5초씩 점등
}
}
}
완성된 코드도 아니고 오류가떠서 질문드립니다! 아트메가 128을 이용해서 LED신호등을 만들고 싶었습니다.
다음은 주황색과 붉은색을 점등 시킨 후 LCD와 FND를 이용하여 남은시간을 표현하고자 하는게 최종목표입니다.
근데 while문 안에 주황색을 넣으려고
PORTB = 0x10;
_delay_ms(1000); 을 썼더니 초록색도 같이 시간에 맞춰 점등되더라구요. 그래서 든 생각이 switch문을 이용하면 break를 걸어서 초록색불이 끝나면 브레이크 -> 주황색으로 넘어감 -> 주황색불이 끝나면 브레이크 -> 붉은색불로 넘어감 -> 붉은색 불이 끝나면 브레이크 -> 다시 초록색으로 넘어가서 반복
이 작업을 완수 할 수 있지 않을까 해서 질문드립니다.
인터럽트를 이용해서 PE4번 스위치로 동작을 시작할 수 있으면 베스트긴 하지만, 그게 되지 않아도 일단은 진행에 무리 없다고 생각합니다.
조금 도움을 부탁드려도 될까요?
현재 아트메가 사진은 첨부하겠습니다.
댓글 2
조회수 1,384master님의 댓글
master 작성일
오류라는 것이 컴파일오류가 아니고 동작오류라는 것이겠죠?
인터럽트를 이네이블 시켰으면 무조건 인터럽트를 만들어야합니다.
현재 int5 함수가 없는 상태라서 심각한 동작오류가 발생할 수 있습니다.
master님의 댓글
master 작성일
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//
volatile char LED[9]={0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
volatile int mode_time[]={5000,5000,5000,1000,1000,1000,5000,5000}; // 각 모드의 시간
volatile int mode=0,time=5000,led_cnt=0,msec=0;
//
ISR(INT4_vect){
//가능하면 여기 스위치 버튼 PE4번을 눌러 동작 시작
}
//
ISR(INT5_vect){
}
//
ISR(INT6_vect){
PORTB=~0; // clear 초기화시키겠다
}
//
int main(void){
DDRB=0xFF; PORTB=0xFF;
EICRB=0xAA; EIMSK=0x70; SREG=0x80; // 4,5,6 하강엣지
while(1){
switch(mode){
case 0: PORTB=0x80; break; //초록1
case 1: PORTB=0x40; break; //초록2
case 2: PORTB=0x20; break; //초록3
case 3: PORTB=0x10; break; //주황1
case 4: PORTB=0x08; break; //주황2
case 5: PORTB=0x04; break; //주황3
case 6: PORTB=0x02; break; //빨강1
case 7: PORTB=0x01; break; //빨강2
}
//---------------------------
if(time){
if(--time==0){
if(++mode>7)mode=0;
time=mode_time[mode];
}
}
_delay_ms(1);
}
}
신호등 설명은 이해 안가지만 c언어 문법적인 부분은 위처럼 하면 됩니다.