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

Konfiguracja portów Atmega16 i Atmega128 z SN75176 przez UART RS485

rudy_102 09 Gru 2006 13:30 2981 9
REKLAMA
  • #1 3311748
    rudy_102
    Poziom 11  
    Posty: 7
    Witam,
    mam taki problem muszę komunikować atmege16 z atmegą 128 (obie L) przez uart i uklad sn75176(Rs 485) . Do układu mam także dołączony terminal przez (max232). Program ma działać tak: mega16 odbiera z terminala i wysyła dalej do 128 ta odbiera daną wysyła z powrotem do 16. Problem polega na tym , że jak w obu megach mam ustawiony port, na którym jest podpięty sn75176 (w 16 - portd.6 w 128 portb.6) jako wyjściowy to program nie działa jeśli w jednej z nich ustawię go jako wejściowy to program działa....

    soft do 16 (kawałek):
    
    DDRD=0x42; //jak zmienie na 0x02 to dziala z terminalem w tej formie                 
                        //nie dziala w o gole
    PORTD=0x83;
    while (1)
          {       
          UCSRB=0x10;
          PORTD.6=0;     //tutaj podpiety jest sn75176
          
                            while(!(UCSRA &(1<<7)));
                            x=UDR;
            
            UCSRB=0x08;                
            PORTD.6=1;                  
                            
                            while(!(UCSRA &(1<<5)));
                            UDR=x;
            
          }
    


    kod megi 128:
    
    DDRE=0x42;     
    PORTE=0x03;
    
                 DDRB=0x42;
                 PORTB=0x83;
      
    
    while (1)
          {
        
        UCSR0B=0x08;
       PORTB.6=1;  
                 while(!(UCSR0A & (1<<5))) ;
                   
                    UDR0=x; 
       UCSR0B=0x10;              
       PORTB.6=0;                
                     while(!(UCSR0A & (1<<7))) ;
                 
                    x=UDR0; 
                    
                    PORTA=x; 
            }


    może ktoś ma jakieś pomysły??
    ps) dodam, że płytka była sprawdzana i wygląda, że jest ok
    pozdrawiam
  • REKLAMA
  • #2 3312069
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    działając na RS485 musisz zadbać programowo o to aby zwalniać magistralę po nadaniu informacji. Czyli jeden uC wystawia stan 1 do SN75176 a drugi cały czas jest na nasłuchu czyli wystawia 0 na SN75176. Po odebraniu danych procki muszą przełączyć stany na odwrotne jeśli nadawanie ma iść w drugą stronę i to jest całkiem normalne ;)

    ... dzięki temu do jednej magistrali RS485 możesz podłączyć wiele procków tylko trzeba zadbać wtedy szczególnie o to żeby nie było "bałaganu" w komunikacji. Stosuje się wtedy metody typu Master-Slave lub inne zapewniające odpowiednią komunikację w zależności od potrzeb. To już twoja inwencja - jak sobie przemyśleć protokół przesyłu danych ;)

    pozdrawiam
  • REKLAMA
  • #3 3312362
    rudy_102
    Poziom 11  
    Posty: 7
    dzięki za odpowiedź,
    ale skoro w programie po nadawaniu i odbieraniu procki zmieniają stany (na przeciwny) na wejściu sn75176 to skąd miałaby brać się bałagan w linii transmisyjnej??
    Ponieważ mam tylko dwa procki to sposób z adresowaniem jest chyba bezcelowy?? może masz jakieś sugestie jak to rozwiązać??
    /pozdrawiam
  • #4 3312384
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    masz rację przy dwóch prockach łatwo to opanować i pewnie że nie trzeba adresować itp ;) ... niedawno jakiś miesiąc może 2 temu właśnie też pierwszy raz robiłem coś na RS485 z tymi scalaczkami i jednocześnie na tej samej magistrali podpięty PC.

    ... ale możesz mi pokazać kawałek schematu jak masz podłączone do każdego procka te układy SN75... ? bo coś mnie tu zastanawia - masz połączone nóżki 2 i 3 w tym SN75176? i to nimi sterujesz magistralę?

    ... jeśli tak to na początku obydwa procki są w stanie odbioru prawda? na te dwie nóżki podane jest 0. Następnie jeden uC zaczyna nadawać więc zmieniasz na odpowiednim porcie który steruje tymi nóżkami stan z 0 na 1 i wtedy dopiero zaczynasz nadawanie. Drugi powinien to odbierać i to u ciebie chyba działa tak? po skończonej operacji nadawania ten pierwszy uC zwalnia magistralę i znowu ustawia 0 na te dwie nóżki ;) .... czyli przechodzi na odbiór - wtedy twoja druga atmega robi analogicznie - zmienia stan magistrali na 1 i zaczyna nadawać ....

    ja to robiłem wszystko w asemblerze i na przerwanich i co jakiś czas na początku po jakimś czasie przestawało mi to działać ... wtedy okazało się, że jednak gdzieś w programie przeoczyłem i nie zwalniała się nieraz magistrala po nadaniu wiadomości. ;) .... poprawiłem babola i układziki narazie 3 śmigają ładnie - niedługo dojdą kolejne ;)

    pozdrówka
  • #5 3312615
    rudy_102
    Poziom 11  
    Posty: 7
    Tak działa jak opisałeś, ale dziwne jest to , że jak w obu programach port, do którego jest podpięty sn75176 jako wyjściowy to program siada, jeśli natomiast ustawie w jednym z programów port jako wejściowy to mam transmisję w jedną strona (jak w Twoim opisie)
    schemat w załączniku - w układzie są jeszcze kondensatory 100nF przy zasilaniu sn75176 (brak ich na schemacie).
    może mógłbyś wrzucić mi swój kod ;) ???
    /pozdrawiam[/img]
    Załączniki:
    • Konfiguracja portów Atmega16 i Atmega128 z SN75176 przez UART RS485 schemat.gif (5.19 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #6 3313069
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    ok ... pierwszy błąd (chyba że tak tylko na schemacie jest a w rzeczywistości inaczej) to zlikwiduj jeden rezystor 120R - on powinien być tylko jeden. Po drugie piny którymi sterujesz ustaw obydwa jako wyjścia koniecznie ... i wtedy ustawiaj na nich albo 0 - odbiór albo 1 - nadawanie - tak musi działać! ;) ... (sprawdź dobrze czy odpowiednio na odpowiednich pinach portów ustawiasz dobrze kierunek WE/WY)

    ... a co najważniejsze jak już zrobisz tak jak ci mówiłem to sprawdź w momencie nadawania poprostu miernikiem czy oscylem(jak masz) jaki jest stan na pinie sterującym i w momencie gdy odbiera też. To musi tak ruszyć ;) ... a jak nie to poszukam ale późniejszym wieczorkiem kawałek kodu ... chociaż tak na szybko to na początku testowałem to na przykładach wysyłania i odbierania przez RS z noty aplikacyjnej (akurat robilłem to na ATTiny2313)

    pozdrówka
  • REKLAMA
  • #7 3313741
    rudy_102
    Poziom 11  
    Posty: 7
    ok, dzięki za pomoc co do tych rezystorów to sprawdzę to , ale tak było na jakimś przykładzie w necie ;) . Wiem, że port do, którego jest podłączony sn75176 musi być ustawiony jako wyjściowy, ale jak go tak ustawiam w obu megach to mi soft pada- kolega powiedział mi , że może być problem z szybkością przełączania sn75176 z nadawania na odbiór i odwrotnie - sprawdziłem to na szybkiego i chyba tak jest bo soft ruszył na diodzie ;). Dokładne wyniki jego i Twoich rad będę znał we wtorek, gdyż układ jest w innym mieście i właśnie wyjechałem ;)
    pozdrawiam dam znać jakie są wyniki
    Dziękuję jeszcze raz za pomoc i

    ps)możliwe także, że problem jest w tym, że w układzie oprócz sn75176 jest max232 do sprawdzania na kompie..póki co został wylutowany we wtorek będę wiedział więcej :)
  • REKLAMA
  • #8 3313821
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    na jakiej diodzie???? tzn gdzie ją dałeś? ;) ja uzyskiwałem przy takim układzie prędkości transmisji 115200 przy kwarcu 11.059.200 Hz. Schemat połączeń uC z SN75176 mam dokładnie taki jak ty, poza tym że tylko 1 rezystor 120R. A tak nawiasem mówiąc - o jakim czsie przełączania mówisz? przecież przed wysłaniem ustawiasz stan wysoki i po zakończeniu wysyłania stan niski. Oczywiście trzeba poczekać chwilę aż ostatni bit zostanie wysunięty z rejestru ale są do tego znaczniki, które mówią o tym że bufor nadawczy jest już pusty ;) .... (a ty na jakie prędkości masz ustawioną transmisję?)


    poniżej procedury odbioru po jednym bajcie:

    RS_rec:
    sbis UCSRA, RXC
    rjmp RS_rec
    in R16, UDR
    ret

    wywołanie:

    cbi PORTB, 6 ; ustawienie stanu niskiego na pin sterujący SN75176
    rcall RS_rec ; oczekiwanie na odebranie 1go bajtu, na wyjściu w R16



    w C:

    unsigned char USART_Receive(void)
    {
    while ( !(UCSRA & (1<<RXC)) );
    return UDR;
    }

    ... nie opiszę jak w C to wywołać i ustawić bit sterujący SN75176 bo nie wiem ;)

    a tu poniżej procedury nadawania po 1 bajcie:

    RS_transmit:
    sbis UCSRA, UDRE
    rjmp RS_transmit
    out UDR, R16
    ret

    wywołanie:

    sbi PORTB, 6 ; ustawienie stanu wysokiego na pin sterujący SN75176
    ldi R16, bajt_do_nadania
    rcall RS_transmit ; wysłanie 1go bajtu, na wejściu podany w R16

    loop:
    sbis UCSRA, UDRE ; oczekiwanie aż bajt zostanie całkowicie wysłany
    rjmp loop

    cbi PORTB, 6 ; zwolnienie magistrali ze stanu nadawania


    w C:

    void USART_Transmit( unsigned char data )
    {
    while( !(UCSRA & (1<<UDRE)) );
    UDR = data
    }





    ok ... powodzenia - napewno się uda RS485 to bardzo fajny, prosty i pewny sposób komunikacji ;)
  • #9 3315878
    rudy_102
    Poziom 11  
    Posty: 7
    źle się wyraziłem ... dioda na porcie tzn. odebraną daną wystawiałem na port, żeby zobaczyć czy coś odbiera...i odbiera ;). jak już pisałem we wtorek będę wiedział więcej i dam znać jak poszło.
    Z Twoim kodem i nową wiedzą myślę, że się uda - nie ma wyjścia musi się udać :). Prędkość to 9600 na kwarcu 8MHz w docelowym projekcie będzie niestandardowa 10000 (dla samych meg) -wg atmela na 9600 są bardzo małe błędy (0.2%).
    Co do czasu przełączania - to zmiana na porcie gdzie jest podłączony sn75176 z nadawania na odbiór(i odwortnie) to doradził mi kolega mówił , że miał podobny problem i sprawdzał na oscyloskopie(nie posiadam) , że faktycznie układzik trochę się spóźniał dodał małe opóźnienie i poszło - ja dodałem opóźnienie i zaczęło działać, ale to jeszcze będę sprawdzał

    pozdrawiam i dziękuję.
  • #10 3423665
    rudy_102
    Poziom 11  
    Posty: 7
    Witam, dawno nie pisałem ;)
    problem został rozwiązany dla tych co się z nim kiedyś spotkają w załączniku są pliki z komunikacją po stronie nadajnika i odbiornika. Korzystają z przerwania. Soft powstał w CodeVision.
    Ciekawa dyskusja na ten temat jest na grupach yahoo niestety trzeba się logować
    http://tech.groups.yahoo.com/group/codevisionavr/message/2455
    Co do softu to wysyłana jest ramka typu $ 1 2 3 4 5 6 7 8 #
    gdzie $ - START_BYTE
    #- STOP_BYTE
    a cyfry to informacja

    pierwszy rozkaz jest wysyłany przez funkcje send, która wysyła rozkaz startu i ustawia informację do wysłania. Informacje te zapisywane są do tablic bad_orders i orders oraz są przesyłane - wszystko jest w kodzie
    ps) nie należy podłączać 'nóżki nadajnika' odmax'a 232
    pozdrawiam i zamykam temat
    Załączniki:
    • send.rar (2.16 KB) Musisz być zalogowany, aby pobrać ten załącznik.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemów z komunikacją UART RS485 między mikrokontrolerami Atmega16 i Atmega128 przy użyciu układu SN75176 oraz terminala podłączonego przez MAX232. Głównym zagadnieniem jest prawidłowa konfiguracja portów sterujących SN75176, gdzie oba mikrokontrolery muszą na przemian przełączać linie sterujące między trybem nadawania (stan wysoki) a odbioru (stan niski). Problem pojawia się, gdy oba porty są ustawione jako wyjściowe – wówczas transmisja nie działa poprawnie, natomiast ustawienie jednego portu jako wejściowego umożliwia komunikację jednokierunkową. Wskazano, że konieczne jest programowe zarządzanie magistralą RS485, zwalnianie jej po nadaniu danych oraz stosowanie opóźnień przy przełączaniu trybów nadawania i odbioru, aby uwzględnić czas reakcji układu SN75176. Zalecane jest stosowanie jednego rezystora terminującego 120Ω na linii oraz dokładne ustawienie kierunku portów sterujących jako wyjściowe. Przykładowy kod do odbioru danych z wykorzystaniem przerwań i funkcji w CodeVision AVR został udostępniony, a także podkreślono, że nóżka nadajnika MAX232 nie powinna być podłączana do linii RS485. Ostatecznie problem został rozwiązany poprzez odpowiednie zarządzanie stanami portów i synchronizację transmisji, co umożliwiło dwukierunkową komunikację między Atmegami przez SN75176.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA