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

Dlaczego attiny2313 odbiera błędne wartości przez UART z Atmega8515?

vain 28 Sty 2007 15:17 1671 17
REKLAMA
  • #1 3498388
    vain
    Poziom 13  
    Posty: 89
    Pomógł: 8
    Witam,

    Dwa proceseory (takie jak w temacie) komunikuja sie przez uart. Obydwa wysylaja sobie ta sama zmienna typu Byte o wartosci 0 lub 1.
    8515 odbiera dane bez problemu. Natomiast 2313 odbiera wartosci o 128 wieszke, czyli: 0=128 1 = 129 itd....
    Ktos wie co moze byc przyczyna?
    Wszystko jest dobrze ustawione, baud, krysztal, dzielenie zegara wylaczone... program w BASCOMIE.
  • REKLAMA
  • #2 3498531
    Nawigator
    Poziom 33  
    Posty: 1923
    Pomógł: 167
    Ocena: 160
    Tak wygląda jakby startbit był ustawiony na 2. Albo brak rezystora podciągającego na wejściu uart.
    Pzdr. N.
  • #3 3499888
    vain
    Poziom 13  
    Posty: 89
    Pomógł: 8
    Na zadnym wejsciu nie ma podciagajacych, a jedno dziala prawidlowo.
    Mozliwe ze bit startu...
  • REKLAMA
  • #5 3501106
    vain
    Poziom 13  
    Posty: 89
    Pomógł: 8
    mirekk36 napisał:
    zamiast podłączać zewnętrzny rezystor ustaw programowo Pull'Up do VCC na wyjściu Tx i na wejściu Rx - to wystarcza



    No ale wytlumacz mi dlaczego w jedna strone dziala dobrze, skoro nie jest ustawione podciaganie?
  • #6 3501165
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Ktokolwiek wnikliwie studiuje pdf-ki, ten wie - samo włączenie bitów TXEN i RXEN w rejestrze UCR/UCRSB powoduje wymuszenie stanów właściwych transmisji szeregowej. Możliwe jest oczywiście dodatkowe ustawienie pullup na wejściu RXD (np. gdy z jakiegoś powodu może ono być odłączone przez jakiś czas), nic poza tym - proszę poczytać o dodatkowych funkcjach portu D (piny PD0 i PD1) w większości datasheet-ów od AVR...
    Oczywiście użytkownicy Bascom-a najczęściej są nieprzyzwyczajeni do przejmowania się pdf-kami, co skutkuje wypisywaniem bzdur...
    Co do consensusu - wszystkie parametry transmisji (BAUDRATE, STOPBITS, BITS od DATA & PARITY) są w obu µC jednakowe ?
  • #7 3501248
    vain
    Poziom 13  
    Posty: 89
    Pomógł: 8
    Light-I napisał:
    Oczywiście użytkownicy Bascom-a najczęściej są nieprzyzwyczajeni do przejmowania się pdf-kami, co skutkuje wypisywaniem bzdur...
    Co do consensusu - wszystkie parametry transmisji (BAUDRATE, STOPBITS, BITS od DATA & PARITY) są w obu µC jednakowe ?


    Chcialbym zauwazyc, ze CI co proponowali ustawienie pullup'ow progrmuja raczej w C, (ja jako uzytkownik bascoma, przyzwyczajony do tego ze bascom robi wszystko za mnie, wiem ze przy uzyciu komend print input itp. itd. kanaly transmisji zostaja automatycznie i domyslnie skonfigurowane) wiec co do consensusu baud, data i parity ustawione sa dobrze a bits jak juz pisalem wczesniej nie wiem i musze sprawdzic, a kontynuuje ta rozmowe dlatego, ze skoro ktos mi cos doradza to chcialbym zrozumiec dlaczego akurat tak.
  • REKLAMA
  • #8 3503110
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Ne mam zamiaru deprymować kogoś za to, że używa Bascom-a - jeśli kogoś uraziłem to przepraszam. Budzi we mnie tylko pewien niesmak doradzanie bez dokładnego zaznajomienia się z tym, co napisał w danym temacie producent układu.
    Bez analizy kodu zbyt wiele konkretów nie można poradzić. Nowsze AVR, jak doczytałem w Helpie od Bascom-a, należy ustawiać za pomocą dyrektywy CONFIG COM1.
  • #9 3503192
    mieciomiecio
    Poziom 12  
    Posty: 34
    Pomógł: 1
    miałem ten sam problem ale z komunikacją z komputerem.
    zawsze dodawał mi 1 na najstarszym bicie.

    problem polegał na przeliczeniu F_CPU/16/band -1
    wychodziło np 7,8444 czy cos takiego
    i do rejestru wpisywał 7
    jak mu wpisałem stałą wartość 8 to ruszyło i chodzi do dziś :D

    daj znać czy to był tego typu problem.
  • #10 3503561
    vain
    Poziom 13  
    Posty: 89
    Pomógł: 8
    mieciomiecio napisał:
    miałem ten sam problem ale z komunikacją z komputerem.
    zawsze dodawał mi 1 na najstarszym bicie.

    problem polegał na przeliczeniu F_CPU/16/band -1
    wychodziło np 7,8444 czy cos takiego
    i do rejestru wpisywał 7
    jak mu wpisałem stałą wartość 8 to ruszyło i chodzi do dziś :D

    daj znać czy to był tego typu problem.


    no wlasnie, gdzie wpisales ta 8?
  • #11 3503835
    mieciomiecio
    Poziom 12  
    Posty: 34
    Pomógł: 1
    to nie tak ze musisz wpisac 8

    musisz policzyc cos takiego

    [czestotliwosc_zegara]/16/[predkosc_transmisji]-1

    ten wynik wpisujesz do rejestru UBRRL ( i mozliwe ze starszy bajt w UBRRH - sprawdz w dokumentacji)

    wiec podstawiajac swoje dane pod ten wzor uzyskalem np. 7,8988748
    do UBRRL wpisane zostanie np. 0x07
    a nie odcinając końcowki tylko zaokrąglając piszesz np.0x08

    ta "8" to musisz policzyc

    PS: w czym programujesz w BASCOM , avrgcc, asm?
  • #12 3504372
    vain
    Poziom 13  
    Posty: 89
    Pomógł: 8
    programuje w bascomie

    Mozesz mi powiedziec z czego wynika ten wzor?
    W moim przypadku to 51,08(3)
    8000000/16/9600-1

    PS. wysylajac 0 dostaje 80 (HEX). Dodalem w kodzie cos takiego:
    zmienna = zmienna - 128 i dziala.
    Co jest przyczyna dalej nie wiem.
  • #13 3504765
    mieciomiecio
    Poziom 12  
    Posty: 34
    Pomógł: 1
    wklej kawałek kodu lub cały głównie interesuje mnie inicjalizacja USART i procedura wysłania.

    PS: w bascom zawsze dziwnie rzeczy wychodzą wiec może pomyśl nad przejściem nad avr-gcc
  • #14 3505204
    Nawigator
    Poziom 33  
    Posty: 1923
    Pomógł: 167
    Ocena: 160
    Jak stracisz jeszcze dwa tygodnie to się zainteresujesz asemblerem, co Ci już radzę. Zmiany w procesorach avr idą tak szybko ze wszelakie kompilatory nie nadążają z łataniem dziur.
    Dałeś te rezystory do plusa?
    Pzdr. N.
  • #15 3505325
    vain
    Poziom 13  
    Posty: 89
    Pomógł: 8
    Dalem rezystory i nic. Jeśli chodzi o fragment kodu z obsluga uartu to nie ma takowego. Otwieralem kanaly, konfigurowalem i nic. Mam tylko poustawiane w kompilatorze.
    Moze to jest spowodowane uzyciem komend printbin i inputbin?
    Niewiem czemu komendy pirnt i input nie dzialaja?

    Co do przejscia na C to nie ma szans, nie mam czasu sie uczyc teraz C.
    Jesli chodzi o asembler to nie mamilabym cierpiliwosci do napisania programu na 5 procesorow z czego jeden ma okolo 2000 linijek(w basicu).

    Mozliwe sa stawki asemblerowe w Bascomie. Moze to jakos pomoze?
    Niestety asemblera znam "bardzo podstawowo".
  • REKLAMA
  • #16 3506156
    mieciomiecio
    Poziom 12  
    Posty: 34
    Pomógł: 1
    to moze wyłącz w ustawieniach bacom'a USART i ustaw ją samodzielnie powinienes miec możliwość wpisywania odpowiednich danych do rejestrów, albo pozmieniaj prędkość transmisji lub kwarca i zobacz czy zadzialalo.
  • #17 3538444
    vain
    Poziom 13  
    Posty: 89
    Pomógł: 8
    dwie atmegi komunikuja sie bez problemu
  • #18 3538925
    marek_Łódź
    Poziom 36  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    Nawigator napisał:
    Zmiany w procesorach avr idą tak szybko ze wszelakie kompilatory nie nadążają z łataniem dziur.
    Jakie zmiany w procesorach, czyżby żyły własnym życiem (u mnie w szufladzie)?

    Co do meritum, to faktycznie takie błędy potrafią się pojawiać przy niedokładnym zestrojeniu prędkości transmisji.

