회원가입 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
번호 분류 제목 글쓴이 조회 수 날짜
2844 Software & IDEs HOT마이크로 컨트롤러 질문???5 진구짱 972 2010.06.04
2843 자유주제 HOTAtmega88, Atmega2560 자료 있으신분... 전산쟁이 7794 2010.06.04
2842 자유주제 HOTUART 통신을 통해 PC모니터링 프로그램작성중입니다. 타미아 7727 2010.06.04
2841 전기전자 아무거나 HOT논리회로 과목의 과제인데 재료가 뭔지좀 알려주세요!3 보니엄마 1567 2010.06.04
2840 자유주제 HOT드디어 97납 돌파12 납연기 4757 2010.06.04
2839 자유주제 HOT원피스 선거 풍자만화9 우스기 1607 2010.06.04
마이크로프로세서 HOTAVR UART 통신관련문의1 정신나간천사 2543 2010.06.03
2837 자유주제 HOT한석봉 어머니의 비밀18 삐요삐요 2136 2010.06.03
2836 자유주제 HOTi'm on a vote!6 삐요삐요 1834 2010.06.03
2835 자유주제 HOT대륙의아파트17 삐요삐요 1777 2010.06.03
2834 마이크로프로세서 HOTh bridge dc motor 제어를 해야하는데요...2 스판츄리닝 1512 2010.06.03
2833 전기전자 아무거나 HOTPCB AC 라인 패턴 질문~이요!3 오실로 1655 2010.06.03
2832 마이크로프로세서 HOTcds센서를 이용한 LED켜기......3 메카2 1263 2010.06.03
2831 전기전자 아무거나 HOTATTiny2313으로 프로젝트 중인데요 ㅠㅠ2 mrj 1045 2010.06.03
2830 마이크로프로세서 HOTcds센서소스 해석 부탁 드립니다~3 메카2 1860 2010.06.03
2829 마이크로프로세서 HOTatmega128 ADC관련.3 전자공학고고 1225 2010.06.03
2828 펌웨어 & 코딩언어 HOT펌웨어 엔지니어입니다. 윈도우응용프로그램 MFC하고싶은데...6 상하이찬 1562 2010.06.02
2827 마이크로프로세서 HOT칼만필터에 관해 자세히 알려주세요 상하이찬 991 2010.06.02
2826 자유주제 HOT나도 찍어줘 ...10 새콤달콤ㅋ 1624 2010.06.01
2825 PADS HOTAllegro에서 작성한 파일을 Pads에서 불러오는 방법이 궁금합니다.3 슈팅가드 2007 2010.06.01
  • 맹세는 말에 지나지 않고, 말은 바람에 지나지 않는다.
    - 버틀러
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.