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

UART - wysyłanie dużej tablicy 408 bajtów między Atmega128 a Atmega8

Dawid 88 21 Wrz 2014 23:11 2100 8
REKLAMA
  • #1 13980124
    Dawid 88
    Poziom 14  
    Witajcie. Mam połączone ze sobą dwie atmegi za pomocą RS232, komunikacja jednokierunkowa. Jako master działa M128 taktowana kwarcem 16MHz, a jako slave M8 również taktowana kwarcem 16MHz. Komunikacja służy do wysłanie z jednej atmegi do drugiej tablicy danych składającej się z 408 bajtów (408 różnych zmiennych w zakresach 0-255). Komunikacja działa prawie dobrze. Prawie bo tylko do prędkości 19200 baud rate. Przy próbie zwiększenia tej prędkości coraz więcej danych nie dociera tzn przy 28800bps dochodzi około 400 pierwszy bajtów, 8 pozostałych nie dociera i im wyżej tym większa końcówka nie dociera. Chcę zadać pytanie dlaczego tak się dzieje? Co jest tego powodem, bo gdy już to będę wiedział będę próbował się z tym uporać.

    Dodano po 55 [minuty]:

    A i dodam że na kablu 0.5m jak i 3m działa identycznie więc wina kabla odpada.
  • REKLAMA
  • #2 13980235
    Konto nie istnieje
    Poziom 1  
  • #3 13980286
    Dawid 88
    Poziom 14  
    W testach dane próbowałem wysłać tylko raz jak i dawać nadawanie w pętli, odbiór cały czas w pętli. Odbiornik (M8) ma także co chwila przerwanie od timer0 który multipleksuje wyświetlacz led 136x24 pixele :D przerwanie mam co jakieś 800uS aby wyświetlić jedną linijkę (rejestr przesuwny wbija 136 bitów)
    Nadawanie:
    Kod: text
    Zaloguj się, aby zobaczyć kod



    Odbieranie:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #4 13980430
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #5 13980467
    BlueDraco
    Specjalista - Mikrokontrolery
    Są tu dwa problemy:
    1. Dokładność częstotliwości transmisji - błąd nie może przekraczać 2.5%, a przy "okrągłych" częstotliwościach zegara ATmega oznacza to niemożliwość stosowania"standardowych" częstotliwości. Możesz za to łatwo transmitować np. z szybkością 200 kbaud, o ile po obu stronach masz układy, które to potrafią. Oczywiście jeżeli transmisja zachodzi pomiędzy dwoma uC taktowanymi takim samym zegarem, to ten problem nie występuje, bo oba będą miały takie samo odchylenie częstotliwości.

    2. Transmisja asynchroniczna nie nadaje się do przesyłania długich bloków danych bez przerw. Należy co max. kilkadziesiąt bajtów zrobić przerwę na czas transmisji jednego bajtu.
  • #6 13980648
    Konto nie istnieje
    Poziom 1  
  • #7 13980687
    piotrva
    VIP Zasłużony dla elektroda
    Moim zdaniem masz rację, że przerwania powodują problem.
    Miałem kiedyś podobną zagwozdkę z obsługą klawiatury PS2 + multipleks.
    Problem rozwiązało zezwolenie na przerwanie przerwania multipleksowania, tak aby przerwanie (w moim wypadku) od obsługi klawiatury miało "wyższy priorytet" i mogło wywłaszczyć przerwanie multipleksowania.
  • #8 13983770
    Dawid 88
    Poziom 14  
    Ok tym zajmę się później bo mam nie wiele czasu a taka prędkość jest w zasadzie wystarczająca na tę chwilę. Pojawił się inny problem.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    jeśli tak wyślę cały bufor to zajmuje to dobre 20-25 sekund, a jeśli zrobię printbin #1 , 255 to idzie to migiem. Czemu tak?
  • REKLAMA
  • Pomocny post
    #9 14530586
    mostaszewski
    Poziom 12  
    Do wysyłania tablicy jest proste polecenie
    fragment kodu
    Kod: text
    Zaloguj się, aby zobaczyć kod
REKLAMA