Microprocessor/ATMEGA 2560 ATMEGA 2560 ( UART 통신 / UART인터럽트 / 외부 인터럽트 ) [20121121]
  • 728x90
    반응형

       

       

       

       

       

       

      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 핀에 인터럽트 발생시 하이퍼 터미널에 글자를 출력한다.

       

       

       

       

       

       

       

       

       

       

    728x90
    반응형
상단으로