8 MHz. Próbowałem i na wewn. rezonatorze, i na kwarcu zewn. (też 8)
Kod:
#define UART_BAUD 9600
#define __UBRR ((F_CPU+UART_BAUD*8UL) / (16UL*UART_BAUD)-1)
Atmega 1284P, nazwy rejestrów poprawne - musiałem wprowadzić niewielkie zmiany w stosunku do bibliotek, posługując się Datasheetem.
Co ciekawe, cała obsługa uarta w funkcji main() działa. Natomiast problemy zaczynają się, gdy wrzucam ją do funkcji init(), która jest jednorazowo wywoływana przez main(). Poza przerwaniem do obsługi nadawania znaków przez uart (z bliblioteki) w programie nie wykorzystuję żadnych innych przerwań.
------------------------ [ Dodano po: 27 minutach ]Postaram się zaraz zlokalizować miejsce w tej funkcji, od którego uart zaczyna wariować. Bardzo to wszystko dziwne
------------------------ [ Dodano po: 44 minutach ]Nie widzę żadnej logicznej przyczyny. Jak zrobię tak:
Kod:
uart_puts("Ending init_display\r\n");
uart_puts("Ending init_display\r\n");
, to PuttY wyświeli mi:
Kod:
Ending init_display
Ending
Jak zrobię tak:
Kod:
uart_puts("Ending init_display\r\n");
uart_puts("Ending init_display\r\n");
uart_puts("Ending init_display\r\n");
uart_puts("Ending init_display\r\n");
,
to PuTTY pokaże tak:
Kod:
Ending init_display
Ending init_display
Ending init_display
Ending
Natomiast przeniesienie tego w inne, losowe miejsce w kodzie sprawia, że działa.
Badałem instrukcje występujące i przed, i po. Niczego niezwykłego nie znalazłem.
Zaczynam już podejrzewać jakiś dziwny błąd kompilatora.
------------------------ [ Dodano po: 46 minutach ]Jak po każdej z tych instrukcji dałem delay_ms(10), to teraz w ostatnim wierszu mam:
Ending init_dis
------------------------ [ Dodano po: 52 minutyach ]Zrobiłem jeszcze jeden test i jest jeszcze dziwniej:
Program testowy, raptem parę linijek. Reszta wykomentowana. Nic poza tym.
W funkcji main robię uart_puts "Starting".
Potem wchodzę do tej feralnej funkcji i wywołuję tam parę razy to uart_puts "Ending init display".
Gdy nastąpi powrót z tejże funkcji do main, już w ramach main wywołuję to ostatnie
uart_puts "Ending init display".
I problem jest ten sam. Obcina końcówkę.
Ale teraz najlepsze. Jak na końcu dam _delay_ms(20), do działa.
Ale jak nie dam delaya, za to zakończę w tym miejscu funkcję main, żeby po uart_puts już absolutnie niczego nie było, tylko koniec programu, to znów nie działa.