 
 В общем нужно:
1 Прерывание по получению данных из UDR
2 Включение таймера на 100мС(Каждый раз когда приходит байт, таймер перезапускается)
3 Формирование буфера из принятых по UDR байт (buf(n)+ = UDR) и подсчёт количества n
4 Прерывание по срабатыванию таймера(по истечении 100мС) т.е. последовательный приём n байт окончен.
5 Отправка n байт одной посылкой через UDR (цикл)
6 Обнуление n
Текст программы на С
- Код: Выделить всё • Развернуть
- [color=#008040]#include <mega16.h>
 #include <m8_128.h>
 // Standard Input/Output functions
 #include <stdio.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)
 int BUF[100]; //Объявляем количество буфера
 int n;
 // USART Receiver buffer
 /*#define RX_BUFFER_SIZE 100
 char rx_buffer[RX_BUFFER_SIZE];
 #if RX_BUFFER_SIZE<256
 unsigned char rx_wr_index,rx_rd_index,rx_counter;
 #else
 unsigned int rx_wr_index,rx_rd_index,rx_counter;
 #endif
 // This flag is set on USART Receiver buffer overflow
 bit rx_buffer_overflow;
 // USART Receiver interrupt service routine
 interrupt [USART_RXC] void usart_rx_isr(void)
 {
 char status,data;
 status=UCSRA;
 data=UDR;
 if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
 {
 rx_buffer[rx_wr_index]=data;
 if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
 if (++rx_counter == RX_BUFFER_SIZE)
 {
 rx_counter=0;
 rx_buffer_overflow=1;
 };
 };
 }
 #ifndef _DEBUG_TERMINAL_IO_
 // Get a character from the USART Receiver buffer
 #define _ALTERNATE_GETCHAR_
 #pragma used+
 char getchar(void)
 {
 char data;
 while (rx_counter==0);
 data=rx_buffer[rx_rd_index];
 if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
 #asm("cli")
 --rx_counter;
 #asm("sei")
 return data;
 }
 #pragma used-
 #endif
 // USART Transmitter buffer
 #define TX_BUFFER_SIZE 100
 char tx_buffer[TX_BUFFER_SIZE];
 #if TX_BUFFER_SIZE<256
 unsigned char tx_wr_index,tx_rd_index,tx_counter;
 #else
 unsigned int tx_wr_index,tx_rd_index,tx_counter;
 #endif
 // USART Transmitter interrupt service routine
 interrupt [USART_TXC] void usart_tx_isr(void)
 {
 if (tx_counter)
 {
 --tx_counter;
 UDR=tx_buffer[tx_rd_index];
 if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
 };
 }
 #ifndef _DEBUG_TERMINAL_IO_
 // Write a character to the USART Transmitter buffer
 #define _ALTERNATE_PUTCHAR_
 #pragma used+
 void putchar(char c)
 {
 while (tx_counter == TX_BUFFER_SIZE);
 #asm("cli")
 if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
 {
 tx_buffer[tx_wr_index]=c;
 if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
 ++tx_counter;
 }
 else
 UDR=c;
 #asm("sei")
 }
 #pragma used-
 #endif
 */
 // Timer 1 overflow interrupt service routine
 interrupt [TIM0_OVF] void timer0_ovf_isr(void)
 {
 UDR=BUF[n];
 }
 void main(void)
 {
 // Timer/Counter 0 initialization
 // Clock source: System Clock
 // Clock value: Timer 0 Stopped
 // Mode: Normal top=FFh
 // OC0 output: Disconnected
 TCCR0=0x00;
 TCNT0=0xB8;
 OCR0=0x00;
 // USART initialization
 // Communication Parameters: 8 Data, 1 Stop, No Parity
 // USART Receiver: On
 // USART Transmitter: On
 // USART Mode: Asynchronous
 // USART Baud rate: 9600
 UCSRA=0x00;
 UCSRB=0xD8;
 UCSRC=0x86;
 UBRRH=0x00;
 UBRRL=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 (!(UCSRA & (1<<RXC)))
 {
 if (BUF[n]=UDR)
 {
 n++;
 TCCR0 = 0x00;
 TCNT0=0xB8;
 TCCR0 = 0x01; //start timer - clock/1024
 TIMSK=0x01;
 }
 else(!(UCSRA & (1<<TXC)));
 {
 TIMSK |= (1<<TOIE0);
 TIFR|=(1<<TOV0);
 }
 }
 }
программировать только начинаю, по этому не обессутьте, и пожалста помогите, чем сможите


 
 

 ):
 ):


