Witam wszystkich serdecznie.
To są moje (jakby to powiedzieć) pierwsze kroki z pisaniem w C.
Nabazgrałem sobie niby prosty program, który powinien odebrać paczkę danych, sprawdzić, czy jest jej koniec oraz wysłać zawartość bufora na PORT C + ustawianie sygnałów sterujących na PORT A - Pomijam kwestie, typu timeout - to zostawiam na później do oprogramowania.
Długość paczki danych jest zmienna i zawiera się (na razie) w przedziale od 3 do ok. 32 bajtów.
Generalnie, jest to strumień danych dla układu PSG AY-3-8913 który wysyłam z komputera.
W skrócie - µP odbiera bajty; sprawdza, czy jest koniec (znaki eb w buforze); odczekuje odpowiednią ilość przerwań; wysyła dane do PSG, wysyła znak 'n' poprzez UART i cykl powinien się powtarzać...
Niestety, program na µP wysypuje się czasami na pierwszym wysłanym znaku poprzez port szeregowy, czasami można wysłać około 11kB - muzyka wydobywa się z układu, dopóki procesor się nie zawiesi/nie zresetuje.
Od strony technicznej -> Płytka uniwersalna UM-17, ATMEGA644 w podstawce, kilkanaście kondensatorów blokujących 100nF na linii zasilania, jak i przy samym procku + kilka szt elektrolitów 10..47uF na linii zasilania, /RESET podciągnięty rezystorem 3k9 + dodatkowo kondensator 2,2nF; kwarc 22,1184MHz z przylutowaną obudową do masy oraz kondensatorami 33pF (niestety tylko takie miałem w szufladzie); układ dźwiękowy jest na zwykłej stykówce - także tutaj mnóstwo kondensatorów 100nF oraz 10uF i kabelki podpinanie przez goldpiny. Zasilanie biorę z zasilacza laboratoryjnego.
Podobny kod (o dziwo) śmiga mi na attiny2313V@28,224MHz - ale tam odbieram na sztywno ramkę 4 bajtów i ustawiam preskaler/rejestr OCR w celu wygenerowania częstotliwości 1,764MHz dla PSG oraz odpada mi przerwanie timer'a - wykorzystuje sprzętowe zmienianie stanu pinu na przeciwny (tryb CTC + toggle OC0B)
Podejrzewam, że najprawdopodobniej dochodzi do kolizji przy przerwaniach, ale nie mogę tego rozgryźć. Gdzie popełniłem błąd?
Mogę dać mini bibliotekę do obsługi hd44780 (lcd595.h/lcd595.c pisaną dawno temu) ale wątpię, by tam występował problem, gdyż tylko raz wysyłam ciąg znaków do LCD, poza tym dotychczas nie było z nią problemów w innych zastosowaniach.
Przepraszam za te gryzmoły poniżej - stare nawyki z TASM/Pascal/Basic, rozdzielczości 80x25 znaków itp... Musze się ogarnąć :/
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.