Chapter 1. 수신
UART 수신 |
//======PORTL LED===================== #define LED 7 #define PORTL (*((volatile unsigned char *)0x10B)) #define DDRL (*((volatile unsigned char *)0x10A)) //======ADC========================= #define ADC (*((volatile unsigned int *)0x78)) #define ADCH (*((volatile unsigned char *)0x79)) #define ADCL (*((volatile unsigned char *)0x78)) #define ADCSRA (*((volatile unsigned char *)0x7A)) #define ADCSRB (*((volatile unsigned char *)0x7B)) #define ADMUX (*((volatile unsigned char *)0x7C)) #define MUX5 3 #define ADEN 7 #define ADSC 6 #define ADIF 4 #define ADPS2 2 #define ADPS1 1 #define ADPS0 0 //=======통신======================== //=====< Register > #define UCSR0A (*((volatile unsigned char *)0xC0)) #define UCSR0B (*((volatile unsigned char *)0xC1)) #define UCSR0C (*((volatile unsigned char *)0xC2)) //=====< UCSR0A > #define RXC 7 //=====< UCSR0B > #define RXEN 4 #define TXEN 3 #define UCSZ2 2 //=====< UCSR0C > #define UMSEL1 7 #define UMSEL0 6 #define UPM1 5 #define UPM0 4 #define USBS 3 #define UCSZ1 2 #define UCSZ0 1 //=====< Transmit > #define UDR0 (*((volatile unsigned char *)0xC6)) #define UDRE 5 //=====< 통신 속도 > #define UBRR0 (*((volatile unsigned int *)0xC4)) #define FOSC (16)*1024*1024 // MCU의 속도 #define BAUD 115200 // 통신시 이용할 속도 #define BAUD_RATE ((FOSC / (16L * BAUD)) - 1) //=========함수 선언================== unsigned int ADC_Convert(int); void UART0_init(void); void USART_Transmit( unsigned char data ); void uart_send_string(unsigned char *str, unsigned char len); unsigned char USART_Receive( void ); |
void main(void) { unsigned char UC_ret;
DDRL = (1<<LED); UART0_init();
while(1) { UC_ret = USART_Receive(); if((UC_ret == 'A')||(UC_ret == 'a')) { PORTL = ( 0<<LED ); // on } else { PORTL = ( 1<<LED ); // off }
} } |
unsigned char USART_Receive( void ) { /* Wait for data to be received */ while ( 0 == (UCSR0A & (1<<RXC)) );
/* Get and return received data from buffer */ return UDR0; } |
실행 결과 :
ㆍa, 또는 A 를 입력시에 POTRL 의 LED 가 켜지고 다른 키를 입력시에는 꺼진다.
ㆍUSART_Receive 함수는 1byte 씩 입력값을 수신한다.
Chapter 2. UART0 interrupt
ㆍICCR 은 #pragma 를 이용하여 등록한다. (gcc는 다름)
ㆍ#pragma interrupt_handler 에서 함수이름은 자유롭게 사용할수 있으며 (:26) 은
Vectors 테이블에서 선택하여 사용이 가능하다.
<spec :: 69p >
ㆍUART0_init 함수에는 RXCIE bit 를 활성화 하고 SEI 함수를 추가 해야한다.
< spec :: 243p >
ㆍ다음과 같이 main 함수를 코딩후 실행하면 main함수가 실행되는 중에도 인터럽트는
따로 동작하는 것을 알 수 있다.
ㆍUART0_RX 인터럽트 함수를 다음과 같이 작성하면 LED는 점멸하고 'a' 또는 'b' 를
하이퍼 터미널에 입력하면 인터럽트가 걸려 해당하는 문자를 출력 한다.
ㆍ1byte 송/수신 하는 함수를 포함시켜 문자열을 보내는 함수를 작성하였다.
ㆍ다음과같이 문자열 전송으로 수정 후 결과는 위와 동일하다.
Chapter 3. 외부 인터럽트
ㆍINT0 를 사용해 보겠다. PORTD 에 점프선을 연결
ㆍ다음 그림을 참고하여 PD 0 과 Gnd 에 연결한다.
ㆍ다음은 외부 인터럽트 A 레지스터이다.
ㆍ두개가 하나의 인터럽트pin 으로 사용되며 본 사용자는 0 번 사용 (ISC01, ISC00)
ㆍ위 레지스터 값에는 상승 엣지를 준다.
ㆍINT0 을 활성화 한다.
ㆍ2560 에서 지원하는 확장 인터럽트 PCICR 은 사용하지 않음으로 0을 넣는다.
ㆍ PCICR 은 Pin 상태가 바뀌면서 인터럽트가 발생하고, INT 는 상승엣지 하강엣지를 설정가능.
ㆍ PCICR 은 하나씩 활성화 하는 것이 아닌 그룹답위로(0~7) 활성화 한 후 PCMSK 로 개별로 활성화 한다.
ㆍ위에서 설명한 레지스터 들을 사용하여 다음과 같이 코드를 작성한다.
ㆍ실험결과는 INT0 핀에 인터럽트 발생시 하이퍼 터미널에 글자를 출력한다.
ATMEGA2560 ( 캐릭터 LCD 사용 ) [20121126] (0) | 2016.11.10 |
---|---|
동작감지 센서 회로도 ( 릴레이 / 트렌지스터 ) [20121122] (0) | 2016.11.10 |
동작감지센서 / 트렌지스터 (PIN 세팅) (0) | 2016.11.10 |
ATMEGA 2560 ( LED 점멸 ) [20121120] (0) | 2016.11.10 |
ATMEGA 2560 ( 설치 ) [20121113] (0) | 2016.10.07 |