Podsumowanie tematu

✨ Problem dotyczy komunikacji UART między mikrokontrolerami Atmega8515 i Attiny2313, gdzie Attiny2313 odbiera błędne wartości przesyłanej zmiennej typu byte (0 odbierane jako 128, 1 jako 129). Ustawienia transmisji (baud rate, zegar, podział) są poprawne, a program napisany w Bascomie. Dyskusja wskazuje na możliwe przyczyny: brak rezystorów podciągających na liniach UART, nieprawidłowe ustawienie bitów startu, oraz błędne obliczenie wartości rejestru UBRR dla prędkości transmisji. Wartość UBRR powinna być obliczona według wzoru: (F_CPU/16/baudrate) - 1, a wynik zaokrąglony w dół. W Bascomie automatyczna konfiguracja UART może nie zawsze działać poprawnie, co sugeruje ręczne ustawienie rejestrów. Propozycje rozwiązań obejmują dodanie rezystorów podciągających lub programowe włączenie pull-up na liniach Rx i Tx, a także dokładne sprawdzenie parametrów transmisji (baud rate, liczba bitów danych, parzystość, bity stopu). Użytkownik zauważył, że odejmowanie 128 od odebranej wartości rozwiązuje problem, co wskazuje na przesunięcie bitowe. Zalecane jest również rozważenie przejścia na inne środowisko programistyczne lub asembler, aby lepiej kontrolować konfigurację UART.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA