회원가입 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
번호 분류 제목 글쓴이 조회 수 날짜
632 마이크로프로세서 HOT8051 소스에 관해서요..3 Do 1273 2010.06.11
631 펌웨어 & 코딩언어 HOTMFC 를 공부중입니다 API를 시작해야 하는데..3 TreeOfDream 1118 2010.06.11
630 마이크로프로세서 HOT가입하자마자 질문 먼저 올려서 죄송해요 하지만 꼭 보고 수정 부탁드려요.!6 막멀티 1254 2010.06.10
629 마이크로프로세서 HOTCAN통신 관련 질문이요 jeon_goon 1122 2010.06.09
628 마이크로프로세서 HOT8051을 배우기 시작한 대학생입니다.2 진진진 1029 2010.06.09
627 마이크로프로세서 HOT8051 과 RFID 단말기 연동 질문 입니다~1 뒹굴뒹굴 1119 2010.06.09
626 마이크로프로세서 HOTATmega128로 기판을 짜봤는데요.2 d2comet 1240 2010.06.08
625 마이크로프로세서 HOT재미는 주제입니다.. 제발 답변을..ㅠㅠ1 절제하는늑대 1072 2010.06.07
624 마이크로프로세서 HOT가변 저항 연결에 대한 질문입니다.6 dlgodnjs 3170 2010.06.07
623 마이크로프로세서 HOTAT89S52하고 AT89S51에 대하여2 끈기 1461 2010.06.06
622 마이크로프로세서 HOTR/C 서보모터 각도 계산 ㅠ 폴라리스 2008 2010.06.05
621 마이크로프로세서 HOT도트 메트릭스 랜덤으로 떨어지게 하는방법 별별이 1090 2010.06.04
620 마이크로프로세서 HOTDC모터의 동작상태를 확인할수 있는 방법이 있습니까???3 mrj 1256 2010.06.04
619 마이크로프로세서 HOTatmega128를 사용해서 칩led와 회전모터를 제어하고싶습니다.1 졸작ㅠㅠ 1107 2010.06.04
618 마이크로프로세서 HOT8051로 비트매니아 만드는법좀2 별별이 1006 2010.06.04
617 Software & IDEs HOT마이크로 컨트롤러 질문???5 진구짱 972 2010.06.04
마이크로프로세서 HOTAVR UART 통신관련문의1 정신나간천사 2543 2010.06.03
615 마이크로프로세서 HOTh bridge dc motor 제어를 해야하는데요...2 스판츄리닝 1512 2010.06.03
614 마이크로프로세서 HOTcds센서를 이용한 LED켜기......3 메카2 1263 2010.06.03
613 마이크로프로세서 HOTcds센서소스 해석 부탁 드립니다~3 메카2 1860 2010.06.03
Prev 1 ... 22 23 24 25 26 27 28 29 30 31 ... 58 Next
  • 일반적인 인간을 아는 것은 한 사람 한 사람의 인간을 아는 것보다 쉽다.
    - 라 로슈프코
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.