Witam, posiadam problem polegający na obsłudze uartu w bascomie. Potrzebuję skomunikować się z portem obd w samochodzie, jednak napotkałem problem przy inicjalizacji połączenia. Potrzebuję wysłać jeden bajt 0x33 przy prędkości baud = 5 (200ms na bit) a następnie nawiązać zwykłą komunikację przy baud = 10400. Problem pojawia się przy próbie zmiany prędkości baud. Próbowałem na wiele sposobów, a także komendy disable serial, jednak bez skutku. Czy mógłby mnie ktoś naprowadzić w jaki sposób mogę to rozwiązać?
W każdej wersji da się zmienić prędkość przecież to nic innego tylko wpisanie odpowiedniej wartości do rejestrów i można to zrobić z poziomu bascoma lub wstawki asemblerowej .
To polecenie konfiguracyjne robi to samo tylko przelicza automatycznie wartość prędkości do zadeklarowanej częstotliwości zegara. Poza tym jeśli już mowa o wysyłaniu wywołania z prędkością 5 bodów nie uzyskasz stosując klasyczny uart i rezonator w MHz. Maksymalna częstotliwość zegarowa dla której osiągniesz "5 baud" wymaga zastosowania rezonatora w praktyce zegarkowego 32,768kHz lub użycia programowego uarta . Takie wywołania zazwyczaj robi się programowo i dopiero po ich realizacji włącza się uarta oczekując na wartość 55h
Z tym że szukałem długo i nigdzie nie znalazłem sposobu jak włączyć uart z komendy. Wpisanie jakiejkolwiek komendy do obsługi uart ($baud, print itp) gdziekolwiek w kodzie powoduje brak możliwości użycia txd jako normalnego portu.
I z wielu właśnie takich powodów robi się przesiadkę z bascoma na C lub asemblera . Tu nie ma komendy trzeba zrobić wycieczkę do rejestrów mikrokontrolera i wyłączyć sobie w rejestrach konfiguracyjnych odpowiedzialnych za uarta nadajnik , odbiornik , zmienić prędkość , i wszystko co tego dotyczy i co jest nam potrzebne . Jeśli nie potrafisz wyłączyć uarta z poziomu bascoma podłącz do linii k tranzystor typu BC548 emiterem do masy , kolektorem do K i przez rezystor 1k bazą do wolnego portu i wyślij inicjalizację 5 bodów z takiego portu nie zapominając o odpowiedniej polaryzacji i pozostawieniu portu w stanie niskim ! . To też zadziała bo linia k ma rezystor 470 om do plusa zasilania a układ jedynie zwiera ją przy transmisji do masy podobnie jak to jest w magistrali i2c .
To polecenie konfiguracyjne robi to samo tylko przelicza automatycznie wartość prędkości do zadeklarowanej częstotliwości zegara.
Tak ale pozwala to zrobić tylko raz.
http://avrhelp.mcselec.com/index.html?config.htm I tak dla przykładu CONFIG SPI, nawet jak to ma być sprzętowe SPI, można wywołać tylko raz. Nie z powodu rejestrów, bo one by pozwoliły to rekonfigurować wielokrotnie, tylko z powodu kompilatora.
Podobnie CONFIG ADC.
I podobnie przy $BAUD:
http://avrhelp.mcselec.com/index.html?baud_1.htm z tym że tutaj nie jest to konfiguracja ale informowanie kompilatora. No to więc już już oczywiste że wartość można podać tylko raz.
Na szczęście dużo się w BASCOMie pozmieniało i np. jest CONFIG COM1:
http://avrhelp.mcselec.com/index.html?config_com1.htm które już można wywoływać wielokrotnie z innymi parametrami.
Ale kiedyś to też było tylko do jednokrotnego wywołania i dlatego spytałem o wersję kompilatora.
Oczywiście też jestem zdania że powinno się konfigurować wszystko rejestrami.
No ale Skojon spytał w sposób sugerujący że konfiguruje to poleceniami BASCOMa, no to mu odpowiedziałem na temat tych właśnie poleceń.
Bascom to świetne narzędzie do nauki bo szybko widać efekty i łatwo zobaczyć Hello World niestety moim zdaniem nie nadaje się on do pisania złożonych programów bo jego funkcjonalność jest mocno ograniczona i użycie sprowadza się do wstawienia wstawek asemblerowych lub wycieczki do rejestrów . Pomijając to wszystko można jeszcze trafić na jedną dolegliwość tego środowiska mianowicie wykorzystywanie przez makroinstrukcje liczników do generowania opóźnień i takim sposobem jedna taka instrukcja działa a kilka w jednym programie niekoniecznie dobrze .