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

[BASCOM] Prosta komunikacja dwóch mikrokontrolerów

Jarosław J 13 Wrz 2009 09:25 7511 32
  • #1 13 Wrz 2009 09:25
    Jarosław J
    Poziom 14  

    Witam wszystkich!

    Na Forum jestem od bardzo dawna, i choć nie mam wiele postów to bardzo często na nie zaglądam. W wielu moich projektach Wasze wskazówki były dla mnie bezcenne.

    Mam jednak problem do którego pomocy nie mogę znaleźć nigdzie na forum ani w internecie od kilku dni.
    Chciałbym cyklicznie przesyłać z Atmegi 8 do Atmegi 16 dwie zmienne typu INTEGER na niewielką odległość

    Kilkanaście moich prób nie dało rezultatu. Jeśli możecie to pomóżcie w następujących kwestiach

    1. Czy przy komunikacji dwóch procesorów poprzez UART można dopuścić sytuację, że jeden procesor (atmega 8 ) będzie pracował na wewnętrznym oscylatorze z tą samą częstotliwością co atmega 16 na rezonatorze kwarcowym ?

    2. Jak skonfigurować w tym przypadku port COM1 Ja próbowałem tak:

    Code:
    Config Com1 = 19200 , Synchrone = 0 , Parity = Odd , Stopbits = 2 , Databits = 8 , Clockpol = 0
    
    $baud = 19200
    Baud = 19200


    oba procesory Czy jest to właściwe?

    3. Czy przy komunikacji procesorów przy pomocy SPI podłączam szyny MISO i MOSI na krzyż, podejrzewam, że tak jednak chciałbym to zweryfikować i czy muszę (jeśli tak to w jaki sposób) procesory określać jako Master i Slave czy potrafią się porozumieć bez tego?

    4. Czy przy takiej komunikacji po SPI tylko dwóch procesorów trzeba wykorzystywać linię SS ?

    i w końcu Jak trzeba wysyłać i odbierać taką zmienną Czy takie pętle mają mozliwość działania?
    Code:

    config  A as integer
    A=233.4

    do
    Print A                                         
    loop



    i odbiór

    Code:

    config  A as integer
    A=233.4

    do
    input  A
    loop

    Czy jest to właściwe?

    Uprzedzając Wasze uwagi czytałem Helpa do Bascom, jednak opisana jest tam skomplikowana procedura konfiguracji komunikacji SPI i przyznaję że jej nie rozumiem dochodzą tam bezpośrednie rejestry Rbit. Podejrzewam, że do wysłania jednej zmiennej procedura będzie znacznie uproszczona

    Jak już wspomniałem na Forum nie ma jasnych wskazówek do konfiguracji tych protokołów . Znalazłem kilka tematów jednak znacznie sie one od siebie różnią i nie potrafiłem wyciągnąć jednoznacznych wniosków Stąd mój post, który może się wydawać że jest wynikiem nie używania rubryki SZUKAJ.

    Jak zwykle w teorii wszystko działa a u mnie nie chce :) będę wdzięczny za pomoc

    0 29
  • Szkolenia elektronika Udemy
  • Pomocny post
    #2 13 Wrz 2009 09:37
    kwesoly
    Poziom 15  

    Jarosław J napisał:
    Witam wszystkich!
    1. Czy przy komunikacji dwóch procesorów poprzez UART można dopuścić sytuację, że jeden procesor (atmega 8 ) będzie pracował na wewnętrznym oscylatorze z tą samą częstotliwością co atmega 16 na rezonatorze kwarcowym ?

    Tak, ale możliwy transfer będzie zależał od dokładności tego oscylatora - wewnętrzny jest mniej dokładny.

    Jarosław J napisał:
    Code:
    Config Com1 = 19200 , Synchrone = 0 , Parity = Odd , Stopbits = 2 , Databits = 8 , Clockpol = 0
    
    $baud = 19200
    Baud = 19200


    oba procesory Czy jest to właściwe?

    Składni nie znam, natomiast zgadza sie, oba procesory mają mieć ten sam bitrate i format ramki.

    Jarosław J napisał:
    3. Czy przy komunikacji procesorów przy pomocy SPI podłączam szyny MISO i MOSI na krzyż, podejrzewam, że tak jednak chciałbym to zweryfikować i czy muszę (jeśli tak to w jaki sposób) procesory określać jako Master i Slave czy potrafią się porozumieć bez tego?

    Szyna MISO (Master Input - Slave Output) jest wejściem przy konfiguracji jako slave, zaś wyjściem przy konfiguracji jako master. Więc nie na krzyż tylko 1:1, i jeden procesor musi być Masterem, a drugi slavem. Z tego co pamiętam pin SS służy do wybierania slave'a, więc nie musisz go podłączać, ale sprawdź w dokumentacji jak musi być skonfigurowany żeby slave działał.

    0
  • #3 13 Wrz 2009 12:00
    Jarosław J
    Poziom 14  

    Czytałem jeszcze trochę o UART i jeszcze bardziej mi się pomieszało. Czy do komunikacji UART potrzebuję ustawiać jakieś Fusebity (oprócz tych odpowiadających za sposób taktowania zegara?

    przerobiłem układy na obydwa taktowane takim samym kwarcem, jednak dalej nie potrafię wysłać nawet wartości jednej zmiennej. Przeczytałem też, że zmiennych nie da się wysłać komendą PRINT

    W jaki sposób mogę wysłać zmienną INTEGER do innego procesora po rs232?
    Bardzo proszę o pomoc

    ---------------------------
    Sprawdziłem oscyloskopem obydwie linie TX i RX widzę, że coś jest wysyłane jednak
    układ odbiorczy głucho milczy

    0
  • Pomocny post
    #4 13 Wrz 2009 12:35
    grysek
    Poziom 19  

    Używasz programowego czy sprzętowego UART?
    Masz rację instrukcja Print i Input raczej nie zadziała - ja zwykle używałem instrukcji PUT i GET oczywiście po otworzeniu kanału poleceniem OPEN, i wszystko działało ok.

    Aby wysłać zmienną integer najpierw dzielisz je na dwie połówki za pomocą funkcji LOW() i HIGH() i wysyłasz najpierw jedną potem drugą a układ odbierający dodaje je do siebie.

    0
  • Szkolenia elektronika Udemy
  • #5 13 Wrz 2009 13:00
    Jarosław J
    Poziom 14  

    Widzicie. Tu się ujawniają moje braki Używam sprzętowego UART (przynajmniej tak mi sie wydaje) Podłączam wyjścia TX jednego procesora z RX drugiego ( te opisane jako TX i RX w datasheet )

    Doszedłem już do tego jak to się robi przy pomocy PRINT i INPUT jednak nie wiem czemu zaczęło mi wysyłać głupoty dopiero kiedy odpiąłem od układu linię RD układu nadawczego Podejrzewam, że układ który odebrał dane musiał też coś wysyłać i to coś blokowało Nie mam pojęcia Teraz zmieniłem mój program i odbiera jakieś głupoty (z odpiętą jedną linią).

    Jeśli możesz to bardzo proszę daj mi wskazówki jak napisać procedury otwarcia tego kanału Patrzyłem w HELPIE i jest to bardzo skomplikowane Jest tam taka składnia otwarcia

    Code:
    Open "test.biN"for Binary As #2


    czy muszę sporządzać jakiś dodatkowy program o nazwie "test.bin"?



    Żeby podzielić bajt będę musiał stworzyć coś takiego


    Code:
    Dim A As integer 
    
    Dim B(2) As Byte

    A = 123,45
    B(2) = Low(a)
    B(1) = High(a)


    tylko jak mi wtedy to podzieli ?
    i jak to wysłać poleceniem PUT


    Code:
    Put#2 , B (1) 
    
    Put#2 , B (2)


    Jak sądzę odbiorę te dane
    Code:

    Get#2 , B (1)
    Get#2 , B (2)


    jednak jak to połączyć w zmienną INTEGER ?

    0
  • Pomocny post
    #6 13 Wrz 2009 13:45
    grysek
    Poziom 19  

    więc kanał możesz otworzyć tak:

    Code:
    Open "COM1:" for RANDOM as #1


    Szybkość ustawiasz za pomocą polecenia BAUD lub $BAUD na początku programu jeśli nie masz zamiaru tego zmieniać w programie

    Liczba 123,45 nie jest liczbą typu integer tylko single. Liczby typu integer są to liczby całkowite.

    przykład nadajnik:

    Code:
    Dim a as integer
    
    Dim al as byte
    Dim ah as byte

    a = 29424 'binarnie 0111 0010 1111 0000
    al = low(a) 'czyli al binarnie jest równe 1111 0000
    ah = high(a) 'czyli ah binarnie jest równe 0111 0010

    Put #1, al
    Put #1, ah


    odbiornik:

    Code:
    Dim a as integer
    
    Dim al as byte
    Dim ah as byte

    Get #1, al
    Get #1, ah

    a = ah               
    rotate a, LEFT , 8  'a = &b01110010 00000000
    a = a or al            'a = &b01110010 11110000

    Pin RXD ma byc podpięty do pinu TXD drugiegro procesora i odwrotnie czyli na krzyż

    0
  • #7 13 Wrz 2009 14:18
    Jarosław J
    Poziom 14  

    Masz rację Moja pomyłka Chodziło mi o liczbę 12345, której nie mogę zadeklarować jako BYTE Ten przecinek dorabiam sobie później poleceniem np takim

    Cytat:
    Sds1 = Format(sds1 , " 0.0")


    Napisałem coś takiego

    NADAJNIK

    Code:

    $crystal = 8000000
    $baud = 19200

    Cls
    Cursor Off

    Config Serialout = Buffered , Size = 6
    Enable Interrupts
    Enable Utxc
    Dim A As single
    Dim B(2) As Byte
    A = 1

    Do
    Incr A
    B(2) = Low(a)                                               
    B(1) = High(a)                                             
    Home
    Printbin B(1) ; 2


    Lcd "B1=" ; B(1) ; "   "
    Lowerline
    Lcd "B2=" ; B(2) ; "   "
    Wait 1
    Loop


    I ODBIORNIK

    Code:
    $baud = 19200
    
    Dim Flag1 As Byte
    Dim A As single
    Dim B(2) As Byte
    Config Serialin = Buffered , Size = 20
    Enable Interrupts
    Enable Urxc

    Do
    Flag1 = Ischarwaiting()

    If Flag1 = 1 Then
       Inputbin B(1) , 2
      Home
       Lcd "B(1)=" ; B(1) ; "   "
     Lowerline
       Lcd "b(2)=" ; B(2) ; "   "

     End If
    Loop



    pozostaje mi tylko złaczyć te dwie zmienne B(1) i B(2) z powrotem w jedną A jako SINGLE

    Pomoże ktoś jak to zrobić?

    Poza tym zauważyłem że zmienne są zamienione czyli

    Wysyła mi B(1) LSB a LSB odbiera mi jako B(2)
    i odwrotnie wysyłam B(2) jako MSB a odbieram MSB jako B(1)

    Wie ktoś dla czego tak się dzieje? może źle oznaczyłem Low i High, spróbuję zamienić, ale nie sądzę że to pomoże.

    Dodano po 2 [minuty]:

    Wow Super o to mi chodziło Trzeba przesunąć - Jesteś wielki. A jest jakiś chwyt na ujemne liczby (zmienna single) ?

    0
  • Pomocny post
    #8 13 Wrz 2009 14:22
    mirekk36
    Poziom 42  

    Ło matko! ludzie co wy tu opowiadacie?

    Jarosław J - odnośnie twojego problemu ale już konkretnie:

    1. Możesz najspokojniej w świecie przy komunikacji dwóch procków zrobić tak, że jeden będzie taktowany wewn oscylatorem a drugi np. kwarcem (Żaden problem) !!!

    2. ale używaj sprzętowego UARTA w Bascomie a nie to co tutaj wszyscy razem wyczyniacie ;)

    3. możesz w Bascomie wszystko wysłać poleceniem PRINT - dowolne liczby - jak ci się żywnie podoba !!!



    .... a teraz kilka szczegółów do powyższych punktów.

    ad.1 - czyli jak się mają kwarce czy w ogóle taktowanie do prędkości RS232. Zawsze wszyskim powtarzam - zajrzeć sobie na ostatnią stronę rozdziału USART w PDF'ie do swojego procka(-ów) !!! masz tam tabelki z kolejnymi częstotliwościami taktowania i masz podane procenty błędów dla różnych prędkosci transmisji RS232. Proponuję na początek wybrać do testów prędkość 9600 i ten procek który u ciebie działa na wewn oscylatorze przestawić na 8MHz - i nie słuchać bzdur o mniejszej dokładności w odniesieniu do prędkości RS232. Natomiast drugi procek jak rozumiem taktujesz kwarcem większym niż 8MHz i dlatego w ogóle się zdecydowałeś na kwarca ???? czy może dałeś w drugim kwarca też 8MHz lub mniejszego zamiast używać wewn. oscylatora ponieważ uwierzyłeś w kocie banialuki często powtarzana przez początkujących "że lepiej dać kwarc niż wewn oscylator bo będzie dokładniej" ???? (bzdura nad bzdurami - w ogromne większosci wypadków)

    jeśli więc masz kwarc <= 8MHz to go spokojnie odłącz i też daj wewn oscylator. Ale jeśli masz większy to ok - tylko zwróć uwagę na jego częstotliwość - naljepiej aby była to częstotliwość tzw" przyjazna dla RS232" - popatrz sobie w te tabelki to zobaczysz dlaczego do takich kwarców zaliczają się np 11.0592MHz albo 18.432MHz (wiszisz??? bo uzyskujesz dowolne prędkości RS232 z minimalną ilością błędów - czyli masz wolny wybór)

    ale ok przy wewn oscylatorze prędkość 9600 zgodnie z tabelkami może spokojnie działać

    ad.2 - mówisz, że nie ma na forum ani w helpie zbyt informacji o skonfigurowaniu sprzętowego UARTA w procku do pracy w Bascomie - sorki ale to bzdura - wszędzie pełno takich tamatów na elektrodzie. Ok jednak podpowiadam abyś zainteresował się poleceniem:

    Config Serialin - np:

    Code:

    $baud = 9600
    Config Serialin = Buffered , Size = 20


    wystarczy TYLKO ta jedna linijka aby już działał sprzętowy UART !!! i to z cyklicznym buforem o rozmiarze 20znaków. Możesz dać sobie większy w miarę potrzeb. To wszystko - potem już tylko używaj samego polecenia PRINT - resztę w tle będzie za ciebie robił Bascom. Oczywiście ramka będzie od razu standardowo ustawiona na 1bit startu, 8bitów danych, bez parzystości, 1bit stopu

    ad.3 nie czytałeś helpa odnośnie polecenia PRINT ??? a to szkoda - bo byś zobaczył, że możesz zrobić i wysłać wszystko co ci się spodoba np:

    Code:
    Dim a As Byte
    
    a = 122
    PRINT a


    w czym problem aby tak wysłać liczbę ???? hmmm ???

    - jedyne na co musisz zwrócić uwagę przy takiej komunikacji pomiędzy dwoma prockami to to:

    1. aby na obydwu użyć Config Serialin i skonfigurować sprzętowy UART
    2. możesz także na obydwu w miarę potrzeb skonfigurować sprzętowy bufor wyjściowy Config Serialout

    3. najważniejsze - otóż polecenie PRINT na koniec wysyła domyślnie dwa znaki CR i LF
    natomiast polecenie INPUT w drugim procku rozpoznaje koniec linii domyślnie tylko po 1 z tych wyżej wymienionych znaków czyli po CR. W związku z powyższym co chwile by ci pozostawał w buforze jakiś dziwny znak LF.

    można sobie z tym poradzić na 2 sposoby - albo przekonfigurować domyślne działanie INPUT za pomocą Config input albo prościej jeśli chcesz,....

    .... czyli zawsze jak coś wysyłasz poleceniem PRINT to na końcu dajesz właśnie znak CR i średnik, np tak:

    Code:
    PRINT "ala i as";char(13);


    dzięki czemu drugi procek poprawnie odbierze string "ala i as" oraz każdy następny. Oczywiście jak mówiłem wyżej - może to być twoja dowolna liczba bez dzielenia jej na jakieś bajty itp itp itp



    ...... mam nadzieję, że teraz trochę ci się rozjaśniło ? ;)

    1
  • #9 13 Wrz 2009 15:04
    Jarosław J
    Poziom 14  

    Wielkie dzięki mirekk36 Rozjaśniło się i to bardzo !!!

    Właśnie kompiluję i sprawdzam nowe procedury Nie wiem czy się nie zawieszę na liczbach ujemnych (zmienna Single) Jak co to znów poproszę o pomoc. Rzeczywiście daruję sobie te dzielenie bitów. A w Helpie - jak to w Helpie wszystko trochę zawile wytłumaczone (choć w tym przypadku masz rację nie doczytałem jak trzeba).

    Pozdrowienia z Dąbrowy Górniczej

    Dodano po 28 [minuty]:

    I znów problem. Napisałem takie coś

    Nadajnik

    Code:
    Config Serialout = Buffered , Size = 6
    
    Enable Interrupts
    Enable Utxc
    Dim A As Single
    Dim S As Byte
    A = -3.345
       Do
       For S = 1 To 25

       Print S
       Print A
       Home
       Lcd "wyslalem " ; A
       Lowerline
       Lcd "wyslalem " ; S
       Wait 1
       Next S
       Loop



    Odbiornik
    Code:

    Config Serialin = Buffered , Size = 20
    Enable Interrupts
    Enable Urxc
    Dim A As Single
    Dim S As Byte

       Do
       Input S
       Home
       Lcd "odczytalem" ; S
       Input A
       Lowerline
       Lcd "Odczytalem" ; A
       Loop



    Na wyświetlaczu odbiornika nie mam nic tak jakby zawieszał sie na "input s"

    Czy możecie spojrzeć na to ?

    0
  • Pomocny post
    #10 13 Wrz 2009 15:19
    mirekk36
    Poziom 42  

    po pierwsze skąd wytrzasnąłeś:

    Enable Utxc ???? - to jest bez sensu

    poza tym po co taki mały bufor 6 znaków. Daj co najmniej 20 jak w przykładzie

    po kolejne pisałem ci o specjalnym doklejaniu na końcu PRINT'a znaku CR czyli Char(13) i średnika po tym - ale widzę, że albo kolega nie przeczytał tego co napisałem albo tak krótka pamięć ? ;)

    a u ciebie jest np:

    Code:
    PRINT S


    zamiast

    Code:
    PRINT S ; Char(13) ;


    eeeeh ;)

    Dodano po 2 [minuty]:

    aaa poza tym INPUT działa ze stringami a nie

    więc definiujesz sobie np

    Code:
    Dim Dane As String*6
    

    Input Dane

    a później:

    wyświetlasz na LCD te Dane

    a jeśli będziesz je chciał mieć jako liczby to masz polecenia konwersji jak val itp

    0
  • #11 13 Wrz 2009 15:42
    Jarosław J
    Poziom 14  

    Super Rozjaśnia się jeszcze bardziej Już kombinuję dalej ...........

    Dodano po 16 [minuty]:

    Dostosowałem się do wszystkich Twoich rad i zaleceń i stworzyłem takie coś:

    Nadajnik'

    Code:
    $baud = 19200  
    
    Config Serialin = Buffered , Size = 20
    Config Serialout = Buffered , Size = 20
    Enable Interrupts

    Dim A As Single
    Dim A1 As String * 6
    A = -3.345

    Dim S As Byte
    Dim S1 As String * 3

    Do
    For S = 1 To 25
    S1 = Str(s)
    A1 = Str(a)

    Print S1 ; Chr(13)
    Print A1 ; Chr(13)

    Home
    Lcd "wyslalem " ; A1
    Lowerline
    Lcd "wyslalem " ; S1

    Wait 1

    Next S

    Loop



    I ODBIORNIK


    Code:
    $baud = 19200
    
    Config Serialout = Buffered , Size = 20
    Config Serialin = Buffered , Size = 20
    Enable Interrupts

    Dim A As Single
    Dim A1 As String * 6
    Dim S As Byte
    Dim S1 As String * 3

    Do
    Input S1
    Home
    S = Val(s1)
    Lcd "odczytalem" ; S ; "      "
    Input A1
    A = Val(a1)
    Lowerline
    Lcd "Odczytalem" ; A ; "       "
    Loop



    i nie działa W odbiorniku wystawia mi :
    0 i 0.0

    Już jestem bardzo blisko ale coś gdzieś jeszcze się gubi Spojrzelibyście jeszcze raz i wytknęli błędy ?

    0
  • Pomocny post
    #12 13 Wrz 2009 16:21
    mirekk36
    Poziom 42  

    jeszcze raz z uporem maniaka - ale już ostatni raz przypomnę - czy ty nie widzisz że już 2 razy pokazywałem ci przykład w którym na końcu polecenia PRINT vył średnik ????????????????

    powinno być tak:

    Code:
    Print S1 ; Chr(13) ;


    a nie tak

    Code:
    Print S1 ; Chr(13) 


    .... bez tego średnika to już w ogóle wszystko się rozwala. Średnik na końcu powoduje, że polecenie PRINT nie wysyła kodów CR i LF w ogóle. Zostanie wysłany tylko CR który masz w Char(13). A jeśli nie dajesz tego średnika to masz na końcu PRINT wysłane CR CR i jeszcze LF

    0
  • #13 13 Wrz 2009 17:35
    Jarosław J
    Poziom 14  

    Wszystko się zgadza i wszystko się udało. Bardzo dziękuję za pomoc, po raz kolejny widzę, że jesteście w niektórych sytuacjach niezastąpieni. Po raz pierwszy w życiu wziąłem się za komunikację UART i z Waszą pomocą wiele zrozumiałem.
    Wszystkiego dobrego i do następnego razu (problemu) Mam też nadzieję, że sam będę mógł teraz też pomóc.

    0
  • #14 21 Wrz 2009 22:45
    dorotazukowo
    Poziom 9  

    Może jeszcze i ja się podłączę do tematu.
    Mam już gotowy dość pokaźny sterownik do kominka CO i komunikuję się z nim poprzez PC w taki sposób że odpytuję go o różne parametry po czym sterownik mi odpowiada.
    Chciałbym do tego modułu dorobić osobny panel/wyświetlacz aby na nim były wyświetlane odpowiednie parametry oraz była także klawiaturka 6 przyciskowa.
    Ale niestety sterownik jest już gotowy i można się z nim komunikować tylko przez RS232.
    Czy istnieje możliwość podłączenia się ze sterownikiem poprzez inny panel/moduł z atmegą i MAX232 ? Zakładam że tak. Po prostu zapewne należy zrobić to tak jak z podłączeniem do PC-choć może się mylę ... tu czekam na Wasze sugestie.
    Po drugie nie chciał bym stracić możliwości komunikacji PC ze sterownikiem kominka. I tu zapewne będzie już problem... Zamieścił bym program ze sterownika ale ma prawie 32k i jest ostro pomieszany-lecz działa bez zarzutu,ale zamieszczę schemat sterownika.
    Proszę o jakieś sugestie.

    [BASCOM] Prosta komunikacja dwóch mikrokontrolerów

    0
  • #15 22 Wrz 2009 00:10
    rpal
    Poziom 27  

    Ja bym koledze tak doradził, co do samej komunikacji. Jakieś 2 miesiące temu sam nad tym się głowiłem jak to zrobić i w końcu praktycznie sobie wdrożyłem zwykły RS232 tyle że pracujący na najwyższych obrotach. Początkowo obawiałem się że "system" niewydoli przepuszczać w te i we wte informacji jednak i mile się rozczarowałem. Na potrzeby tego rozwiązania wykombinowałem sobie swój własny protokół który w dużym skrócie sprowadza się do wysyłania i odbioru swoisty komend o nieznanej długości ale znanym początku i końcu. Na tej podstawie dwa urządzenia wzajemnie się dogadują, przez "rozszyfrowanie" komendy oraz jej zinterpretowanie oraz wykoania. Nie wiem jakby to wyglądało w Bascom ale w C to lata wszystko w przerwaniach i jest ogólnie rzecz biorąc git. Plusem jest to że nie ogranicza mnie w żaden sposób odległość a po drugie można sobie spradzać działanie na zwykłym PC-cie. Na potrzeby swojego pomysłu napisałem sobie nawet w VB prosty program który udawał urządzenie którego jeszcze nie było i w ten sposób spradzałem i programowałem to które już istniało. Reasumując nie ma co się tu zastanawiać tylko użyć po prostu RS232 który masz już że tak powiem w standarcie.
    Natomiast co do drugiego pytania jak dołożyć jeszcze wyświetlacz i klawiaturę kiedy już masz de facto wszystko skończone to ja bym na twoim miejscu między ULN2803 wsadził dwa rejestry zatrzaskowe np. 74HC273 podpięte swoimi wejściami pod 4 linie danych PORTC dla każdej linni po dwa wejścia równolegle połączone. Kolejne 2 linie użył do zatrzaskiwania LSB i MSB słowa 8 bitowego i w ten oto sposób oszczędziłbym jeszcze 2 linie SDA i SCL. Widzę że ten port pracuje raczej dość statycznie bo steruje przekaźnikami więc wiele roboty on tam nie ma :) Wyjścia tego zatrzasku oczywiście na wejście ULN2803. W ten oto uzyskane dwie linie SDA i SCL użyłbym dla tego dodatkowego wyświetlacza i klawiatury realizując to na zwykłych portach we-wy w standarcie I2C. Będzie wilk syty i owca cała.
    A jeśli miałbyś gdzieś w układzie jakąś bramkę NAND to można by było pokusić się o zanegowanie jednej linii do zatrzaskiwania rejestrów tak aby zmiana na jednym pinie 0/1 i 1/0 powodowała naprzemienne zatrzaskiwanie LSB i MSB a drugą wolną linię użyć do zerowania rejestru. Jeśli twój ULN2803 jest w obudowie DIL i jeszcze masz np. podstawkę do można pokusić się o wsadzenie takiej "łaty" na jakimś małym PCB i wpięcie się wprost w obecny układ bo masz tam wszystkie niezbedne linie sygnałów i zasilania. I2C działa na nieduże odległości więc jesli to będzie kilkadziesiąt cm to nie powinno być kłopotów z transmisją.
    Pytania czy można się połaczyćprzez inny panel nie rozumiem bo po co to skoro łaczysz się przez PC?

    0
  • #16 22 Wrz 2009 00:32
    dorotazukowo
    Poziom 9  

    Witam kolegę.
    Możliwe że trochę zamąciłem i nie wyraziłem się dość jasno/
    Otóż sprawa wygląda następująco. Gotowego urządzenia jakie posiadam nie mogę już przerabiać bo jest już wszystko skończone ,zmontowane i "przykute" do ściany.
    Z tym urządzeniem można się tylko i wyłącznie skomunikować poprzez RS232.
    W tym momencie mam podpięte do niego komputer.
    Poza komputerem chciałbym podłączyć do niego kolejne urządzenie i także przez RS232.
    Zależy mi bardzo na tym aby mieć nadal możliwość łączenia się z gotowym już urządzeniem przez PC. Bo rozumiem że jeśli odepnę PC i w to miejsce podłączę drugie urządzenie to wszystko powinno śmigać ale czy da się także podłączyć PC? Podejrzewam że nie, przynajmniej nie w prosty sposób.

    Czy to drugie urządzenie jakie zbuduję także muszę wyposażyć w MAX232? Sądzę że na 100% bo inaczej się nie zgrają.
    Co do VB to także piszę proste programy symulujące gotowe moduły które są w trakcie realizacji.

    0
  • #17 22 Wrz 2009 17:33
    rpal
    Poziom 27  

    Ja jeszcze bardziej nie rozumiem ? PC+sterownik (z postu)=1 kabel RS232 Jak odepniejsz PC-ta i podłaczysz to coś to jesli zachowasz informacje które ten sterownik rozumie czyli dodatkowe urządzenie bedzie musiało odbierac i wysyłać to samo co PC. Na jednym kablu może być 1 komplet. Masz dwa złacza w PC po RS232 więc możesz podłaczyć dwa układy albo dołozyć kartę lub USB i ganiać ich więcej z PC-ta. Oczywiście zachowując standard napięć który gwarantuje MAX232 co jednoznacznie przesądza sprawe że ma być. W tym co wkute w ścian eprogram możesz zmieniać ? No bo jesli tak to i możesz założyć coś jeszcze na zasadzie "wtyczki" o ile nie ingeruje to w samo PCB ?

    0
  • #18 22 Wrz 2009 18:40
    dorotazukowo
    Poziom 9  

    heh :)

    No to jeszcze raz.
    Mam gotowe urządzenie które komunikuje się z PC poprzez rs232.
    Chcę (a właściwie jestem zmuszony) aby do tego gotowego urządzenia podłączyć zamiast PC inne urządzenie które właśnie robię.
    Oczywiście nowe urządzenie zachowa protokół danych jaki wysyłał i odbierał PC tak więc się porozumieją.

    Ale jest dylemat tego typu że muszę się dodatkowo porozumieć jeszcze pomiędzy PC a którymś z tych urządzeń.I tu właśnie jest problem. Myślałem że można jakoś umieścić na jednej linii to drugie urządzenie i PC. Ale to chyba odpada. Czy Atmega potrafi w jakikolwiek sposób współpracować z dwoma układami MAX232 tak aby z jednego urządzenia wychodziły dwie linie z których na jednej siedział by PC a na drugiej to inne nowe urządzenie.

    Wyraźniej już chyba nie dam rady tego wyjaśnić :)

    0
  • #19 22 Wrz 2009 18:52
    rpal
    Poziom 27  

    Ten Atmega nie bo ma tylko 1 port pozostaje zastosowanie przełącznika np.mechanicznego który będzie prałączał linie ale bynajmnien nie podczas trwającej transmisji inczej się nie da.

    0
  • #20 22 Wrz 2009 19:51
    dorotazukowo
    Poziom 9  

    Mechaniczny w 100% odpada :)
    Musi być jakieś inne rozwiązanie.Jestem w trakcie tworzenia nowego urządzenia i na etapie elektronicznym mogę jeszcze do woli wszystko zmieniać.

    Dodano po 7 [minuty]:

    hmm mam pewien pomysł. Jako że w nowym układzie wolnych pinów procka mi nie brakuje to może jest możliwość programowego sterowania którymś wyjściem procka tak aby przełączał linię. Stare urządzenie jakie już posiadam odpowiada na pytania jakie zadaję z pc wiec odpowie mi dokładnie to czego oczekuję.
    To nowe urządzenie także można zaprogramować w ten sam sposób.
    Problem dla mnie tkwi w tym w jaki sposób przełączać linie RxD i TxD , raz na PC a drugi raz na drugie urządzenie. Mozna by to zrealizować na jakimś przekaźniku ale cykliczne przełączanie doprowadziło by mnie do szału i jest jakoś tak nie smaczne.
    Czy jest jakaś kostka która potrafi przełączać takie sygnały w taki sposób że podaję stany logiczne 1 i 0 na któreś wyjście procka a ono steruje jakimś elektroniczną bramką-przełącznikiem? Myślałem nad układami ze sprzętu audio które przełączają wejścia sygnałowe np serii SAA ale może są jakieś prostsze.

    Dodano po 40 [minuty]:

    A może Atmega 128?
    2x USART ?
    Czy jest to wykonalne na tym procku tak aby użyć 2* Max232 ?

    0
  • #21 22 Wrz 2009 20:21
    mirekk36
    Poziom 42  

    no skoro ATmega128 ma 2x UART to przecież można

    ale nie tylko ATmega128 ma 2x UART - taką opcję mają też inne procki, np

    ATmega64

    ale także seria ATmega48/88/168/328 tyle że w nich drugi UART trzeba zrobić z interfejsu USI czyli nie będzie on tak wprost np w Bascomie dostępny jako drugi RS232 na zasadzie jak w ATmega64/128

    więc zamiast kombinować - bierzesz ATmega64 i działasz albo i 128 jak wolisz

    ..... wtedy możesz zrobić tak, że to twoje nowe urządzenie będzie jakby pomiędzy PC a tym sterownikiem CO.

    0
  • #22 22 Wrz 2009 20:39
    dorotazukowo
    Poziom 9  

    I o to chodziło :) <OK>

    0
  • #23 22 Wrz 2009 21:34
    rpal
    Poziom 27  

    dorotazukowo jak to jest że przez większość tematu pisałeś że zmiana konstrukcji nie wchodzi w grę tylko ma być to co zabetonowane a teraz coś się zmieniło ? Masz też Atmega 162 także ma 2 porty sprzętowe jak już się na nie zdycydujesz. Albo idź w ślepą uliczkę tak jak ja niedawno i zakup sobie XR68C681 a gwarantuję przednią rozrywkę przy jego odpalaniu :)

    0
  • #24 22 Wrz 2009 21:50
    dorotazukowo
    Poziom 9  

    hehe
    a no jest to "zabetonowane". Ale robię w tej chwili drugie urządzenie i doszedłem do wniosku że PC podłączę właśnie do nowego urządzenia a stare będę odpytywał z PC pośrednio poprzez nowe urządzenie.Czyli coś w stylu:

    PC <=> Nowe urządzenie <=> Stare urządzenie

    i chyba w takiej postaci będzie można dołączać kolejne urządzenia.Tylko kod będzie trzeba tak zmodyfikowac aby to wszystko śmigało.

    0
  • #25 31 Maj 2015 10:29
    Jacek54
    Poziom 10  

    nikt tego nie napisał, czy Ta prosta komunikacja miedzy dwoma µC odbywa się bez udziału Max232 czy też jakiś inwerterów.
    Czy dobrze rozumiem, łączymy bezpośrednio na krzyż RxD z TxD ?

    0
  • #27 31 Maj 2015 14:26
    Jacek54
    Poziom 10  

    czyli jak mam dwie atmegi 8, obie na 5V, tołącze na krzyż bez dodakowych elementów ?

    0
  • #29 05 Cze 2015 10:51
    Jacek54
    Poziom 10  

    W podanym wyżej przykładzie odbieram dwie zmienne tekstowe instrukcją

    input S1
    input A1

    raz pod zmiennymi przypisywane są prawidłowe wartości, a za chwilę na krzyż, to znaczy pod zmienną S1 przypisywana jest wartość wysłana instrukcją

    Print A1;chr(13);

    a pod zmienną A1 jest przypisywana wartość wysłana instrukcją

    Print S1;chr(13);

    a za moment jest prawidłowo.
    Mam pytanie, jak temu zaradzić ?

    0
  • #30 08 Cze 2015 11:10
    373522
    Użytkownik usunął konto