Programuje dla mikrokontrolera w WinAVR. Zbudowalem funkcje nadawania do USART1. Uruchomilem ja na poczatku bez uzycia przerwan i wszystko jest w porzadku. Schody zaczely sie gdy probuje uruchomic przerwanie nadajnika. Mimo podparcia sie dokumentacja avr-libc i datascheet mikrokontrolera jakos nie chce mi program wejsc w przerwanie po wyslaniu z nadajnika. Program inicjalizuje USART mikrokontrolera tak: void USARTinit(uchar Port, int baud, uchar bits, uchar Parity, uchar stopBits) { switch(baud){ /* Set baud rate */ case 9600: baud = 12; break; }
UBRR1H = (uchar)(baud>>8); UBRR1L = (uchar)baud; switch(bits){ /* Set data bits */ case 8: UCSR1C = (3<<UCSZ0); break; }
switch(Parity){ /* Set Parity */ case 'e': UCSR1C |= (2<<UPM0); break; } switch(stopBits){ /* Set stop bits */ case 2: UCSR1C |= (1<<USBS); break; // two stop bits } UCSR1B = 1<<TXEN; /* Enable transmitter */ }
funkcja wysylajaca wyglada tak: void USARTtrans( uchar data ) { while ( !( UCSR1A & (1<<UDRE)) ); /* Wait for empty transmit buffer */ UDR1 = data; /* Put data into buffer, sends the data */ sei (); }
jest do tego jeszcze funkcja obslugujaca przerwanie uruchamiane po oproznieniu rejestru nadajnika SIGNAL( SIG_USART1_TRANS ){ flash2Slow(); }
Program wedlug tego co napisalem ma wyslac jeden znak i powienien wejsc w przerwanie gdzie jest funkcja migajaca LEDami. Niestety nic takiego sie nie dzieje. Miga w petli inny LED w funkcji main a ten ciagle milczy. Wydaje mi sie, ze wszystko jest ustawione O.K. i nie wiem dlaczego to nie dziala. Ustawialem funkcje przerwaniowa rowniez jako INTERRUPT- bez efektu. Teraz juz mikrokontroler na pewno dziala w trzybie ATmega128 wiec ta przyczyna odpada. Co ciekawe gdy ustawie ciagle wysylanie znakow do portu (bez przerwan) to na komputerze w terminalu widze, ze port dziala. Podejzewam, ze przyczyna jest jakas prozaiczna ale nie moge na to wpasc. Bardzo was prosze o pomoc.
Jacek M.