Witajcie, może mi ktoś podpowiedzieć co robię źle , że ten prosty program nie działa jak należy ?
Otóż mam pilota który nadaje RS-em wolniutko, zaledwie 300 bodów kilka kodów ASCII (zwykłe pojedyncze znaki). Tu wszystko działa, Hyper Terminal te znaki pięknie rozpoznaje i jest OK. Pilot nadaje dla pewności po trzykroć każdy znak. Czyli nadaje np. "AAA" lub "BBB". HyperTerminal bezbłędnie to wyświetla
No a w drugiej części projektu (inny kontroler , inna płyteczka, część odbiorcza) chcę te znaki odbierać i odpowiednio interpretować. Obie platformy na tym samym zegarze (1MHz internal co przy tych prędkościach transmisji jest w zupełności wystarczające), oba z tymi samymi kontrolerami (Atmega16). Ze względu na to że część odbiorcza będzie miała coś do roboty w pętli oczekiwania , odbieranie nadlatującego znaku z ASCII muszę mieć poprzez mechanizm przerwań , nadlatujący znak po odebraniu zgłasza przerwanie i ma nastąpić obsługa przerwania z prostym zainterpretowaniem co to za znak przybył. No niby zadanie proste ale mimo to nie chce mi to ruszyć , widać że kontroler włazi w przerwanie ale nie interpretuje mi niczego co do niego wysyłam, mimo już kilkukrotnych analizach inicjalizacji USART w części odbiorczej. Części nadawczej się nie czepiam , skoro nadaje i robi to dobrze.
Zerknijcie proszę w mój kod i podpowiedzcie mi czy ja już czegoś nie widzę czy co ?
Oto kod :
Inicjalizacja UART :
Kod:
void USART_Init(uint16_t baud)
{
UBRRH = (uint8_t)(baud>>8); /* Set baud rate */
UBRRL = (uint8_t)baud;
UCSRA = (1<<RXC);
UCSRB = (1<<RXEN)|(1<<RXCIE); //włącz odbiornik i zezwól na generowanie przerwania przy odbiorze danych
UCSRC = (1<<URSEL)|(3<<UCSZ0); //ustalenie ramki na 8 bitów danych, 1 bit stopu
}
Przykłądowa pętelka oczekiwania na znak:
Kod:
USART_Init(300); //inicjalizacja USART
sei();
for(;;) //pętla nieskończona
{
wdt_reset(); //reset psa
// odbierz_dane_NRF(); //sprawdź nadchodzące dane z pilota - radiowo
// zmierz_prad(); //sprawdzaj prąd w obwodach silnika
led1_toggle;
_delay_ms(1000);
}
No i moja obsługa przerwania :
Kod:
ISR(USART_RXC_vect)
{
cli(); //zablokuj globalnie przerwania
dane_RX = UDR; //przepisanie danych z bufora sprzętowego
if (dane_RX=='A') {PORTC |= (AUX1)}
if (dane_RX=='B') {PORTC |= (AUX2)}
if (dane_RX=='C') {PORTC |= (AUX3)}
USART_Flush();
led2_toggle;
sei(); //odblokuj przerwania
}
Może dodam jeszcze na zakończenie że korzystając z Hyper Terminala nadaję te znaki z niego i też "kicha" , nic się nie dzieje prócz zasygnalizowania wejścia w przerwanie. Oscyloskop podłączony w linię RxD pokazuje że przebiegi ramki którą na nią wysyłam są jak najbardziej OK. No i zgłupiałem

PROSZĘ POPRAWIĆ WSTAWIANIE KODÓW NA FORUM --- INACZEJ POST ULEGNIE USUNIĘCIU !! --> SunRiver
topic14999.html