회원가입 ID/PW 찾기
AA

부탁드립니다.~ 꽤나 끙끙거려도 이유를 못찾겠네요~
아래 소스는 Codevision에서 작성한 UART 송수신 코드입니다.

우선 실제 하고자하는 프로그램작성전에 PC-->AVR로 수신된 문자를 그대로 AVR-->PC로 송신함으로써 송수신 테스트를 하려고 하였습니다.

PC --> AVR로의 통신은 잘 됩니다 확인도 하였구요!
문제는 AVR-->PC로의 통신이 전혀되지 않네요~!  (뭐가 잘못되었을까요` ㅜㅜ)

AVR 측면에서 PC로 부터 데이터가 수신되면 수신 인터럽트가 바로 수행되는데요~
AVR 측에서 송신 인터럽트를 따로 발생시키는 방법이 있는건가요?

제발 부탁드립니다. 여러 책을 참고해도 갈길이 아주 머네요~

=========================================================================

#include <mega128.h>

#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)


unsigned char temp=0, rdata;
// USART0 Receiver buffer
#define RX_BUFFER_SIZE0 8
char rx_buffer0[RX_BUFFER_SIZE0];

 

#if RX_BUFFER_SIZE0<256
unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;
#else
unsigned int rx_wr_index0,rx_rd_index0,rx_counter0;
#endif

// This flag is set on USART0 Receiver buffer overflow
bit rx_buffer_overflow0;

// USART0 Receiver interrupt service routine
interrupt [USART0_RXC] void usart0_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0; 
temp=1; //수신 인터럽트가 동작하면
rdata=data; // 수신된 데이터를 rdata에 저장하였습니다.
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer0[rx_wr_index0]=data;
   if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
   if (++rx_counter0 == RX_BUFFER_SIZE0)
      {
      rx_counter0=0;
      rx_buffer_overflow0=1;
      };
   };
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART0 Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter0==0);
data=rx_buffer0[rx_rd_index0];
if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
#asm("cli")
--rx_counter0;
#asm("sei")                                  
UDR0 =data;
return data;
}
#pragma used-
#endif

// USART0 Transmitter buffer
#define TX_BUFFER_SIZE0 8
char tx_buffer0[TX_BUFFER_SIZE0];

#if TX_BUFFER_SIZE0<256
unsigned char tx_wr_index0,tx_rd_index0,tx_counter0;
#else
unsigned int tx_wr_index0,tx_rd_index0,tx_counter0;
#endif

// USART0 Transmitter interrupt service routine
interrupt [USART0_TXC] void usart0_tx_isr(void)
{
if (tx_counter0)
   {
   --tx_counter0;
   UDR0=tx_buffer0[tx_rd_index0];
   if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0;
   };
}

#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART0 Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter0 == TX_BUFFER_SIZE0);
#asm("cli")
if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0))
   {
   tx_buffer0[tx_wr_index0]=c;
   if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0;
   ++tx_counter0;
   }
else
   UDR0=c;
#asm("sei")
}
#pragma used-
#endif

// Standard Input/Output functions
#include <stdio.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Port E initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTE=0x00;
DDRE=0x00;

// Port F initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTF=0x00;
DDRF=0x00;

// Port G initialization
// Func4=In Func3=In Func2=In Func1=In Func0=In
// State4=T State3=T State2=T State1=T State0=T
PORTG=0x00;
DDRG=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
ASSR=0x00;
TCCR0=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
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=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;
TCNT2=0x00;
OCR2=0x00;

// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: Timer 3 Stopped
// Mode: Normal top=FFFFh
// Noise Canceler: Off
// Input Capture on Falling Edge
// OC3A output: Discon.
// OC3B output: Discon.
// OC3C output: Discon.
// Timer 3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=0x00;
TCCR3B=0x00;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: Off
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=0x00;
EICRB=0x00;
EIMSK=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
ETIMSK=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;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")

while (1)
      {
      // Place your code here      
     
      if(temp==1){ //수신된 데이터가 있는경우
      putchar(rdata);         //수신된 데이터를 그대로 송신하고자 하였습니다.
      temp=0;
      };


      };
}
======================================================================

댓글 1
  • No Profile
    아래 319번 글에 제가 올려드린 소스가 있습니다...그거 참조하세요..
    링버퍼 구현해 놓은거니 도움이 될겁니다.

     putchar 와 TX 인터럽트 부분의 코딩이 부족한것 같습니다.
    다만 제가 올려놓은 코드는 IAR 용인데 소스 코드야 그닥 차이없으니까요..

하드웨어 설계 및 개발에 대하여 개발자들이 자유롭게 토론하는 공간입니다.
- Q&A, 자유주재 토론, 관련 정보 공유
- 분야 : 마이크로프로세서 응용, 전기/전자(아날로그/디지털) 회로 설계, C/C++ 프로그래밍, 펌웨어,
         PCB Artwork, 트러블슈팅 등 하드웨어 설계에 관한 전반인 내용
※ 게시글에 맞는 분류를 선택하여 글을 작성해 주시면 쾌적한 사이트 운영에 많은 도움이 됩니다.
※ 하드웨어 인사이트는 회원들간의 거래정보를 게재할 뿐이지, 그 어떤 책임과 의무도 가지지 않습니다.

search
번호 분류 제목 글쓴이 조회 수 날짜
114 PADS HOTpads 2007을 Window7에 설치할수 있나요?15 도연사랑 6577 2010.08.12
113 Allegro & OrCAD HOTorCAD Capture에서 회사 로고 따위 삽입하기?3 Kaye 4707 2010.08.09
112 PADS HOTartwork에 관해 궁금한점이있습니다.4 artwork고수과정코스 1741 2010.08.05
111 ECAD 아무거나 HOT임피던스?10 엠군 4480 2010.08.03
110 Allegro & OrCAD HOT아래 내용과 이어지는 오류입니다. 노뜨라인 1994 2010.08.03
109 PADS HOTartwork 부품배치 및 배선에 관련된 질문입니다.2 dkqp 2127 2010.07.30
108 ECAD Simulation HOT회로자체가 구성이 안되는지 계속 오류가 납니다.(구형파-> 4017counter)2 노뜨라인 2409 2010.07.25
107 Allegro & OrCAD HOTorcad 파형보는데 계속 오류가 나네요..2 노뜨라인 2278 2010.07.08
106 Allegro & OrCAD HOTorcad layout 보드 크기 표시2 TreeOfDream 1435 2010.07.04
105 PADS HOT현재 PCB를 가지고있는데요10 레즈온 1862 2010.06.30
104 PADS HOTPADS2007 설치관련 질문드려요7 식당 5627 2010.06.29
103 ECAD Simulation HOTDependent Source를 Psipce에 그리는방법...1 참치통조림 2295 2010.06.29
102 PADS HOT서적 추천좀 부탁드립니다.5 레즈온 1886 2010.06.24
101 Allegro & OrCAD HOTlayout 가 없는데요..2 그냥이임 1448 2010.06.16
100 Allegro & OrCAD HOTorcad에 관하여 궁금한점[이론] 케빈네쉬 1452 2010.06.15
99 PADS HOTPADS에 입문하고 싶은데요..12 쩡투 2034 2010.06.14
98 Allegro & OrCAD HOT코퍼깔고 비아를 넣었는대 작업이 안된선이 있는것으로 나오면? 어떻게 해야 하나요 ?4 우가우가 1701 2010.06.14
97 ECAD 아무거나 HOT혼자서 집에서 에칭 하고 있습니다1 TreeOfDream 3814 2010.06.13
96 Allegro & OrCAD HOT전자캐드기능사 준비중2 12몽키 1534 2010.06.07
95 PADS HOTPads 풋 프린터 관련3 12몽키 2238 2010.06.07
  • 청년기는 대실수이다. 장년기는 투쟁이다. 그리고 노년기는 후회이다.
    - 디즈레일리
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.