답변 : atmega128 인터럽트 질문
페이지 정보
작성자 master 작성일18-06-11 17:06 조회8,022회 댓글2건본문
// MCU BASIC: https://www.basic4mcu.com
// DateTime : 2018-06-11 오후 5:09:24
// by Ok-Hyun Park
// 헤더
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <avr/io.h>
#include <avr/interrupt.h>
//
volatile enum{Direction_L, Direction_R }Direction=Direction_R;
volatile enum{Star_L2, Star_L1, Star_C0, Star_R1, Star_R2 }Star=Star_L2;
volatile enum{State_Display,State_Success,State_Failure,State_Finish}State=State_Display;
//
volatile char s[50];
volatile int Level=1,Score=0,time=0,ms4=0,ms4_2=0,ms100=0,Key_input=0;
//--------------------------------------------------------------------------
int my_getchar(void){ while(!(UCSR0A&0x80)); return UDR0; }
void tx_string(char*s){ while(*s)my_putchar(*s++); }
//
int my_putchar(char data){
if(data=='\n'){ while((UCSR0A&0x20)==0); UDR0='\r'; }
while((UCSR0A&0x20)==0);
UDR0=data;
return(0);
}
//--------------------------------------------------------------------------
SIGNAL(SIG_OUTPUT_COMPARE0){ // 4ms
if(++ms4==25){ ms4=0; // 100ms
if(ms100<200)++ms100; else State=State_Finish;
//
if(State==State_Display){
switch(Star){ // 100ms 마다 출력
case Star_L2: time=ms100; sprintf(s,"\n★□□□□%03d",time); tx_string("str"); break;
case Star_L1: time=ms100; sprintf(s,"\n□★□□□%03d",time); tx_string("str"); break;
case Star_C0: time=ms100; sprintf(s,"\n□□★□□%03d",time); tx_string("str"); break;
case Star_R1: time=ms100; sprintf(s,"\n□□□★□%03d",time); tx_string("str"); break;
case Star_R2: time=ms100; sprintf(s,"\n□□□□★%03d",time); tx_string("str"); break;
}
}
}
//
if(State==State_Display){
if(++ms4_2==(250-50*(Level-1))){ ms4_2=0; // Level1: 1.0초마다...Level5: 0.2초마다 상태 변환
if(Direction==Direction_R){ if(++Star>4){ Star=0; Direction=Direction_L; } } // 방향이 좌에서 우라면...
else{ if(Star==Star_L2){ Star=Star_L1; Direction=Direction_R; } else Star--; } // 방향이 우에서 좌라면...
}
}
else ms4_2=0;
}
//
SIGNAL(SIG_UART0_RECV){
Key_input=my_getchar();
if(State==State_Display){
if(Star==Star_C0)State=State_Success; else State=State_Failure;
}
//if(Key_input_==82||Key_input_==114)State=State_Finish;
}
//---------------------------------------------------------------------------------------
int main(void){
PORTG=0xFF; DDRG=0xFF;
UCSR0B=0x98; UBRR0L=0x33;
UCSR1B=0x98; UBRR1L=0x33; // Baud Rate: 19200
TCCR0=0x0E; OCR0=249; TIMSK=2; // Compare Match interrupt: Enable
tx_string("\n강화를 시작합니다\n강화 시작!!\n");
ms4=ms4_2=0;
while(1){
switch(State){
case State_Display:{ break; }
case State_Success:{
sprintf(s,"\n\nSUCCESS\nSCORE: %02d\n",++Score); tx_string("str");
if(Level<5)Level++;
Direction=Direction_R; Star=Star_L2; ms4=ms4_2=0; State=State_Display;
break;
}
case State_Failure:{
sprintf(s,"\n\nFailure\nSCORE: %02d\n",Score); tx_string("str");
Direction=Direction_R; Star=Star_L2; ms4=ms4_2=0; State=State_Display;
break;
}
case State_Finish:{
sprintf(s,"\n\nFinish\nFinal score: %02d\nRE START: Go!",Score); tx_string("str");
Level=0; Score=0; Direction=Direction_R; Star=Star_L2; ms4=ms4_2=ms100=0; State=State_Display;
break;
}
}
}
return 0;
}
댓글 : 2
조회수 : 8,022
초코우유먹자님의 댓글
초코우유먹자 작성일
수정감사합니다 printf 조건에서 쓰지않고 해야했으므로 문자열로 썻씁니다
수정하신코드는 타이머인터럽트내에서 if문을 통해 제가원하는 출력을 만들어주신거맞나요? 제가 아직 초보라서ㅜ 어거지로 tx interrupt을 쓰자고 하면 어떤걸 쓰면 좋을까요 ㅜ
master님의 댓글
master
tx 인터럽트를 사용해서는 만들지 못할텐데요?