인터럽트를 쓰지 않았을 때 비효율 적인 연산이 일어남을 보여주는 소스 #include <avr/io.h> #include <util/delay.h> #define LED 5 #define output_low(port,pin) port &= ~(1<<pin) #define output_high(port,pin) port |= (1<<pin) #define set_input(portdir,pin) portdir &= ~(1<<pin) #define set_output(portdir,pin) portdir |= (1<<pin) #define FOSC 16000000 #define BAUD 9600 #define UBRR FOSC/16/BAUD-1 void init_USART0(unsigned int baud) { UBRR0 = baud; // Set Baudrate UCSR0C = (3<<UCSZ00); // Character Size 8 bit UCSR0B |= _BV(RXEN0) | _BV(TXEN0); // Receiver and Transmitter Enable } void setRXCIE_USART0() { UCSR0B |= _BV(RXCIE0); } unsigned char receive_1byte_USART0(void) { loop_until_bit_is_set(UCSR0A, RXC0); return UDR0; } void transmit_1byte_USART0(unsigned char data) { loop_until_bit_is_set(UCSR0A, UDRE0); UDR0 = data; } void transmit_str_USART0(char *str) { while (*str != 0) { transmit_1byte_USART0(*str); *str++; } } void transmit_4digit_USART0(int num) { unsigned char temp; int digit = 1000; while (digit != 0) { temp = num / digit; transmit_1byte_USART0('0'+temp); num -= (digit*temp); digit /= 10; } } int main() { set_output(DDRC, LED); init_USART0(UBRR); // initialize USART0 while (1) { if ('a' == receive_1byte_USART0()) { transmit_str_USART0("Hello World!\r\n"); output_high(PORTC, LED); _delay_ms(1000); output_low(PORTC, LED); _delay_ms(1000); } } return 0; } | MCU Code //----------------------------------------------------------------------------- // ATmega168 // Internal 16 MHz RC Osc. // (1/16M = 62.5 ns) //----------------------------------------------------------------------------- #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include "hhjjj168.h" #define LED 5 #define output_low(port,pin) port &= ~(1<<pin) #define output_high(port,pin) port |= (1<<pin) #define set_input(portdir,pin) portdir &= ~(1<<pin) #define set_output(portdir,pin) portdir |= (1<<pin) #define TCNT1_InitVal 0 // set timer its initial value volatile unsigned int timeunit = 0; #define FOSC 16000000 #define BAUD 9600 #define UBRR FOSC/16/BAUD-1 volatile char flag = 0; ISR(INT0_vect) { if (flag) { timeunit= TCNT1; flag = 0; } } /* ISR(TIMER1_OVF_vect) { TCNT1 = TCNT1_InitVal; // Clear Timer/Counter1 } */ void extintInit() { EICRA = (1<<ISC01 | 1<<ISC00); //EXT Triggers on rising edge of PCINT0 EIMSK = (1<<INT0); //Enables NT0 } void extINT0enable() { EIMSK = (1<<INT0); //Enables NT0 } void extINT0disable() { EIMSK = 0x00; //Disalbes NT0 } void init_Timer1() { TCCR1B = 0x00; // Stop Timer/Counter1 TCNT1 = TCNT1_InitVal; // Initial Value of Timer/Counter1 //TIMSK1 = _BV(TOIE1); // Timer/Counter1 Overflow Interrupt Enable } //----------------------------------------------------------------------------- // Main //----------------------------------------------------------------------------- int main() { set_input(DDRD,PD2); set_output(DDRC,PC5); init_Timer1(); init_USART0(UBRR); //initialize USART0 extintInit(); sei(); // Global Interrupt Enable output_low(PORTC, PC5); _delay_ms(100); flag = 0; while (1) { float temp; unsigned int distance ; output_high(PORTC, PC5); TCNT1=0; TCCR1B = 0x03; // Start Timer/Counter1 clk/64 62.5nsX64=4us timer1 overflow in 65536 * 4us = 262.144ms _delay_ms(2); output_low(PORTC, PC5); flag = 1; _delay_ms(30); temp = ((float)timeunit*1.36-300)/2; transmit_digit_USART0((unsigned int)timeunit-400); transmit_1byte_USART0('\n'); } return 0; } Processing Code import processing.serial.*; Serial myPort; // Create object from Serial class String myString = null; int cnt = 0; void setup() { //size(200, 200); // List all the available serial ports println(Serial.list()); String portName = Serial.list()[1]; myPort = new Serial(this, portName, 9600); } void draw() { while (myPort.available() > 0) { myString = myPort.readStringUntil('\n'); if (myString != null) { println(myString); } } } |

