logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[BASCOM] - UART- dwu kierunkowy przesył zmiennych.

werewolf15 05 Sie 2013 06:35 5577 38
Najlepsze odpowiedzi

Jak poprawnie przesyłać dwukierunkowo zmienne między dwoma AVR przez UART w BASCOM, żeby od razu odbierać właściwą wartość zamiast kolejnych cyfr 1, 22, 222?

Użyj `PRINTBIN` i `INPUTBIN`, a nie `PRINT` i `INPUT`, bo wersje bez `BIN` działają tekstowo, czekają na zakończenie linii i potrafią powodować takie efekty jak 1, potem 22, a dopiero potem 222 [#12596830][#12597109] `INPUTBIN` odbiera dokładnie tyle bajtów, ile wynika z typu zmiennej, więc dla `Byte` jeden bajt, dla `Integer` dwa, a dla `Long` cztery [#12597109][#12600761] Jeśli program robi się bardziej rozbudowany, lepiej odebrać dane w przerwaniu UART RX i wysyłać je w ramce z bajtem startu oraz sumą kontrolną, zamiast opierać się na pętlach i opóźnieniach [#12598209][#12599341] Wtedy nadawanie i odbiór nie blokują głównej pętli programu [#12599341]
Wygenerowane przez model językowy.
REKLAMA
  • #1 12595891
    werewolf15
    Poziom 14  
    Posty: 163
    Ocena: 1
    Zrobiłem płytkę do sterownika domowego na której znajdują się dwa procki: atmega128(procesor główny) i atmega32(procesor muzyczny). Konieczna jest w tym przypadku komunikacja tych procesorów w obu kierunkach przez uart.
    Całą noc zajęło mi napisanie programu do takiej właśnie komunikacji i w rezultacie mam coś takiego:

    At128-
    Kod: text
    Zaloguj się, aby zobaczyć kod


    At32-
    Kod: text
    Zaloguj się, aby zobaczyć kod


    W założeniach miało to działać tak że at128 wysyła zmienną o wartości 1 do at32, która po odebraniu tego sygnału wysyła sygnał powrotny w postaci zmiennej o wartości 222. At128 po odebraniu zmiennej zwrotnej wyświetla ją na lcd. Taki prosty test komunikacji w obie strony.

    Program działa ale nie do końca dobrze ponieważ na lcd zamiast pojawić się wartości odebranej (222) pojawia sie w 1 sek odcinkach czasu najpierw 1(wartość zmiennej którą wysyłam na początku) potem pojawia się 22 i na końcu dopiero 222 która się już nie zmienia. Próbowałem do programu wstawić coś takiego jak "clear serialin" oraz próbowałem z programowym uartem ale efekt jeszcze gorszy.

    Proszę o pomoc w udoskonaleniu programu aby od razu odczytywał dokładne wartości zmiennych.
  • REKLAMA
  • #2 12595952
    Konto nie istnieje
    Poziom 1  
  • #3 12596408
    werewolf15
    Poziom 14  
    Posty: 163
    Ocena: 1
    Może to źle wytłumaczyłem ale chodzi mi o to żeby odczyt na wyświetlaczu pokazał tylko inbin odebrane z at32(wartość 222). Polecenie "print outbin" miało tylko wysłać tą zmienną do drugiego procka a nie odczytywać na wyświetlaczu.


    Teraz dopisałem taki fragment że program pomija wyświetlanie tych dwóch pierwszych błędnych wartości i wyświetla dopiero właściwą wartość po 3-krotnym powtórzeniu pętli. Ale to chyba nie jest poprawny zapis. Czy ktoś pomoże udoskonalić?

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #4 12596499
    Konto nie istnieje
    Poziom 1  
  • #5 12596522
    werewolf15
    Poziom 14  
    Posty: 163
    Ocena: 1
    A jak zrobić żeby oba procesory wiedziały że ten drugi odebrał zmienną? Wtedy nie musiał by wysyłać w nieskończoność?
  • #6 12596526
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #7 12596552
    werewolf15
    Poziom 14  
    Posty: 163
    Ocena: 1
    A co zrobić żeby nie wczytywał mi zmiennej którą właśnie wysłał?
  • REKLAMA
  • #8 12596587
    Konto nie istnieje
    Poziom 1  
  • #9 12596647
    werewolf15
    Poziom 14  
    Posty: 163
    Ocena: 1
    Zwarcia niema bo uart świetnie działa w jedną stronę. Niestety nie mam możliwości podłączenia lcd do drugiego procka.
    Ten układ sprawia wrażenie jakby podczas wysyłania instrukcja "print" umieszczała w buforze zmienną o wartości 1(jak w programie) i kolejna po niej funkcja "input" wyciąga tą zmienną bo najwidoczniej sygnał z drugiego procka nie zdążył jeszcze dojść. Niewiem czy to prawda ale gdzieś czytałem że instrukcja input wyciągając zmienną powoduje jej usunięcie z bufera co zapewne dzieje się podczas pierwszej pętli. W drugiej pętli program już nie wysyła żadnej zmiennej czym nie zaśmieca bufora, a zatem drugi procek ładuje się ze soją zmienną i wyświetla prawidłowy wynik.
    Czy dobrze myślę?
  • #10 12596677
    Konto nie istnieje
    Poziom 1  
  • #11 12596731
    werewolf15
    Poziom 14  
    Posty: 163
    Ocena: 1
    Napisałem tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    I bez drugiego procka nic nie wyświetla na lcd nawet zera.
    Z drugim prockiem wyświetla 1
    Sprawdziłem miernikiem między rxd a txd i na jednym i drugim procku wyświetlało 1460.
  • #12 12596830
    piotrva
    VIP Zasłużony dla elektroda
    Posty: 6409
    Pomógł: 625
    Ocena: 735
    werewolf15 napisał:
    Sprawdziłem miernikiem między rxd a txd

    Co sprawdziłeś miernikiem?
    A powodem tego, że nie wyświetla nic, jest to, że instruckja Input jest blokująca - czyli dopóki nie odbierze kompletnego ciągu zakończonego (o ile dobrze pamiętam) znakiem '\n' to program będzie na niej stał w nieskończoność.
  • #13 12596873
    werewolf15
    Poziom 14  
    Posty: 163
    Ocena: 1
    Sprawdziłem miernikiem czy jest zwarcie pomiędzy rxd a txd, nie wiem jak fachowo się nazywa ten zakres na mierniku który podczas zwarcia kabli daje sygnał dźwiękowy :)
  • #14 12596880
    piotrva
    VIP Zasłużony dla elektroda
    Posty: 6409
    Pomógł: 625
    Ocena: 735
    To tak czy inaczej polecam zapoznanie się z podstawami elektroniki ogólnie - takie rzeczy trzeba wiedzieć...
    Poza tym sprawdzałeś przejście między RxD a TxD tego samego procesora? Jeśli tak to rób tak dalej, a uszkodzisz kiedyś coś ;)
  • #15 12596922
    werewolf15
    Poziom 14  
    Posty: 163
    Ocena: 1
    Kolega piotrva dał mi dużo do myślenia pisząc że instrukcja input blokuje program i czeka na odebranie kompletnego sygnału. Pomyślałem wiec po co tak sobie utrudniać jakimiś waitms' ami, pętlami i zrobiłem tak:

    At128-

    Kod: text
    Zaloguj się, aby zobaczyć kod


    At32-

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Teraz program działa tak jak chciałem. Wyświetla od razu odpowiednią wartość zmiennej na lcd. Niewiem tylko dla czego musiałem zamienić print i input na printbin i inputbin żeby zadziałało?

    Jeszcze raz dzięki za oświecenie!
  • #16 12597109
    Konto nie istnieje
    Poziom 1  
  • #17 12598103
    werewolf15
    Poziom 14  
    Posty: 163
    Ocena: 1
    I znowu mam taki mały problem z tym uartem.
    Atmega32 współpracuje z kartą sd a at128 z lcd graficznym(wszystko na jednej płytce).
    Chciałem na początek napisać program dzięki któremu na lcd zobaczę rozmiar i wolne miejsce z karty sd. Napisałem coś takiego:

    At128-
    Kod: text
    Zaloguj się, aby zobaczyć kod


    At32-
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Program dobrze przesyła i odczytuje pierwszą wartość czyli "rozmiar" karty- wyświetla 58mb(tyle samo pokazuje na kompie). Problem pojawia się przy drugiej zmiennej "wolne" w której ma być zapisana wartość wolnego miejsca na sd. Wyświetla się ona każdorazowo w postaci "3801088". Chcę tylko dodać że zmienne są przeliczone na mb a karta jest dopiero co sformatowana.

    Proszę o pomoc w znalezieniu błędu. Najlepsza by była jakaś propozycja jak zrobić żeby oba procki wiedziały że drugi odebrał już zmienną bo znowu wplątałem się w te dziwne pętle i bardzo ciężko jest mi trafić instrukcją wysyłania z jednego procka w tym samym czasie kiedy drugi właśnie próbuje coś odebrać.
  • #18 12598209
    Konto nie istnieje
    Poziom 1  
  • #19 12598762
    werewolf15
    Poziom 14  
    Posty: 163
    Ocena: 1
    Wielkie dzięki za program ale niestety jest on dla mnie bardzo trudny do zrozumienia. Szukałem jakiś wiadomości na temat tych przerwań do uart i znalazłem w helpie bascoma coś takiego:
    Cytat:
    ON źródło_przerwania nazwa_podprogramu [ NOSAVE ]

    gdzie:
    źródło_przerwania symboliczna nazwa źródła przerwania,
    nazwa_podprogramu etykieta określająca gdzie znajduje się podprogram obsługi przerwania.

    URXC przerwanie układu sprzętowego UART – odebranie znaku
    UTXC przerwanie układu sprzętowego UART – wysłanie znaku
    UDRE przerwanie układu sprzętowego UART – bufor pusty


    Problem w tym że nie wiem jak się wywołuje takie przerwania, a może one się same wywołują, może trzeba je zainicjować w programie głównym jakąś funkcją, no nie mam pojęcia jak z nich korzystać.Chyba najprościej było by mi zrobić to na timerze ale chyba mi ich braknie bo używam do: RC5(timer2), zegara wewnętrznego(timer0), panelu dotykowego(timer1).
    Tak więc proszę o jakieś informacje jak korzystać z tych przerwań do uart'a.
  • #20 12599341
    Konto nie istnieje
    Poziom 1  
  • #21 12599799
    werewolf15
    Poziom 14  
    Posty: 163
    Ocena: 1
    Napisałem taki programik testowy do wysyłania i odbierania jednej zmiennej:

    At128-
    Kod: text
    Zaloguj się, aby zobaczyć kod


    At32-
    Kod: text
    Zaloguj się, aby zobaczyć kod


    At128 wysyła sygnał w postaci zmiennej o wartości 1. At32 odbiera ten sygnał i odsyła inną zmienną która ma pojawić się na lcd.
    Program niestety nie działa, na lcd nic nie wyświetla.
    Co jeszcze można poprawić?

    Dodano po 5 [minuty]:

    Przepraszam już działa!

    zamiast print:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    dałem printbin:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Teraz czas na próbę z kartą sd :)
  • REKLAMA
  • #22 12599839
    Konto nie istnieje
    Poziom 1  
  • #23 12600067
    werewolf15
    Poziom 14  
    Posty: 163
    Ocena: 1
    I udało się!
    Tak wygląda gotowy działający program do wyświetlania informacji o karcie sd na lcd:

    At128-
    Kod: text
    Zaloguj się, aby zobaczyć kod


    At32-
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Jeżeli ktoś by jeszcze jakiś błąd zauważył proszę pisać :)
  • #24 12600337
    Konto nie istnieje
    Poziom 1  
  • #25 12600379
    werewolf15
    Poziom 14  
    Posty: 163
    Ocena: 1
    Ale właśnie że jest dobrze: at128 wysyła byte i at32 dbiera byte, at32 wysyła long
    i at128 odbiera long.
    Zobacz jeszcze raz do programu :)
  • #26 12600480
    Konto nie istnieje
    Poziom 1  
  • #27 12600761
    werewolf15
    Poziom 14  
    Posty: 163
    Ocena: 1
    To prawda że muszę odczekać kilka sekund aż program się wykona.
    Czyli ustawić wszystkie zmienne komunikacyjne na long?
    A co to znaczy "ręcznie kasować flagę" ?

    Dodano po 56 [minuty]:

    W helpie bascoma znalazłem taki fragment o instrukcji inputbin:

    Cytat:
    ...Liczba odczytywanych bajtów jest określana na podstawie typu podanej zmiennej. Gdy jako parametr będzie użyta zmienna typu Byte, instrukcja odbierze jeden znak. Przy zmiennych typu Integer odczytane zostaną dwa znaki. ...

    Uwaga! Instrukcja INPUTBIN nie kończy się gdy zostanie odebrany znak <CR> (kod 13), tylko gdy wszystkie bajty zostaną odebrane.


    Tak więc chyba nie ma różnicy jaką zmienną odbieram?
  • #28 12601003
    Konto nie istnieje
    Poziom 1  
  • #29 12601089
    werewolf15
    Poziom 14  
    Posty: 163
    Ocena: 1
    Ustawiłem wszystkie zmienne na byte, oprócz rozmiar i wolne w at32 do których trafia bezpośredni odczyt z sd, które potem i tak zamieniam na byte.

    At128-
    Kod: text
    Zaloguj się, aby zobaczyć kod


    At32-
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Program oczywiście działa.
    Czy teraz niebędzie problemu skoro do odebrania jest zawsze tylko jeden bajt?
  • #30 12601114
    Konto nie istnieje
    Poziom 1  

Podsumowanie tematu

✨ W dyskusji poruszono problem dwukierunkowej komunikacji między procesorami ATmega128 i ATmega32 za pomocą interfejsu UART. Użytkownik starał się poprawić wyświetlanie zmiennych na wyświetlaczu LCD, a także zminimalizować błędy w przesyłaniu danych. W trakcie rozmowy zaproponowano różne podejścia do obsługi przerwań oraz zarządzania buforami, co doprowadziło do stworzenia działającego programu, który umożliwia przesyłanie zmiennych tekstowych i liczbowych. Użytkownicy wymieniali się doświadczeniami na temat konfiguracji UART, obsługi przerwań oraz optymalizacji kodu, co pozwoliło na efektywniejszą komunikację między procesorami.
Wygenerowane przez model językowy.
REKLAMA