BASIC4MCU | 질문게시판 | 답변 : atmega128 인터럽트 질문
페이지 정보
작성자 master 작성일2018-06-11 17:06 조회11,351회 댓글2건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=1730
작성일
본문
// 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){ // 4msif(++ms4==25){ ms4=0; // 100msif(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: 19200TCCR0=0x0E; OCR0=249; TIMSK=2; // Compare Match interrupt: Enabletx_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
조회수 11,351초코우유먹자님의 댓글
초코우유먹자 작성일
수정감사합니다 printf 조건에서 쓰지않고 해야했으므로 문자열로 썻씁니다
수정하신코드는 타이머인터럽트내에서 if문을 통해 제가원하는 출력을 만들어주신거맞나요? 제가 아직 초보라서ㅜ 어거지로 tx interrupt을 쓰자고 하면 어떤걸 쓰면 좋을까요 ㅜ
master님의 댓글
master
tx 인터럽트를 사용해서는 만들지 못할텐데요?