Witam forumowiczów Elektrody
Trudno mi powiedzieć, czy prawidłowo zdefiniowałem w temacie problem (raczej nie), bo w gruncie rzeczy nie wiem, dlaczego mój program zachowuje się w taki sposób. A oto jak się zachowuje.
Opis działania programu:
Odebrany z interfejsu UART pojedynczy znak odbij natychmiast z powrotem. Czyli takie echo "nielokalne".
Efekt:
Niektóre ze znaków wracają prawidłowo, inne zamieniają się w krzaki bądź zupełnie inne znaki, np.:
...itd. Sądzę, że dalej wymieniać nie ma potrzeby
Do odbioru znaku wykorzystywane jest przerwanie UART, tak jak to widać w kodzie poniżej:
Jako terminala używałem programów minicom i HyperTerminal. Na obu efekt identyczny.
Dodam, że tematyka AVR to dla mnie trochę nowość, zajmuję się tym od około 2 miesięcy i na pewno wielu rzeczy nie wiem. Jeżeli problem, który tu poruszam jest w jakiś sposób banalny to proszę o wyrozumiałość
Aha, no i mam nadzieję, że nie powieliłem tematu na forum, ale naprawdę trudno było mi zdefiniować problem, stąd nie sposób znaleźć odpowiedź.
I jeszcze może jedna rzecz, być może będzie to jakaś wskazówka. Gdy w obsłudze przerwania miałem taki ciąg instrukcji:
wówczas zamiast znaków wracały tylko i wyłącznie krzaki (i wszystkie takie same). Zbyt długa obsługa przerwania?
Będę niezmiernie wdzięczny za wszelkie wskazówki. Słowa krytyki również wskazane
Pozdrawiam.
Trudno mi powiedzieć, czy prawidłowo zdefiniowałem w temacie problem (raczej nie), bo w gruncie rzeczy nie wiem, dlaczego mój program zachowuje się w taki sposób. A oto jak się zachowuje.
Opis działania programu:
Odebrany z interfejsu UART pojedynczy znak odbij natychmiast z powrotem. Czyli takie echo "nielokalne".
Efekt:
Niektóre ze znaków wracają prawidłowo, inne zamieniają się w krzaki bądź zupełnie inne znaki, np.:
w -> w e -> g r -> r
t -> v u -> w i -> o
o -> o p -> ~ s -> s
d -> f f -> f ...itd. Sądzę, że dalej wymieniać nie ma potrzeby
Do odbioru znaku wykorzystywane jest przerwanie UART, tak jak to widać w kodzie poniżej:
SIGNAL (SIG_UART_RECV){
unsigned char c;
c = UDR;
rsSend(c);
}
void rsSend(unsigned char data){
while( !(UCSRA & (1<<UDRE)));
UDR = data;
}Jako terminala używałem programów minicom i HyperTerminal. Na obu efekt identyczny.
Dodam, że tematyka AVR to dla mnie trochę nowość, zajmuję się tym od około 2 miesięcy i na pewno wielu rzeczy nie wiem. Jeżeli problem, który tu poruszam jest w jakiś sposób banalny to proszę o wyrozumiałość
Aha, no i mam nadzieję, że nie powieliłem tematu na forum, ale naprawdę trudno było mi zdefiniować problem, stąd nie sposób znaleźć odpowiedź.
I jeszcze może jedna rzecz, być może będzie to jakaś wskazówka. Gdy w obsłudze przerwania miałem taki ciąg instrukcji:
SIGNAL (SIG_UART_RECV){
LEDY_ON();
unsigned char c;
c = UDR;
rsSend(c);
_delay_ms(100);
LEDY_OFF();
}wówczas zamiast znaków wracały tylko i wyłącznie krzaki (i wszystkie takie same). Zbyt długa obsługa przerwania?
Będę niezmiernie wdzięczny za wszelkie wskazówki. Słowa krytyki również wskazane
Pozdrawiam.