학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

AVR PC 통신 (입력제어)

학습목표

PC에서 원거리 보드의 입력을 받는다.

학습주제

AVR D0,D1포트에 입력이 들어오면 RS232 통신으로 D포트 8비트(1문자) PC 보내면 이를 PC화면에 표시한다.

통신 프로토콜

0x02(시작), B포트 상태, 0x03(통신 ) 차례로 3개의 문자를 보낸다. D포트 상태가 모두 Off 상태일 경는 0x00이고 이를 그대로 보내면 문장의 끝을 표시하는 ASII 코드와 혼동이 발생함으로 상의4개의 비트를 1 만든다. 이는 0xfo or (|) 연산을 하면 된다.

예습내용

 

실습방법

   

1. AVR 프로그램

B0,B1 입력을 받아 RS232 송신을 하고 상태를 D포트로 출력을 보낸다.

#include <mega128.h> 

#include <delay.h>

#include <stdio.h>

 

char rxd,inD;

 

// USART0 Receiver interrupt service routine

interrupt [USART0_RXC] void uart0_rx_isr(void)

{

 

 }

 

// External Interrupt 0 service routine

interrupt [EXT_INT0] void ext_int0_isr(void)

{

// D0포트로 low에서 high 변할 인터럽트 처리 문장을 넣는다.

 

}

 

// External Interrupt 1 service routine

interrupt [EXT_INT1] void ext_int1_isr(void)

{

// D1포트로 low에서 high 변할 인터럽트 처리 문장을 넣는다.

 

}

 

// Declare your global variables here

 

void main(void)

{

// Declare your local variables here

 

// Input/Output Ports initialization

// Port A initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTA=0x00;

DDRA=0x00;

 

// Port B initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTB=0x00;

DDRB=0x00;

 

// Port C initialization

// Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out

// State0=0 State1=0 State2=0 State3=0 State4=0 State5=0 State6=0 State7=0

PORTC=0x00;

DDRC=0xFF;

 

// Port D initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTD=0x00;

DDRD=0x00;

 

// Port E initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTE=0x00;

DDRE=0x00;

 

// Port F initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTF=0x00;

DDRF=0x00;

 

// Port G initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In

// State0=T State1=T State2=T State3=T State4=T

PORTG=0x00;

DDRG=0x00;

 

// USART0 initialization

// Communication Parameters: 8 Data, 1 Stop, No Parity

// USART0 Receiver: On

// USART0 Transmitter: On

// USART0 Mode: Asynchronous

// USART0 Baud rate: 9600

UCSR0A=0x00;

UCSR0B=0xD8;

UCSR0C=0x06;

UBRR0H=0x00;

UBRR0L=0x67;

 

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: Timer 0 Stopped

// Mode: Normal top=FFh

// OC0 output: Disconnected

TCCR0=0x00;

ASSR=0x00;

TCNT0=0x00;

OCR0=0x00;

 

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: Timer 1 Stopped

// Mode: Normal top=FFFFh

// OC1A output: Discon.

// OC1B output: Discon.

// OC1C output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

TCCR1A=0x00;

TCCR1B=0x00;

TCNT1H=0x00;

TCNT1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

OCR1CH=0x00;

OCR1CL=0x00;

 

// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer 2 Stopped

// Mode: Normal top=FFh

// OC2 output: Disconnected

TCCR2=0x00;

ASSR=0x00;

TCNT2=0x00;

OCR2=0x00;

 

// Timer/Counter 3 initialization

// Clock source: System Clock

// Clock value: Timer 3 Stopped

// Mode: Normal top=FFFFh

// OC3A output: Discon.

// OC3B output: Discon.

// OC3C output: Discon.

TCCR3A=0x00;

TCCR3B=0x00;

TCNT3H=0x00;

TCNT3L=0x00;

OCR3AH=0x00;

OCR3AL=0x00;

OCR3BH=0x00;

OCR3BL=0x00;

OCR3CH=0x00;

OCR3CL=0x00;

 

// External Interrupt(s) initialization

// INT0: On

// INT0 Mode: Rising Edge

// INT1: On

// INT1 Mode: Rising Edge

// INT2: Off

// INT3: Off

// INT4: Off

// INT5: Off

// INT6: Off

// INT7: Off

EICRA=0x0F;

EICRB=0x00;

EIMSK=0x03;

EIFR=0x03;

 

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x00;

ETIMSK=0x00;

 

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

// Analog Comparator Output: Off

ACSR=0x80;

SFIOR=0x00;

 

// Global enable interrupts

#asm("sei")

 

while (1)

      {

      // Place your code here

          inD = PIND;  //D포트 입력상태 저장

             PORTC = inD;  // D포트 상태를 C포트로 출력

             inD |= 0xf0;    // 상위4비트를 1 만든다.

             putchar(0x02); // 통신시작

             putchar(inD);

             putchar(0x03);  //통신종료

             delay_ms(2000);

      };

}

 

2. PC 프로그램

송신되는 문자의 01 비트가 0인지 아닌지를 검사하여 화면의 LED 표시한다.

[소스 프로그램 내려받기]

처음

   

앞에서 배운 프로그램을 종합하여 6개의 출력과 2개의 입력을 받을 있는 프로그램을 완성하시오.

[AVR프로그램 내려받기]

[PC 프로그램 내려받기]