Problem, w zasadzie coś co jest już wałkowane na forum wielokrotnie, ale mimo przeczytania kilku wątków nie znalazłem odpowiedzi. Otóż potrzebuję zrobić odbiór poprzez uart. Korzystam z Atmegi 32(w zestawie ewaluacyjnym, zewnętrzny kwarc) i środowiska WinAvr. Wysyłanie z mikrokontrolera udało mi się uruchomić, odbioru przez uC nie do końca.
Komunikacja przez uart jest tylko częścią całego większego programu.
Odbierać chce poprzez przerwanie,w momencie pojawienia się danych.
To co mam na chwile obecną:
Strumień:
Chciałbym móc odczytywać gdy zgłaszane jest przerwanie. W poniższym przykładzie jest to tylko jeden znak, oczywiście najlepiej było by ze strumienia.
niestety nie działa.Wszystko jest dobrze podłączone bo odbiór mi działa. Nadawanie zresztą też, tzn zbierał pojedyncze PRZYPADKOWE znaki gdy wpisałem to co poniżej w przerwaniu od timera(ale to było dla testów). Wolałbym jednak przez przerwanie ze względu na rozbudowany program. Może trzeba odblokować jakoś globalnie to przerwanie...
Komunikacja przez uart jest tylko częścią całego większego programu.
Odbierać chce poprzez przerwanie,w momencie pojawienia się danych.
To co mam na chwile obecną:
#include <avr/io.h>
void USART_Init(int baud)
{
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
UCSRB = (1<<RXEN)|(1<<TXEN);
UCSRC = (1<<URSEL)|(3<<UCSZ0);
}
void USART_PutChar(unsigned char data)
{
while (!(UCSRA & (1 << UDRE)));
UDR = data;
}
//-------------------------------------
// Receive single char
//-------------------------------------
unsigned char USART_GetChar(void)
{
while (!(UCSRA & (1 << RXC)));
return UDR;
}
//-------------------------------------
// Send string
//-------------------------------------
void USART_PutString(char * s)
{
while(*s)
USART_PutChar(*s++);
}
//-------------------------------------
// Receive string
//-------------------------------------
void USART_GetString(char * s)
{
char c;
do{
c = USART_GetChar();
USART_PutChar(c);
if(c=='\b') // if backspace
s--;
else
*s++ = c;
if(c == '\r') // if CR
*s = 0;
}while(c != '\r');
}Strumień:
FILE uart_str = FDEV_SETUP_STREAM(USART_PutChar, USART_GetChar, _FDEV_SETUP_RW);Chciałbym móc odczytywać gdy zgłaszane jest przerwanie. W poniższym przykładzie jest to tylko jeden znak, oczywiście najlepiej było by ze strumienia.
niestety nie działa.Wszystko jest dobrze podłączone bo odbiór mi działa. Nadawanie zresztą też, tzn zbierał pojedyncze PRZYPADKOWE znaki gdy wpisałem to co poniżej w przerwaniu od timera(ale to było dla testów). Wolałbym jednak przez przerwanie ze względu na rozbudowany program. Może trzeba odblokować jakoś globalnie to przerwanie...
ISR(USART0_RX_vect)
{
volatile char c;
c=USART_GetChar();
LCD_clear();
fprintf(stderr,"in %c",c);
delay_1s();
}