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

Wymiana danych między dwoma Atmegami 8 po UARCIE

kozikron 01 Cze 2009 08:23 2744 9
REKLAMA
  • #1 6601727
    kozikron
    Poziom 14  
    Witam państwa. Mam powyższy problem. Pisze program w języku Bascom. Mam do dyspozycji dwa mikrokontrolery Atmega 8.
    Używam prędkości 9600 jeden układ taktowany jest 16MHz a drugi 8 MHz. Jeden realizuje wszystkie obliczenia i nie jestem w stanie podłączyć do niego wyświetlacza LCD. Do obsługi wyświetlacza użyłem drugiej atmegi, a dane chce transportować przez port szeregowy. W sumie to wiem jak to wszystko działa, że podłączenie trzeba zrobić na krzyż końcówka jednego uP RX na tx i TX na RX, ale mam problem z wymiana danych między nimi. W jednym mikrokontrolerze wykonuje polecenie print a na drugim input do odebrania tych danych ale mimo to nic mi nie odbiera. Zamieniam końcówki miedzy układami i to też nie daje żadnego rezultatu. Moje pytanie jest co może być przyczyna bp zarówno jeden i drugi up komunikuje się z komputerem po rs232 to wykluczam błędne działanie jednego układa. Jak mam rozwiązać ten program w sumie to przekazuje do mikrokontrolera liczby w zakresie od 5 do 150 Proszę kolegów o pomoc i o rozwiązanie jak ma być program napisany na jednym i drugim up w celu wymiany danych. Interesuje mnie tylko UArt. Proszę o pomoc o ewentualnie przykłady do wymiany danych. Pozdrawiam
  • REKLAMA
  • #2 6601742
    karlos79
    Poziom 33  
    Witam
    Wygląda na to że nie masz zsynchronizowanej transmisji.
    Kiedyś robiłem taką komunikację miedzy dwoma kontrolerami AT89S52.
    Problem rozwiązałem podobnie jak w transmisji SPI, czyli jeden pin resetowałem kiedy układ chciał coś nadawać. Układ oczekujący na dane sprawdzał pin i jak wykrył zero to nasłuchiwał i odbierał dane.
    W drugą stronę można zrobić tak samo.
    Możesz jeszcze transmisję synchronizować za pomocą przerwań- poszukaj w helpie.
    Pozdrawiam
  • REKLAMA
  • #3 6601753
    kozikron
    Poziom 14  
    a jak wygląda zakończenie transmisji przez mikrokontroler. Na przykład w terminalu do wysłania służy enter a w przypadku mikrokontrolera co jest używane. Jeśli na przykład w jednym wezmę polecenie Input i teraz wprowadzenie danych to w drugim up muszę wybrać Print i chyba jakiś sygnał potwierdzenia, jeżeli złe rozumiem proszę o wytłumaczenie. Z kolei nie chciałbym wchodzić w transmisje po Spi bo już nie ma wyprowadzeń a płytka zmontowana.
  • #4 6601801
    mirekk36
    Poziom 42  
    Sprawa jest banalnie prosta (pomijam tu już połączenie sygnałów na krzyż bo to zrobiłeś chyba prawidłowo) , tylko po

    1. Włącz sobie w Bascomie w obu prockach sprzętowy bufor RS232, który działa na przerwaniach - służy do tego polecenie Config Serialin - poczytaj sobie o tym i jak ustawić sprzętowy bufor wejściowy

    2. to co chyba ci rozwala całą koncepcję - bo piszesz, że z kompem działa - a procki ze sobą nie - tak więc masz problem w znakach kończących linię.

    Terminale w PCtach zdaje się zwykle używają sekwencji CRLF. A ty w transmisji pomiędzy prockami w jedną stronę masz CRLF a w drugą stronę tylko CR (może odwrotnie bo już nie pamiętam dokładnie - a tą samą drogę kiedyś przechodziłem)

    ..... ostatecznie to ty musisz dokładnie wiedzieć i sterować tym jak zakańczane są linie. Zdaje się, że to Bascom wysyłając polecenie PRINT kończy je CRLF a domyślnie INPUT działa tylko z CR

    w związku z powyższym - zajrzyj sobie do polecenia Config Input - a zobaczysz, że można sobie zmienić domyślne ustawienia odnośnie wykrywania końca linii

    gdy zrobisz z tym porządek i będziesz z jednego procka nadawał jakiś string zakończony np tylko CR - to zadbaj aby drugi przy poleceniu INPUT też reagował tylko na CR.

    Możesz zrobić to samo oczywiście używając z jednej i drugiej strony CRLF

    dla wyjaśnienia - choć mam nadzieję, że wiesz co to jest, ale:

    CR - to znak ENTER - kod 13
    LF - to znak LineFEED - kod 10
  • #5 6602236
    kozikron
    Poziom 14  
    Dokładnie to na każdej linii wysłania i odbioru najlepiej dać znacznik enter czyli dokładnie to ma wyglać tak print "100" CR
    A o co dokładnie chodzi z poleceniem echo on off tez mozna do tego problemu to wykorzystać
  • REKLAMA
  • Pomocny post
    #6 6602294
    mirekk36
    Poziom 42  
    sorry nie rozumiem - o co ci chodzi

    kozikron napisał:
    Dokładnie to na każdej linii wysłania i odbioru najlepiej dać znacznik enter czyli dokładnie to ma wyglać tak print "100" CR

    tzn - tłumaczysz to sobie czy mi? jest to zdanie oznajmujące czy pytające? ;) może być CR ale równie dobrze może być CRLF

    problem w tym, że jak robisz w Bascomie polecenie PRINT - to ono zawsze na końcu wyśle ci CRLF a nie samo CR - pamiętaj o tym, w takim przypadku trzeba ustawić Config Input także na CRLF

    ale można zmusić polecenie PRINT żeby jednak wysyłało na końcu samo CR - za pomocą małej sztuczki, trzeba to robić po prostu za każdym razem "ręcznie" o tak:

    PRINT "100";Chr(13);


    widzisz ten średnik na końcu ???? on musi być - żeby nie poleciało dodatkowo znowu jeszcze CRLF - rozumiesz?
    (i jeśli będzie ci się tak chciało wpisywać za każdym razem to wtedy spokojnie w Config Input możesz ustawić na samo CR)


    kozikron napisał:

    A o co dokładnie chodzi z poleceniem echo on off tez mozna do tego problemu to wykorzystać

    .... a to to już w ogóle dla mnie nie zrozumiałe pytanie - o ile to pytanie? bo jak można echo wykorzystywać do problemu ??? napisz jaśniej

    a tak ogólnie echo - to po prostu odsyłanie do nadawcy jego własnych wysyłanych znaków - można to włączyć jeśli potrzebne - ale zwykle bywa mało potrzebne w komunikacji pomiędzy prockami - bo po co ? kto tam będzie obserwował echo? toć to nie terminal ;)
  • #7 6602359
    kozikron
    Poziom 14  
    dziękuję za informacje wieczorem to przetestuje
  • #8 6604603
    kozikron
    Poziom 14  
    Dziękuje za pomoc wskazówki były bardzo pomocne. Mam jeszcze jeden mały problem odnośnie odbioru znaków, chce aby były one wyświetlane w jednym ciągu linijki. W skrócie program wyglada następująco:



    $regfile = "m8def.dat"
    $crystal = 8000000
    $baud = 9600
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Rs = Portd.5 , E = Portd.6 , Db4 = Portd.7 , Db5 = Portb.0 , Db6 = Portc.5 , Db7 = Portc.4
    Config Serialin = Buffered , Size = 50
    
    Enable Interrupts  
    
    Sub Predkosc
    Cls
    Predkosc = 70
    Print Predkosc ; Chr(13);
    Do
    Locate 1 , 1
    Lcd " Aktualna V" ; Predkosc
    If Gora = 0 Then Incr Predkosc
    If Dol = 0 Then Decr Predkosc
    If Ok = 0 Then Print Predkosc ; Chr(13);
    If Ochronanapiecia = 0 Then Lcd "Coff"
    If Ochronatranzystorow = 0 Then Lcd "Tmax"
    
    
    Lcd Predkosc
    Waitms 200
    
      Znak = Inkey()
     If Asc(znak) > 31 Then Lcd Znak
    
    
      'Input "Podaj sygnal:" , Wartosc
     'Input Wartosc
     'Lcd Wartosc
    
    Loop



    są to wycinki programu, ale oto chodzi ze w tej ostatniej petli wyswietla mi się wszystko na ostatnim znaku. A jak wezme tylko

    do 
      Znak = Inkey()
     If Asc(znak) > 31 Then Lcd Znak
    
    
    loop


    to nic mi nie wyswietla.
    Czy jest jakiś sposób by wyciągnąć cały buffor i wrzucić wszytsko do jednej zmiennej
    Proszę o pomoc
  • REKLAMA
  • #9 6605840
    mirekk36
    Poziom 42  
    można działać i z Inkey'em - ale kompletnie nie tak...

    ja polecam ci zapoznać się z poleceniem Ischarwaiting oraz zaprzyjaźnić się wtedy z poleceniem Input. Tylko trzeba ten komplet odpowiednio zastosować - jak?

    1. w swojej pętli głównej jak najczęściej sprawdzasz poleceniem Ischarwaiting czy coś już znalazło się w buforze wejściowym - sprzętowym UART'a

    2. gdy Ischarwaiting - "powie", że już coś jest - to wtedy dopiero robisz skok do funkcji, która zrobi INPUT czyli spokojnie zassa ci cały tekst aż do końca linii, a jeśli nawet jeszcze cała linia nie nadleciała gdy będzie skok do tej funkcji to już Input poczeka sobie tyle ile trzeba i nigdy nie zadługo

    3. po odebraniu wtedy już całej twojej linii do jednej zmiennej przez INPUT nastąpi ładnie powrót do twojej pętli głównej - w której dalej będziesz już mógł spokojnie robić to co chcesz z tą zmienną - wyświetlać ją, dzielić na kawałki itp itd

    .... to generalnie taki najprostszy ale i skuteczny sposób przyjemnego, pewnego i szybkiego działania w Bascomie z transmisjami przez UART - tylko jak widać trzeba wiedzieć jak dobrze zacząć ;)
  • #10 6619219
    kozikron
    Poziom 14  
    temat zakończony. dziękuję za pomoc
REKLAMA