Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

maciej1999 30 Cze 2017 21:49 2376 34
  • #1 30 Cze 2017 21:49
    maciej1999
    Poziom 8  

    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
    Zaloguj się, aby zobaczyć kod



    Odbiornik (Atmega 8)
    Kod: c
    Zaloguj się, aby zobaczyć kod
    [/syntax]

    0 29
  • #2 30 Cze 2017 21:54
    BlueDraco
    Specjalista - Mikrokontrolery

    Program, który odbiera znak, nic z nim następnie nie robi, a kompilator aż piszczy od ostrzeżeń, które łaskawie ignorujesz.

    0
  • #3 30 Cze 2017 22:04
    maciej1999
    Poziom 8  

    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?

    0
  • #4 30 Cze 2017 22:09
    C0FFEE
    Poziom 14  

    Nie, nie przez komunikat. Po prostu wyświetlasz adres funkcji USART_Receive.

    0
  • #5 30 Cze 2017 22:10
    tmf
    Moderator Mikrokontrolery Projektowanie

    @maciej1999 Pokaż ten poprawiony kod, bo ten, który wkleiłeś tak jak pisze kol. @BlueDraco nie ma prawa działać.

    0
  • #6 30 Cze 2017 22:11
    maciej1999
    Poziom 8  

    Aaa rozumiem, więc jak wyświetlić zwracaną przez tą funkcję wartość?

    0
  • #7 30 Cze 2017 22:13
    C0FFEE
    Poziom 14  

    Kod: c
    Zaloguj się, aby zobaczyć kod

    (-:

    0
  • #8 30 Cze 2017 22:15
    maciej1999
    Poziom 8  

    Niewiele w nim zmieniłem, ale nie ma już ostrzeżeń

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #9 30 Cze 2017 22:24
    2675900
    Użytkownik usunął konto  
  • #10 30 Cze 2017 22:27
    C0FFEE
    Poziom 14  

    Kod: 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
    Zaloguj się, aby zobaczyć kod

    Ciepło, ale nie działa, próbuj dalej. (-:

    0
  • #11 30 Cze 2017 22:29
    maciej1999
    Poziom 8  

    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

    0
  • #12 30 Cze 2017 22:34
    tmf
    Moderator Mikrokontrolery Projektowanie

    @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.

    1
  • #13 30 Cze 2017 23:01
    maciej1999
    Poziom 8  

    Zrobiłem tak jak radziliście, teraz wyświetlacz nic nie pokazuje, a kiedy odepnę linię Tx zaczyna wyświetlacz "przypadkowe" liczby i znaki

    0
  • #14 30 Cze 2017 23:04
    tmf
    Moderator Mikrokontrolery Projektowanie

    A jak się ma zachowywać skoro kod wygląda tak:

    Kod: 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.

    1
  • #15 30 Cze 2017 23:16
    maciej1999
    Poziom 8  

    W sumie to taki był mój cel: odebrać znak, wrzucić do zmiennej i wyświetlać do resetu

    0
  • #16 01 Lip 2017 00:17
    2675900
    Użytkownik usunął konto  
  • #17 01 Lip 2017 00:51
    373522
    Użytkownik usunął konto  
  • #18 01 Lip 2017 00:55
    2675900
    Użytkownik usunął konto  
  • #19 01 Lip 2017 09:05
    tronics
    Poziom 36  

    @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.

    0
  • #20 01 Lip 2017 09:20
    22053
    Użytkownik usunął konto  
  • #21 01 Lip 2017 10:25
    maciej1999
    Poziom 8  

    " USART_Receive();" już wywaliłem zostało:
    data = USART_Receive();

    0
  • #22 01 Lip 2017 10:54
    jnk0le
    Poziom 18  

    W atmedze8 aby wpisać coś do UCSRC trzeba dodać (1<<URSEL), inaczej całość zostanie wpisana do UBRRH.

    0
  • #23 01 Lip 2017 11:52
    22053
    Użytkownik usunął konto  
  • #24 01 Lip 2017 19:04
    JacekCz
    Poziom 36  

    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

    0
  • #25 02 Lip 2017 10:04
    maciej1999
    Poziom 8  

    Dodałem (1<<URSEL) i teraz wyświetla się jakiś krzaczek
    To #define jest z noty katalogowej atmegi

    0
  • #26 02 Lip 2017 16:34
    22053
    Użytkownik usunął konto  
  • #27 02 Lip 2017 19:43
    maciej1999
    Poziom 8  

    Zapętlić czyli połączyć Tx z Rx tego samego kontrolera? To raczej niemożliwe

    0
  • #28 02 Lip 2017 19:47
    22053
    Użytkownik usunął konto  
  • #29 02 Lip 2017 19:51
    tronics
    Poziom 36  

    Loopback - tak się to nazywa i służy odbieraniu tego co się wysyła. W ten sam sposób sprawdza się kontrolery RS232 na PC.

    0
  • #30 02 Lip 2017 19:57
    maciej1999
    Poziom 8  

    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ą

    0