회원가입 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
번호 분류 제목 글쓴이 조회 수 날짜
95 PADS HOTPads 풋 프린터 관련3 12몽키 2516 2010.06.07
94 PADS HOTAllegro에서 작성한 파일을 Pads에서 불러오는 방법이 궁금합니다.3 슈팅가드 2147 2010.06.01
93 Allegro & OrCAD HOT전원 배선3 MATY 1450 2010.05.31
92 ECAD Simulation HOTPSPICE 소자값을 문자로 입력하기1 Glory 2270 2010.05.31
91 Allegro & OrCAD HOTorcad에서 회로도 그리고요 powerpcb로 import하는부분이요~~2 최강유니 1721 2010.05.29
90 Allegro & OrCAD HOTfootprint만들기 질문입니다. ㅠㅜ4 우가우가 2659 2010.05.24
89 ECAD 아무거나 HOT혹시 PCB에 문제인가요??1 KillingS 3470 2010.05.23
88 Allegro & OrCAD HOTPCB layout 질문있습니다4 TreeOfDream 1569 2010.05.15
87 PADS HOTbmp2asc1 der 3352 2010.05.11
86 Allegro & OrCAD HOT치수보조선 관련 질문 드립니다.2 TreeOfDream 1750 2010.05.10
85 ECAD 아무거나 HOTpcb설계 직종 괜찮나요??2 윤천재님 3330 2010.05.05
84 PADS HOTAuto Cad의 DXF 파일 PADS 파이로 변환할때 발생하는 오류 질문요~4 하드초보 4721 2010.04.30
83 PADS HOT부품을 찾고 있습니다..ㅠ3 딸기녀 2076 2010.04.29
82 Allegro & OrCAD HOTOrcad Layout 에서 자동배치에 관해서 질문드립니다.4 TreeOfDream 2928 2010.04.19
81 Allegro & OrCAD HOTorcad강좌에 8탄이 없네요??2 빛의속도 1681 2010.04.02
80 Allegro & OrCAD HOTOrcad Layout 라우팅질문이요8 개구리1 2363 2010.04.02
79 Allegro & OrCAD HOTorcad 질문있습니다 ^^1 전설의사나이 1497 2010.03.26
78 PADS HOTpowerpcb gerber file cam350에서 convert powerpcb에서 읽어들이기6 UNICORN 3619 2010.03.17
77 ECAD Simulation HOTpspice 버전 추천 좀2 circuit 1807 2010.03.15
76 ECAD Simulation HOT피스파이스 계단파 넣기 ch보자 3279 2010.03.13
  • 친구는 제2의 재산이다.
    - 아리스토텔레스
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.