Szukam gotowej procedury ktora spelnia funkcje uart (potrzebny jest tylko odbior).
Predkosc transmisji jest zniewalajaca bo az 100 bit/s Procedura wywolywana bedzie dokladnie co 1ms a wiec na jeden bit przypadac bedzie 10 wywolan procedury.
Project :
Version :
Date : 2006-07-02
Author : j
Company :
Comments:
Chip type : ATmega8515
Program type : Application
Clock frequency : 3,686400 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 128
*********************************************/
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
unsigned char rx_wr_index,rx_rd_index,rx_counter;
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
#pragma savereg-
interrupt [USART_RXC] void uart_rx_isr(void)
{
char status,data;
#asm
push r26
push r27
push r30
push r31
in r26,sreg
push r26
#endasm
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;
};
};
#asm
pop r26
out sreg,r26
pop r31
pop r30
pop r27
pop r26
#endasm
}
#pragma savereg+
#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 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=0x17;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
Witam. Nie chcąc bawić się z timer'ami na szybko postanowiłem napisać programowy UART z wykorzystaniem powyższego kodu. Jak na razie napisałem część wysyłania do komputera. Wprowadziłem własne modyfikacje -> LSB wysyłany pierwszy i działa. W przypadku gdy MSB był pierwszy nie chciało oczywiście nic sensownego wyświetlać. Dodam tylko że osiągnąłem jedynie max BAUD rate 1200. Pracuję pod Linuxem Pozdrawiam Radek