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

Komunikacja UART między Atmega8 a Attiny2313A język C

maciej1999 30 Cze 2017 21:49 3540 34
Najlepsze odpowiedzi

How do I correctly receive one UART ASCII character from an ATtiny2313A and display it on an ATmega8 LCD?

Musisz odebrać bajt z `USART_Receive()`, zapisać go do zmiennej i dopiero tę zmienną wyświetlić na LCD; w Twoim kodzie było wyświetlanie wyniku wywołania funkcji albo gubienie odebranego znaku [#16561587][#16561640] Na ATmega8 przy zapisie do `UCSRC` trzeba dodać `(1<[#16562115] Do sprawdzenia, czy problem leży w nadajniku, odbiorniku czy ustawieniach transmisji, zrób loopback i połącz `TX` z `RX` tego samego układu [#16564618] Jeśli po odłączeniu linii odbiorczej pojawiają się losowe znaki, to po prostu odbierasz śmieci z wejścia [#16561691]
Wygenerowane przez model językowy.
REKLAMA
  • #1 16561551
    maciej1999
    Poziom 10  
    Posty: 47
    Pomógł: 3
    Witam
    Próbuję połączyć dwa uC za pomocą komunikacji UART. Attiny ma za zadanie nadanie jednego znaku ASCII natomiast Atmega powinna go odebrać i wyświetlić na wyświetlaczu lcd. Niestety kontrolery nie mogą się dogadać, programy realizujące to zadanie są praktycznie wklejone z not katalogowych Atmela, ale zamieszczam je niżej bo może coś pokręciłem. Proszę o wytknięcie błędów, albo nakierowanie gdzie mogę szukać przyczyny i dziękuję za wszelką pomoc :)
    P.S. Tx Attiny podłączyłem do Rx Atmegi, na wyświetlaczu pojawia się "%" albo "#" zamiast nadawanego znaku

    Nadajnik (Attiny2313A)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Odbiornik (Atmega 8)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    [/syntax]
  • REKLAMA
  • #2 16561568
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Program, który odbiera znak, nic z nim następnie nie robi, a kompilator aż piszczy od ostrzeżeń, które łaskawie ignorujesz.
  • REKLAMA
  • #3 16561579
    maciej1999
    Poziom 10  
    Posty: 47
    Pomógł: 3
    Wyeliminowałem ostrzeżenia poza tym jednym:
    main.c:39: warning: assignment makes integer from pointer without a cast
    Przez niego z odbieranym znakiem nic się nie dzieje?
  • #4 16561587
    C0FFEE
    Poziom 14  
    Posty: 43
    Pomógł: 18
    Ocena: 8
    Nie, nie przez komunikat. Po prostu wyświetlasz adres funkcji USART_Receive.
  • #6 16561591
    maciej1999
    Poziom 10  
    Posty: 47
    Pomógł: 3
    Aaa rozumiem, więc jak wyświetlić zwracaną przez tą funkcję wartość?
  • #7 16561598
    C0FFEE
    Poziom 14  
    Posty: 43
    Pomógł: 18
    Ocena: 8
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    (-:
  • #8 16561602
    maciej1999
    Poziom 10  
    Posty: 47
    Pomógł: 3
    Niewiele w nim zmieniłem, ale nie ma już ostrzeżeń
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #9 16561617
    Konto nie istnieje
    Konto nie istnieje  
  • #10 16561627
    C0FFEE
    Poziom 14  
    Posty: 43
    Pomógł: 18
    Ocena: 8
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Powinno działać, ale trochę od tyłu, może jednak zacznij od podstaw, tj. nauki C.

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

    Ciepło, ale nie działa, próbuj dalej. (-:
  • #11 16561631
    maciej1999
    Poziom 10  
    Posty: 47
    Pomógł: 3
    Wiem o tym, nawet głupio się czuję prosząc Was o pomoc wiedząc, że przyczyną jest moja niewiedza, ale po prostu pilnie tego potrzebuję stąd to zapytane
  • REKLAMA
  • #12 16561640
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    @maciej1999 Dalej nie będzie działać. Masz dwa razy USART_Receive(), przy czym po pierwszym wywołaniu nigdzie nie przypisujesz wyniku. Z kolei twój kod nadajnika nadaje tylko jeden znak, który ty właśnie gubisz.
  • #13 16561682
    maciej1999
    Poziom 10  
    Posty: 47
    Pomógł: 3
    Zrobiłem tak jak radziliście, teraz wyświetlacz nic nie pokazuje, a kiedy odepnę linię Tx zaczyna wyświetlacz "przypadkowe" liczby i znaki
  • #14 16561691
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    A jak się ma zachowywać skoro kod wygląda tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Zastanowiłeś się co ten kod robi? Raz odbierasz coś, przypisujesz zmiennej data, po czym w odstępach co 200ms wyświetlasz ją na LCD, uzysujesz więc kolejne powtórzenia tego samego. W dodatku po odpięciu Rx w odbiorniku po prostu łapiesz śmieci.
  • #15 16561716
    maciej1999
    Poziom 10  
    Posty: 47
    Pomógł: 3
    W sumie to taki był mój cel: odebrać znak, wrzucić do zmiennej i wyświetlać do resetu
  • #16 16561790
    Konto nie istnieje
    Konto nie istnieje  
  • #17 16561827
    Konto nie istnieje
    Konto nie istnieje  
  • #18 16561830
    Konto nie istnieje
    Konto nie istnieje  
  • #19 16561954
    tronics
    Poziom 38  
    Posty: 5062
    Pomógł: 358
    Ocena: 840
    @niveasoft - tutaj zgadzam się z Piotrus_999, autor nie zna podstaw języka którym chce się posługiwać. Dlatego zupełnie prawidłowo Piotrus_999 zasugerował naukę tych podstaw od Hello World. Koniecznie nie korzystając z literatury dla mikrokontrolerów gdyż z reguły ta literatura zakłada znajomość podstaw C. A te tutaj kuleją. Prosty kurs C z pobieraniem wartości z klawiatury, przekazywaniem argumentów do funkcji (liczącej), zwracanie wyniku, funkcje warunkowe, wyświetlanie, jakaś tablica, funkcje wieloargumentowe, wskaźniki... a potem można się bawić C dla MCU.
  • #20 16561960
    Konto nie istnieje
    Konto nie istnieje  
  • #21 16562071
    maciej1999
    Poziom 10  
    Posty: 47
    Pomógł: 3
    " USART_Receive();" już wywaliłem zostało:
    data = USART_Receive();
  • #22 16562115
    jnk0le
    Poziom 18  
    Posty: 172
    Pomógł: 33
    Ocena: 31
    W atmedze8 aby wpisać coś do UCSRC trzeba dodać (1<<URSEL), inaczej całość zostanie wpisana do UBRRH.
  • #23 16562235
    Konto nie istnieje
    Konto nie istnieje  
  • #24 16563011
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1462
    maciej1999 napisał:
    #define MYUBRR FOSC/16/BAUD-1


    Do mojej prywatnej kolekcji "jak nie pisać #define"

    EDIT: @maciej1999 materiały producentów mikroprocesorowych są pełne niewłaściwego stosowania języka C, Atmel ma tu "chlubne" miejsce . Dlatego znów można do znudzenia powiedzieć, najpierw znajomość C, potem programowanie mikroprocesorów.
    Język C ma ogromnie dużo miejsc, gdzie błąd może być ukryty i wyleźć w najmniej spodziewanych okolicznościach
  • #25 16563837
    maciej1999
    Poziom 10  
    Posty: 47
    Pomógł: 3
    Dodałem (1<<URSEL) i teraz wyświetla się jakiś krzaczek
    To #define jest z noty katalogowej atmegi
  • #26 16564618
    Konto nie istnieje
    Konto nie istnieje  
  • #27 16565006
    maciej1999
    Poziom 10  
    Posty: 47
    Pomógł: 3
    Zapętlić czyli połączyć Tx z Rx tego samego kontrolera? To raczej niemożliwe
  • #28 16565013
    Konto nie istnieje
    Konto nie istnieje  
  • #30 16565035
    maciej1999
    Poziom 10  
    Posty: 47
    Pomógł: 3
    Bo wyświetlacz potrzebuje 7 wyjść jednego portu i jakby nie kombinował nie mogę mieć 7 wolnych wyprowadzeń tego samego portu i jednocześnie aktywnych linii Tx, Rx, MOSI, MISO, SCK i resetu.
    Przynajmniej w tych dwóch uC, które mam pod ręką

Podsumowanie tematu

✨ Użytkownik próbuje nawiązać komunikację UART między mikrokontrolerami Atmega8 a Attiny2313A, gdzie Attiny2313A ma wysyłać znaki ASCII, a Atmega8 je odbierać i wyświetlać na LCD. Problemy obejmują nieprawidłowe wyświetlanie znaków oraz ostrzeżenia kompilatora. Użytkownik poprawił kod, eliminując ostrzeżenia, ale nadal występują problemy z odbiorem danych. Wskazówki dotyczące poprawy kodu obejmują poprawne przypisanie wartości zwracanej przez funkcję USART_Receive oraz uwzględnienie ustawienia bitu URSEL w rejestrze UCSRC. Użytkownik zauważa, że po poprawkach wyświetlacz pokazuje nieprawidłowe znaki, co sugeruje problemy z konfiguracją UART lub taktowaniem. Dyskusja podkreśla również znaczenie znajomości języka C w programowaniu mikrokontrolerów.
Wygenerowane przez model językowy.
REKLAMA