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

Mikrokontroler 89c2051 sterowany z PC poprzez port szeregowy

losradaros 02 Gru 2004 19:20 3630 8
REKLAMA
  • #1 1031129
    losradaros
    Poziom 2  
    Posty: 2
    Mam uklad, na ktorym jest mikrokontroler 89c2051. Chce sterowac tym miktrokontrolerem poprzez port szeregowy. Nigdy wczesniej czegos takiego nie robilem. Znam sie na c++, c, java. Z assebmlerem na mikroprocka tez nie ma problemu. Czy moglby mi ktos pomoc i podeslac jakies linki. Generalnie chodzi o komunikacje na porcie szeregowym. Wysylanie, odbieranie.. no i chyba jakos to trzeba zsynchronizowac z czestotliwoscia procka? Dzieki za wszelka pomoc.

    pozdrawiam

    Radarek
  • REKLAMA
  • #3 1031721
    juntom
    Poziom 19  
    Posty: 216
    Pomógł: 35
    Ocena: 27
    Najprosciej wykorzystac ktorys z dostepnych komponentow do c++ buildera lub delphi , ale najlepiej /moim zdaniem/ skorzystac z API - polecam ksiazke "rs232c od pascala i c++ do delphi i buildera" Pana Andrzeja Daniluk.

    pozdr.
  • REKLAMA
  • #4 1032538
    myrcioch
    Poziom 18  
    Posty: 150
    Pomógł: 30
    Ocena: 5
    Jakie środowisko pracy preferujesz?
    Bardzo wygodnie działa się pod wspomnianym C++ Builderem, do tego jakiś komponent nie blokujący pracy głównego programu - np. ciacomport i już działasz.
    Z synchronizacją nie ma problemu - zarówno na 51 jak i w PC-cie ustawiasz po prostu jedną ze standardowych prędkości portu szeregowego - np. 9600.
  • REKLAMA
  • REKLAMA
  • #6 1034115
    SACZI
    Poziom 16  
    Posty: 302
    Pomógł: 6
    Ocena: 14
    A ja zaproponuję inną metodę.
    Użyj Visual Basica i jego słynna kontrolkę MSComm. Piszę się na tym bajecznie prosto!
    Odbiór:
    
    Private Sub MSComm1_OnComm()
    
    Select Case MSComm1.CommEvent
    
    _Case comEvReceive
    ___RichEdit.Text = MSComm1.Input
    _End Select
    End Sub


    Wysyłanie
    
    Private Sub Send_Click()
    ___MSComm1.Output = Text5.Text
    End Sub


    Znaczna część przykładów na różne "okoliczności" jest w Helpie. Nie masz się co przejmowac gadaniem, że VB to programowanie dla tępych. Nie piszesz przeciez systemu operacyjnego! Liczy sie przede wszystkim efekt!Ja pisałem aplikacje dla RSa pod C++ Builder z wykorzystaniem API na podstawie książki Andrzeja Daniluka "Praktyczne programowanie RS232c ...". Powiem jedno: to jest męczarnia!
    Mogę natomiast zrozumieć przywiązanie do jakiegoś środowiska. Osobiście nie lubię pisać pod VB (ohydne środowisko, ale prosty język ...), ale doskonale pisze mi sie pod C++ Builderem.
    Proponuję Ci ciekawy "myk": zaimportuj MSComm do C++ Buildera. Algorytmy zostają z VB, ale środowisko borlandowskie.

    Pozostają Ci również kobntrolki pisane przez innych programistów i inne firmy. Najłatwiejszą użyciu jest
    nrComm. Niestety, jest komercyjna.

    Klasyką, to jest chyba ComPort Library by Dejan Crnila (szukaj tego w google). Niestety, dość ciężka w instalacji, ale jeden z moich wykładowców dzięki temu komponentowi napisał oprogramowanie do symulatora samolotu.

    Ogólnie, co kto lubi.
  • #7 1036668
    losradaros
    Poziom 2  
    Posty: 2
    myrcioch napisał:
    Jakie środowisko pracy preferujesz?


    Najchetniej Visual C++... borlandem sie nie bawilem, a basica nie znam w ogole i raczej nie poznam chyba ze mnie do tego zmusi zycie :-) (znam troche jezykow wiec poznanie basica nie jest zbyt oplacalne :-) )
  • #8 1065072
    gol
    Poziom 14  
    Posty: 76
    Pomógł: 4
    Ocena: 5
    a wie ktoś jak to zrobić pod linuxem w c
  • #9 1065149
    myrcioch
    Poziom 18  
    Posty: 150
    Pomógł: 30
    Ocena: 5
    Obsługa portu szeregowego w C pod linuksem?

    1. Otwieranie portu szeregowego 9600/8/1, bez linii kontroli przepływu:
    int serialfd,max_fds;
    struct termios rs_param;
    serialfd=open(devname,O_RDWR | O_NOCTTY);
    bzero(&rs_param, sizeof(rs_param));
    rs_param.c_cflag=B9600 | CS8 | CREAD | CLOCAL;
    tcflush(serialfd, TCIFLUSH);
    tcsetattr(serialfd,TCSANOW,&rs_param);
    max_fds=serialfd+1;

    2. Obsługa odczytu
    while(1)
    {
    FD_ZERO(&readfds);
    FD_ZERO(&writefds);
    FD_SET(serialfd,&readfds);
    clk.tv_sec=0;
    clk.tv_usec=100000;
    select(max_fds,&readfds,&writefds,NULL,&clk);
    if(FD_ISSET(serialfd,&readfds))
    {
    //obsluga_odczytywanych_danych - odczyt bo 1 bajcie
    read(serialfd,&rsinbuf[rsinbufcntr],1);
    ++rsinbufcntr;
    }
    //jeśli nie ma danych, to tutaj jesteśmy co 100ms
    }

    3. Wysyłanie danych
    write(serialfd,rsoutbuf,n_bajtow);

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy sterowania mikrokontrolerem Atmel 89c2051 poprzez port szeregowy z komputera PC. Poruszono kwestie implementacji komunikacji szeregowej, w tym wysyłania i odbierania danych oraz synchronizacji prędkości transmisji z częstotliwością taktowania mikrokontrolera. Zaproponowano wykorzystanie dokumentacji Atmel, w tym notatek aplikacyjnych dotyczących UART z przykładami w C i assemblerze. Wskazano na możliwość użycia gotowych komponentów do C++ Buildera lub Delphi, a także API do obsługi RS232, z poleceniem książki Andrzeja Daniluka „Praktyczne programowanie RS232c”. Omówiono również alternatywne metody, takie jak użycie kontrolki MSComm w Visual Basicu do prostego programowania portu szeregowego. Poruszono kwestie synchronizacji prędkości transmisji (np. 9600 bps) zarówno po stronie mikrokontrolera, jak i PC. Dla użytkowników systemu Linux przedstawiono przykładowy kod w C do otwierania, konfiguracji i obsługi portu szeregowego z wykorzystaniem funkcji systemowych (open, tcsetattr, select, read, write). Podkreślono, że synchronizacja polega na ustawieniu zgodnych parametrów transmisji po obu stronach łącza.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA