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

ATMEGA32 - komunikacja uart pomiędzy mikrokontrolerami

rwd89 13 Sty 2015 16:32 1566 13
REKLAMA
  • #1 14325773
    rwd89
    Poziom 10  
    Posty: 7
    Witam.

    Celem jest stworzenie programu umożliwiającego komunikację przez UART pomiędzy dwoma mikrokontrolerami ATMEGA 32. Docelowo ma się to odbywać drogą radiową, pierwotnie zostanie to połączone przewodowo. Założenie jest takie, że jeden mikrokontroler ma przesyłać dane, drugi odbierać i działać w określony sposób(transmisja tylko w jednym kierunku). Jak na razie jestem na etapie pisania kodu do nadajnika. Urządzenie nadawcze powinno mieć 6 przycisków, a stan tej klawiatury zostałby zapisywany tablicy 6-cio elementowej(każdy element tablicy odpowiadałby jednemu przyciskowi).

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Czy jest możliwe wysłanie poprzez UART tablicy elementów typu int? Czy jest możliwe wykorzystanie funkcji
    Kod: text
    Zaloguj się, aby zobaczyć kod
    , czy będzie konieczna modyfikacja tego, np. zamiana określonych konfiguracji wciśnięcia przycisków przez funkcje if na określone int-y?
  • REKLAMA
  • #2 14326088
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Do przechowywania i transmisji stanu do 8 przycisków wystarczy przecież jeden bajt... :)
  • REKLAMA
  • #3 14326119
    rwd89
    Poziom 10  
    Posty: 7
    Więc jakie proponujesz rozwiązanie, zamiast tej tablicy. Uznałem, że będzie najprościej, jeśli każdy przycisk będzie miał swój element w tablicy ale teraz nie wiem jak zrealizować przesłanie gotowej tablicy?
  • #4 14326306
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    Znasz przecież operacje bitowe: http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-spis-tresci.html
    skoro piny ustawiasz i zerujesz.

    Po prostu zdefiniuj sobie makra za pomocą #define określając, który bit, to który przycisk np. tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Zadeklaruj jakąś zmienną np:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i wykorzystując operacje bitowe ustawiaj i zeruj bity zdefiniowanymi makrami.

    A przez USART wysyłaj tylko jeden bajt, czyli zmienną przyciski za pomocą funkcji z biblioteki lub przerwań: http://mikrokontrolery.blogspot.com/2011/03/rs-232-atmega8-komputer-terminal.html
  • #5 14348712
    rwd89
    Poziom 10  
    Posty: 7
    Witam ponownie. Zabrałem się za problem od trochę innej strony, chodzi mi na razie o to, żeby w ogóle uruchomić tę komunikację. Próbuję, żeby zadziałało to na tyle, żeby zaświeciły się dwie diody, jak już będę potrafił to uruchomić to myślę, że poradzę sobie z dalszymi problemami łatwiej.

    Używam gotowych bibliotek, kompilator nie wyrzuca błędów.

    Program dla nadajnika:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Oraz program dla odbiornika:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Konsultowałem się z kimś, kto miał z tym do czynienia ale zastanawia mnie, czy aby na pewno mogę w ten sposób przesyłać int-a, korzystając z
    Kod: text
    Zaloguj się, aby zobaczyć kod
    w odbiorniku? Dowiedziałem się, że służy ona w ogóle do odebrania czegokolwiek przez Rx ale nie jestem już tego pewien i budzi to wątpliwości. Czy spróbować konwersji int na ASCII i w ten sposób przesyłać przez UART?

    EDIT:
    Posiłkując się znalezionymi w sieci informacjami próbowałem przesłać to jako znak/ciąg znaków:

    Nadajnik:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Odbiornik:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Mam wrażenie, że albo gdzieś jest prosty błąd albo idę w ogóle złym tokiem myślenia.
  • REKLAMA
  • #6 14349070
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Proponuję zacząć od nauki podstaw programowania w C, niekoniecznie na mikrokontrolerach, bo to, co pokazujesz powyżej, świadczy o tym, że nie rozumiesz podstaw - typy, konwersje (zresztą zbędne w Twoim programie).

    Potrzebujesz przesyłać tylko jeden znak (bajt) co jakiś czas, np. przy zmianie albo co sekundę. Może to być np. stan portu z przyciskami, np.

    uart_putc(PINB);
    delay(...tu wpisz opóźnienie...);

    A w odbiorniku:

    PORTB = uart_getc();
    .
  • #7 14349451
    rwd89
    Poziom 10  
    Posty: 7
    Co do konwersji w odbiorniku, to szukałem sposobu, który będzie działał - z wykorzystaniem tego co zamieściłem, działało po konwersji przy zadaniu stałej wartości char(np.3), więc to zostawiłem. Mam większy problem z inicjalizacją UART-a, bo kompilator pokazuje błędy, a USART_init(9600) chyba nie do końca jest jednak poprawnie.
  • #8 14349465
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Takie coś (z Twojego programu powyżej):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Oznacza kolejno:
    - podstaw 3 pod zmienną stan
    - skopiuj wartość stan do takiej samej zmiennej output (nie ma tu żadnej konwersji)
    - wyślij przez UART łańcuch tekstowy pobrany z pamięci spod adresu 3 - jak myślisz, co jest w pamięci pod tym adresem i kto to tam umieścił?

    Inna postać tego samego kodu w C:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    - przy trzeciej linii kompilator emituje ostrzeżenie o niewłaściwym typie argumentu (i słusznie, bo kod nie ma sensu).
  • REKLAMA
  • #9 14352398
    rwd89
    Poziom 10  
    Posty: 7
    Witam raz jeszcze :)

    Krok po kroku poczyniłem pewien postęp, korzystając z gotowych bibliotek i przykładowego programu do kalibracji udało mi się uruchomić transmisję przez przejściówkę USB i program PuTTy.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Symulacja, którą chciałem wykonać miała:
    1) Zapalać diody, w zależności od wciśniętego przycisku (lub dwie diody, jeśli dwa przyciski).
    2) Wysyłać przez UART do komputera akutalny stan.

    Działa to częściowo, a mianowicie:
    1) Kiedy w programie nieużywana jest funkcja wysyłania uart: diody zachowują się w pożądany sposób: zapalają się, gasną, przy wciśniętych dwóch przyciskach świecą obydwie.
    2) Przy użyciu funkcji uart_putint: o ile w programie podłączony jest tylko jeden przycisk, działa poprawnie, zapala jedną odopowiednią diodę i wysyła 1 lub 2 na terminal PuTTy. Włączenie do programu większej liczby przycisków (nawet dwóch powoduje, że i tak zapala się tylko jedna dioda(i wtedy wysyła wartość na terminal).

    Tak jak zasugerowano wyżej użycie uart_putc(PORTC); - nie działa, chyba, że popełniam gdzieś dodatkowy błąd.

    Reasumując, sam program działa tak jak chcę, dopóki nie włączam wysyłania przez uart. Czy macie może pomysł, jak usprawnić, żeby w tym wypadku działał z dwoma lub więcej diodami i przy tym wysyłał na terminal właściwą wartość?
  • #10 14352520
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    uart_putc(PORTC); działa - wysyła bajt o wartości 0, 1 lub 2, którego putty nie wyświetla, bo nie jest to kod widocznego znaku ASCII. Na szybko możesz napisać uart_putc((PORTC & 7) + '0'); - zadziała dla trzech bitów portu.
    Jeżeli użyjesz programu terminala umożliwiającego podglądanie wartości odbieranych bajtw w postaci szesnastkowej lub dziesiętnej - zobaczysz przesyłane niewidoczne znaki (np. RealTerm lub Bray Terminal)
    Program działa tak, jak go napisałeś - co chwila zapisujesz 0 do PORTC.

    Schematu na wszelki wypadek nie pokazałeś, więc trudno zgadywać, jak masz podłączone diody i przyciski. Zapewne do zaświecania i gaszenia diod wypadałoby użyć operacji logicznych typu PORTC |= P1 i PORTC &= ~P1.
  • #11 14352664
    rwd89
    Poziom 10  
    Posty: 7
    Nie wiem czy ze względu na prostotę tego konieczne jest załączenie schematu ;) Wszystko jest połączone na płytce stykowej. Przyciski są połączone kolejno do PA0, PA1... Diody natomiast do PC0, PC1...

    Dodatkowo zauważyłem, że przy wyłączeniu "else-ów" (diody można przełączać przyciskami tyle, że nie gasną), układ wysyła przez uart-a 1 lub 2, w zależności, która dioda jest zapalona.
    Właśnie zastanawia mnie to, dlaczego program "świruje" po włączeniu wysyłania przez uart. Czy to może być wina, że wejścia/wyjścia są tutaj źle poustawiane?
  • #12 14352732
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Nadal nie wiemy, jaki stan ma wejście przycisku, kiedy przycisk jest zwolniony, ani jaki stan wyjścia powoduje zaświecenie diody, ale Twoim zdaniem "schemat nie jest potrzebny". Ok, idź z niedziałającym programem do wróżki i nie zaśmiecaj forum.

    Bez schematu NIE DA się zweryfikować oprogramowania, co różni ludzie piszą tu co chwila.
  • #13 14352865
    rwd89
    Poziom 10  
    Posty: 7
    W ten sposób zostało to połączone:

    ATMEGA32 - komunikacja uart pomiędzy mikrokontrolerami
  • #14 14352976
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Nie włączone wewnętrzne podciągnięcia - przy zwolnionym przycisku stan wejścia jest losowy - ładunki i zakłócenia "z powietrza". Przy wspólnym rezystorze i próbie równoczesnego zaświecenia diod mogą one świecić nierówno, a jeśli będą różnych typów - jedna nie zaświeci wcale. O kondensatorach już nie wspomnę.

    Wpisz do PORTA jedynki na pozycje odpowiadające przyciskom.

Podsumowanie tematu

✨ Celem dyskusji jest stworzenie programu do komunikacji UART pomiędzy dwoma mikrokontrolerami ATMEGA32, z planem na późniejsze połączenie radiowe. Użytkownik pracuje nad kodem nadajnika, który ma obsługiwać 6 przycisków, a ich stany mają być przechowywane w tablicy. Uczestnicy forum sugerują uproszczenie kodu poprzez użycie jednego bajtu do reprezentacji stanów przycisków oraz operacje bitowe do ich zarządzania. Wskazówki dotyczą także inicjalizacji UART oraz przesyłania danych. Użytkownik napotyka problemy z inicjalizacją UART i przesyłaniem danych, co prowadzi do dalszych pytań o poprawność kodu i schemat połączeń. W końcu, po kilku próbach, udaje się uruchomić transmisję, jednak pojawiają się wątpliwości dotyczące podciągania wejść oraz stabilności sygnałów.
Wygenerowane przez model językowy.
REKLAMA