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

[bascom] mega RS232 transmisja binary z PC gubienie danych

Walderama 27 Kwi 2010 20:16 1744 2
REKLAMA
  • #1 8010150
    Walderama
    Poziom 12  
    Witam
    Mam taki problem. Program wysyla plik binarny 57kB z PC do mega a on do zewnetrznej pamieci(testuje na mega32 i mega128). Wyglada ze AVR nie jest w stanie wyrobic z transmisja, jakby za wolno wewnetrznie dzialal i dane sie nadpisuja zanim obsluzy przerwanie.

    Na PC program pisze w vb6 oto fragment kodu
    Open nazwa For Binary Access Read As #2
    For adres_wyslany = 1 To dlugosc_pliku
    Get #2, adres_wyslany, osiem_bitow
    MSComm1.Output = Chr(osiem_bitow)
    'opcjonalne opoznienie 20ms
    Next
    Close #2
    Jesli dodam miedzy kolejnym wyslaniami opoznienie to jest ok wszystko jest odbierane na czas (nawet nie testuje opcji zapisu do zewnetrznej pamieci tylko samo odbieranie danych) ale przesyl takiego pliku bedzie trwal chyba 10min

    Transmisja z AVR do PC jest ok i trwa 20sekund co dla mnie jest ok


    Kod na avr

    $crystal = 11059200

    $regfile = "m32def.dat"
    $baud = 19200

    Enable Interrupts
    Enable Urxc
    On Urxc Odebralem_dana


    Do

    If Licznik_udr = Kontrola_licznika Then
    Adres = Kontrola_licznika - 1
    Bajt = Dana_udr

    ' Call Dekoder_adresu
    ' Call Zapisz_ram
    Incr Kontrola_licznika 'zwiekszam kontrole zapisu
    end if

    loop

    Odebralem_dana:
    Dana_udr = Udr
    Incr Licznik_udr
    Mnoznik_timer2 = 0
    Return

    Moze lepiej przesylac kilka bajtow zamiast jednego?
    Mam wrazenie ze problem tkwi po stronie PC za duzo pcha naraz.
    Transmisja na 3 przewodach (w tym masa) reszta zmostkowana.
  • REKLAMA
  • #2 8013538
    Maciekqbn
    Poziom 15  
    Na AVR bez problemu można realizować transmisje o szybkościach rzędu setek kbps.
    Według mnie problem u ciebie polega na tym, że dane odbierasz pojedynczo (w procedurze obsługi przerwania odebrana daną wpisujesz do zmiennej - a co jeśli następny znak pojawi się szybciej niż zdążysz tę zmienna "obrobić" w programie?) - przez to gubisz część danych.

    Spróbuj w procedurze obsługi przerwania dane wrzucać do bufora okrężnego, w ten sposób masz pewność, że wszystko co UART odbierze zostanie umieszczone w pamięci.

    Tutaj opisałem jak to zrobić.
  • #3 8013996
    Walderama
    Poziom 12  
    W chwili obecnej musze sprawdzic poprawnosc wysylania danych. Bo na razie wyglada ze jesli to nie wina PC, to avr sie nie wyrabia, wiec bufor nic nie da.

    Po paru testach okazuje sie ze problem moze byc po stronie PC.
    Jesli odpalam petle bez czekania program jakby zawisa na czas wykonania petli
    trwa to 31s. Jest to dziwne poniewaz transmisja z AVR do PC (tej samej wielkosci dane wraz z procedurami odczytu pamieci)bez problemow trwa 24sekundy. Nie wiem jak "zajac" program na PC zeby dzialal normalnie w tej petli. Na razie nie umiem mu dac opoznienia mniejszego niz 1ms. JAk mu dam 1ms to wyglada ze dziala w miare ok, ale wysylanie trwa 2 minuty. Nie wiem jak z poprawnoscia danych musze zapetlic go na portach i sprawdzic.
    Chyba jedynym wyjsciem jest sprzetowa kontrola przeplywu danych miedzy avr a PC
REKLAMA