'ATmega128'에 해당되는 글 3건
- 2009/04/29 USART로 데이터 보내고 받기
- 2009/04/28 USART 제어
- 2009/04/23 DK128 Main
하이퍼터미널 연결후
비트/초(B): 19200
#include "EHA.h"
//#include<avr/io.h>
#define FOSC 16000000
#define BAUD 19200
#define MYUBRR FOSC/16l/BAUD-1 //16l long
void USART_Init(unsigned int ubrr);
void USART_Transtmit(unsigned char data);
unsigned char USART_Receive(void);
int main(void)
{
DDRF=0XFF;
PORTF=0XFF;
//unsigned char REC;
//volatile int n;
//unsigned char len[10] = "hello";
//unsigned char* len = "hello";
USART_Init(MYUBRR);
while(1)
{
switch(USART_Receive())
{
case '1':
PORTF=0X00;
break;
case '2':
PORTF=0XFF;
break;
}
}
/*
for(n=0; len[n]!='\0'; ++n){
USART_Transtmit(len[n]);
}
while(1){
REC=USART_Receive();
REC++;
USART_Transtmit(REC);
}
*/
while(1);
return 0;
}
//USART 초기화
void USART_Init(unsigned int ubrr)
{
//Set baud rate
UBRR1H = (unsigned char) (ubrr>>8);
UBRR1L = (unsigned char)ubrr;
// Enabe receiver and transmitter
UCSR1B = (1<<RXEN) |(1<<TXEN); //UCSR1B = 0X18;
//UCSR1C = (1<<USBS) |(3<<UCSZ0); //UCSR1C = 0X0E;
UCSR1C = (3<<UCSZ0); //UCSR1C = 0X06;
}
void USART_Transtmit(unsigned char data)
{
while(!(UCSR1A & (1<<UDRE)))
;
UDR1= data;
}
unsigned char USART_Receive(void)
{
while(!(UCSR1A & (1<<RXC)))
;
return UDR1;
}
'ATmega128' 카테고리의 다른 글
| USART로 데이터 보내고 받기 (0) | 2009/04/29 |
|---|---|
| USART 제어 (0) | 2009/04/28 |
| DK128 Main (0) | 2009/04/23 |
1-1 USART의 개요
⊙ 2개의 USART(Universal Synchronous and Asynchronous Receive and Transmitter) 구성
- 외부 디바이스와 직렬로 인터페이스를 통해 데이터를 송수신할 수 있게 해 줌
(외부 디바이스는 다른 마이컴 혹은 PC)
⊙ USART0, USART1
⊙ 전이중 통신 및 멀티 프로세서 통신가능
⊙ 동기식 전송 모드
- 마스터 동작의 경우 전송속도는 내부 클럭사용
- 슬레이브 동작의 경우 XCKn 단자로 입력되는 외부 클럭신호에 의해 동작한다.
⊙ 비동기식 전송 모드에서는 항상 내부의 시스템 클럭에 의하여 보레이트가 결정된다.
⊙ 송신 완료(TX Complete), 송신 데이터 레지스터 준비완료(TX Data Register Empty), 수신
완료(RX Complete) 등 3가지의 인터럽트 사용 가능
USART의 레지스터
1-2 USART의 레지스터
⊙ USART I/0 데이터 레지스터 (UDR0, UDR1)
: USART0 또는 USART1 포트의 송수신 데이터 버퍼의 기능
⊙ USART 제어 및 상태 레지스터 A (UCSR0A, UCSR1A)
: USART0, USART1 포트의 송수신 동작제어 ,송수신 상태 저장 기능
- RXCn (USARTn Receiver Complete): 수신버퍼의 상태 플래그
- TXCn (USARTn Transmit Complete): 송신버퍼의 상태 플래그
- UDREn (USARTn Data Register Empty) : 새로운 송신 데이터를 받기 위한 상태 플래그
- FEn (Frame Error) : 수신 프레임 에러 상태 플래그
- DORn (Data Overrun Error) : 수신동작 오버런 에러 상태 플래그
- UPEn (USARTn Parity Error)
- U2Xn (Double the USARTn Transmission Speed) : 비동기 모드에서만 유효하며, 클럭의
분주비를 16에서 8로 낮추어 전송속도를 2배 높이는 기능
- MPCMn (USARTn Multi-Processor Communication Mode)
⊙ USART 제어 및 상태 레지스터 B (UCSR0B, UCSR1B)
: USART0, USART1 포트의 송수신 동작제어, 전송데이터를 9비트로 설정한 경우에 전송
데이터의 9번째 비트값을 저장하는 기능을 수행
- RXCIEn (USARTn RX Complete Interrupt Enable): 수신완료 인터럽트
- TXCIEn (USARTn TX Complete Interrupt Enable): 송신완료 인터럽트
- UDRIEn (USARTn Data Register Empty Interrupt Enable) : 송신 데이터 레지스터 준비완료 인터럽트
- RXENn (USARTN Receiver Enable) : 수신부 동작허용, 직렬 데이터 수신단자로 동작하도록 설정하며,
FEn , DORn, UPEn 의 동작을 유효하게 함
- TXENn (USARTn Transmitter Enable) : 송신부 동작허용
- UCSZn2 (USARTn Character Size) : UCSRnC 레지스터의 UCSZn1~0 비트와 함께 전송 문자의 비트수를
설정
- RXB8n (USARTn Receiver Data 8Bit) : 전송문자가 9비트로 설정된 경우 수신된 문자의 9번째 비트
(MSB)를 저장. 반드시 UDRn 레지스터 보다 먼저 읽어야 함
- TXB8n (USARTn Transmit Data 8Bit) : 전송문자가 9비트로 설정된 경우 송신할 문자의 9번째 비트
(MSB)를 저장. 반드시 UDRn 레지스터 보다 먼저 라이트되어야 함
⊙ USART 제어 및 상태 레지스터 C (UCSR0C, UCSR1C)
: 송수신 동작 제어
- UMSELn (USARTn Mode Select) : 동기전송모드 시 1, 비동기 전송모드 시 0
- UPMn1~0 (USARTn Parity Mode) : 패리티 모드 설정
- USBSn (USARTn Stop Bit Select)
USBSn = 0 , Stop Bit 1 USBSn = 1, Stop Bit
⊙ USART 제어 및 상태 레지스터 C (UCSR0C, UCSR1C)
- UCSZn1~0 (USARTn Character Size) : UCSRnB 레지스터의 UCSZn2 비트와 함께 전송 문자의 데이터
비트수를 설정
- UCPOLn (USARTn Clock Polarity) : 동기 전송모드의 슬레이브 동작에서만 유효
UCPOLn = 0, 송신데이터는 XCKn 클럭의 상승 에지에서는 새로운 값이 출력되고, 수신 데이터는 XCKn
클럭의 하강 에지에서 검출
UCPOLn = 1 이면 송신 데이터는 XCKn 클럭의 하강 에지에서 새로운 값이 출력되고 수신 데이터는 XCKn
클럭의 상승 에지에서 검출
⊙ USART BAUD RATE REGISTER (UBRR0H/L , UBRR1H/L)
: 16비트 중 12비트 만 유효, 송수신 속도를 설정, 클럭의 분주비로 작용하여 직렬포트의 전송속도인
보레이트를 결정
1-3 USART0 실습 1
☞ 송신은 폴링 방식, 수신은 인터럽트 방식으로 PC와 연결하여 USART0로 데이터를 받으면
그 받은 데이터를 전송하는 프로그램
#include <mega128.h>
#include <delay.h>
#define UDRE0 5
void TxData(char data)
{
while(!(UCSR0A & (1<<UDRE0))); // UDRE0 CHECK
//while((UCSR0A & 0x20) == 0X00);
UDR0 = data;
}
interrupt [USART0_RXC] void usart0_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0;
TxData(data);
}
void main(void)
{
// 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=0x98;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x67; //16MHz일 때
//UBRR0L=0x33; //8MHz일 때
#asm("sei")
while (1)
; // do nothing
}
'ATmega128' 카테고리의 다른 글
| USART로 데이터 보내고 받기 (0) | 2009/04/29 |
|---|---|
| USART 제어 (0) | 2009/04/28 |
| DK128 Main (0) | 2009/04/23 |
'ATmega128' 카테고리의 다른 글
| USART로 데이터 보내고 받기 (0) | 2009/04/29 |
|---|---|
| USART 제어 (0) | 2009/04/28 |
| DK128 Main (0) | 2009/04/23 |



Prev
