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

[bascom] atmega8 x2 - szeregowa komunikacja dwóch procesorów

19 Paź 2014 21:54 3714 39
  • Poziom 20  
    Witam serdecznie,
    jak w temacie. Mam podpięte szeregowo dwa procesory atmega 8. Komunikacja odbywa się przez podłączenie rxd=rxd txd=txd. Wszystko czeka tylko na program do wgrania. Cel jest taki by przy jednym procku były przyciski, przy drugim ledy.
    Zależy mi na uzyskaniu takiego samego efektu jak przy jednym avr, z tym że switch przy pinb.1 odpowiada diodzie przy drugim procku pinb.1. Czy można prosić o podanie takiego przykładowego programiku dla nadawania i odbioru? :
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    Moderator Projektowanie
    W telegraficznym skrócie - w "nadajniku" wysyłasz znaki komendą PRINT, np "A" dla pierwszego LEDa i "B" dla drugiego.
    W odbiorniku odbierasz dane z UARTu (inkey) i jeśli jest "A" to zapalasz jedną diodę, jak doszło "B" drugą.
  • Poziom 32  
    Połączenie powinno być raczej skrosowane rxd<>txd.
  • Poziom 20  
    Przy komunikacji PC<=>uP musi iść na krzyż, tu niby nie. Ale poprawić w trakcie to żadem problem. Najważniejszy to program :)
  • Pomocny post
    Poziom 28  
    piotrva napisał:
    stoper17, Zawsze musi iść na krzyż - pin RxD zawsze nadaje, TxD zawsze odbiera.


    Witam.
    Myślę, że odwrotnie:

    TXD - nadaje (transmiter)
    RXD - odbiera (receiver)
  • Poziom 20  
    czyli tak:
    NADAJNIK:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    ODBIORNIK:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Czy programik ma wyglądać w ten sposób?
  • Poziom 32  
    Mam wątpliwości, czy w kodzie odbiornika instrukcja
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    nie powinna być wewnątrz pętli.
  • Poziom 20  
    Oczywiście powinno być zdeklarowane wew. plus parę innych rzeczy. Cel osiągnięty tylko martwi mnie jedna sprawa. Przy podpięciu się pod terminal gdy led jest załączona to jest efekt ciągłego nadawania. Wygląda mniej więcej to tak:
    a
    a
    a
    a
    a
    a
    a
    a
    a
    a
    a
    a
    ....
    Jak programowo zrobić to by switch zwarty, procek wyśle dane tylko raz "a" i czeka... switch rozwarty wysyła raz "z" i czeka?
  • Moderator Projektowanie
    Musiałbyś dodać zmienną-flagę, w której byłoby zapisane 1 jeśli dioda już świeci i 0 jeśli jeszcze nie świeci.
    Program mniej więcej taki:

    - jeśli wciśnięto przycisk to
    - sprawdź flagę, jeśli flaga=0 to wyślij A i ustaw flagę na 1, wróć do pętli głównej
    - jeśli przycisk jest rozwarty to
    - sprawdź flagę, jeśli jest 1 to wyślij znak Z i ustaw flagę na 0, wróć do pętli głównej
  • Poziom 20  
    nie bardzo rozumiem z tą flagą. Można prosić o podpowiedz? Napotkałem jeszcze jeden problem ze sprawdzaniem stanów. Otóż komunikacja między prockami jest tylko w jedną stronę. Odbywa się to za pośrednictwem modułu odbiornik-nadajnik. Niestety nie sprawdzę stanów.
    I jeszcze jeden problem. Podczas gdy żaden switch nie jest zwarty powinna być również o tym informacja.
    Czyli może jeszcze jakieś sugestie jak pisać program by uniknąć nadawania całej litanii znaków??
  • Moderator Projektowanie
    Flaga to taki znacznik, że coś się zmieniło. Żeby nie wysyłać całej litanii znaków, to wysyłaj tylko informacje o zmianie stanu przycisku. Jeśli był 0 a jest 1 to wysyłasz, jeśli nadal jest 1, to nie wysyłasz nic, bo wcześniej już poinformowałeś drugi procek o zmianie stanu.
  • Poziom 20  
    czy flagę zadeklarować jako bit?
  • Poziom 20  
    Super :) działa :D
    Ale pewnie jeszcze się odezwę w sprawie przerwań bo ich nie rozumiem, a na pewno będą mi potrzebne.
  • Poziom 20  
    zliczam ilość "kliknięć" switcha na zasadzie
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    i teraz pytanie, w jaki sposób stworzyć granice by drukowało wartość w granicy od 0 do 6 lecz nie chcę by z 6 przechodziło na 0.W jedną stronę udało mi się, w dwie strony już nie. Pozdrawiam
  • Poziom 20  
    Coś podobnego wykombinowałem, tylko ten sam efekt zajął mi 6 linijek :)
  • Poziom 20  
    Czy jest możliwość wyczyszczenia okna w terminalu z wydruków, podczas nadawania następnych?
  • Poziom 20  
    Rozumiem, ale chodzi mi przy pomocy komendy np cls itp.
  • Poziom 20  
    Potrzebuję rozwiązać sytuację, która polega na:
    Podczas wykonywania zadania
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    (czas zadeklarowany jak byte)

    procesor jest zablokowany przez "wait"
    Co użyć, by w trakcie realizacji tego zadania, procek mógł zajmować się resztą??
    Próbowałem też wykorzystać przerwania w udziałem timer skonfigurowanego na timer. Przy każdej próbie kombinacji efekt był taki sam jak przy wait, czyli blokuje;(
  • Moderator Projektowanie
    Zależy co procek ma w tym czasie robić, jeśli coś prostego, typu sprawdzanie klawisza, to możesz zrobić tak:

    zamiast "waitms czas" dać:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Oczywiście dużo ładniej i profesjonalnie, należy zrobić to w przerwaniach.

    Co konkretnie chcesz robić w czasie "wait" ?
  • Poziom 20  
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    dioda mruga np 6[s]
    w tym czasie terminal nie przyjmuje kolejnych poleceń z procka nadawczego.Tym samym pozostałe porty nie można załączyć. Wszystko jest na zasadzie wł/wył. W programie nie ma nic skomplikowanego. Na dobrą sprawę wait też nie przeszkadza, ale fajnie by było gdyby jednak nie zatrzymywał kontroli :)
  • Moderator Projektowanie
    Poczytaj o przerwaniach wywoływanych od bufora UART ;-)
    Wówczas, gdy na buforze pojawi się znak, program skoczy do procedury obsługi przerwania, a tam możesz już robić co chcesz. Polecam zmianę jakieś flagi widocznej w pętli głównej, żebyś nie robił skoków z obsługi przerwań.
  • Poziom 20  
    Nie wiem czy dobrze kombinuje i trochę mi nie pasuje co zrobiłem.
    Do tego celu wykorzystuje polecenie Config Serialin które po konfiguracji wygląda tak:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    efekt żaden w pracy w tle;/
  • Moderator Projektowanie
    No panie... bzdura trochę ;-) Efekt żaden, bo w przerwaniu przecież nic nie robisz...
    Fragment wycięty z jakiegoś mojego programu, mam nadzieję że naświetli temat odbioru znaków w przerwaniach ;-)

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    To co prawda na Atmegę z dwoma UART'ami, ale zasada działania jest taka sama.