Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Atmega16] [C++/WinAPI/BASCOM] [RS232/UART] - Aplikacja w C++ i WINAPI

lukiradom 04 Dec 2012 21:30 2856 5
  • #1
    lukiradom
    Level 10  
    Witam, przez kilka ostatnich dni próbuję rozgryźć cały ten port COM, udało mi się "dogadać" z Atmegą16, jednak tylko przez terminal (dokładnie przez SimpleTerm, HyperTerminal oraz przez terminal BASCOM-AVR). Wszystko fajnie działa, jednak gdy przychodzi mi napisać program w czymkolwiek, czy to WinAPI+C, WinAPI+C++, C#, Delphi, to za nic w świecie nie chce działać. Dlatego myślę, że elektronika jest ok, skoro można przesyłać dane, dlatego poniżej zamieszczam swoje kody i jeśli będzie taka potrzeba, zrobię ładny schemat i zamieszczę zdjęcia mojej płytki. Streszczając, komunikuję się tak:

    PC=>Konwerter USB->RS232=>MAX232=>Atmega16

    Konwerter na układzie Prolific PL-2303.

    Co do samej płytki, to zawiera ona dodatkowo 3 mostki L293D, cały układ tymczasowo zasilany z USB, testowany na 1 silniku DC. Atmega chodzi na wewnętrznym kwarcu.

    Kod BASCOM:

    Code: vbnet
    Log in, to see the code



    Kod C++

    Code: cpp
    Log in, to see the code



    Dodam jeszcze, że terminal 232Analyzer nie chce współpracować. Może to coś z buforowaniem? Z może z jego brakiem po stronie AVR?

    Z góry dziękuję za ewentualną pomoc, będę wdzięczny.
  • #2
    krru
    Level 33  
    Przydałoby się wysyłać jakieś zakończenie - pamiętaj, że RS transmituje dane znak po znaku, w dodatku dość wolno (jak na procki).
  • #3
    lukiradom
    Level 10  
    Znalazłem trochę podobny wątek do mojego:

    Link


    Pobrałem bibliotekę UART.h i udało mi się nawiązać kontakt z AVRem. Kod mi wyszedł taki:

    Code: cpp
    Log in, to see the code


    Lekko zmodyfikowałem funkcję ReadUart, aby wypisywała zmienną buf:

    Code: cpp
    Log in, to see the code


    Natomiast Atmega wysyłała mi cały czas tekst "Zrobione":

    Code: vbnet
    Log in, to see the code



    Coś już odbiera, dokładnie to coś takiego:

    (■(n■(e
    n(b(ib(on(en(
    r(Zr(or(br(ir(or(nr(er(
    o(rZ(oZ(bZ(io(no(eo(
    b(Zo(ro(ob(ib(ob(nb(eb(
    n(rZ(oZ(bZ(iZ(on(en(
    e(Zn(rn(on(bi(oi(ne(
    ((Ze(ro(bo(io(oo(no(e
    o(o(no(eo(
    i(Zr(or(bi(oi(ni(ei(
    ((Zr(or(br(ir(or(nr(e
    n(n(en(
    n(Zn(ro(bo(io(oo(no(eo(
    (Z
    (r
    (o
    (b
    (i
    n(n(en(
    o(Zn(ro(bo(io(oo(no(eo(
    b(rZ(ob(ib(ob(nb(eb(
    e(Zr(or(br(ir(or(ne(
    i(Ze(re(oe(bi(oi(ni(ei(
    e(rZ(oZ(bZ(iZ(oZ(ne(
    e(Ze(re(ob(ib(ob(ne(
    e(Ze(ro(bo(io(oo(no(eo(
    (Z
    (r
    b(b(ib(ob(nb(eb(
    n(Zr(or(br(ir(on(en(
    n(Zr(or(br(ir(or(nr(er(
    (Z
    (r
    (o
    (b
    o(o(no(eo(
    i(rZ(oZ(bi(oi(ni(ei(
    n(Zr(or(br(ir(on(en(
    e(Zr(or(br(ir(or(ne(
    n(Zr(or(br(ir(on(en(
    ((Zr(or(br(ir(or(nr(e
    o(o(no(eo(
    ((Zr(or(br(ir(or(nr(e
    (ob(ib(ob(nb(e
    (ob(ib(ob(nb(e
    i(i(oi(ni(ei(
    e(Zr(ob(ib(ob(ne(
    e(Zr(or(br(ir(or(ne(
    e(Ze(ro(bo(io(oo(ne(
    i(Zr(or(bi(oi(ni(ei(
    ((rZ(oZ(bi(oi(ni(e
    (ro(bo(io(oo(no(eo(
    (Z
    (r
    (o
    i(i(oi(ni(ei(
    n(rZ(oZ(bZ(iZ(on(en(
    i(Zr(or(bi(oi(ni(ei(
    n(Zr(or(br(ir(on(en(
    o(Zr(or(br(io(no(eo(
    o(Zr(or(br(io(no(eo(
    n(Zr(or(br(ir(on(en(
    n(Zr(or(br(io(no(eo(
    (Z
    (r
    (o
    e(i(oi(ne(
    e(Zr(or(br(io(ne(
    ((Zr(or(br(ir(or(nr(e
    e(o(bo(io(oo(ne(
    i(Zr(or(bi(oi(ni(ei(
    e(Zr(or(br(ir(or(ne(
    e(Zr(or(br(ir(or(ne(
    ((Zr(or(br(ir(or(nr(e
    n(rZ(oZ(bZ(iZ(on(en(
    ((Zr(or(br(ir(or(nr(e
    (ro(bo(io(oo(no(eo(
    (Z
    (r
    (o
    (b
    o(o(no(eo(
    e(Zr(or(br(ir(or(ne(
    e(Ze(ro(bo(io(oo(no(eo(
    (Z
    (r
    (o
    (b
    o(o(no(eo(
    o(Zo(ro(bo(io(oo(no(eo(
    (Z
    (r
    (o
    (b
    o(o(no(eo(
    ((Zr(or(br(ir(or(nr(e
    (e
    r(r(or(br(ir(or(nr(er(
    o(rZ(oZ(bZ(io(no(eo(
    ((Zr(or(br(ir(or(nr(e
    o(o(no(eo(
    e(Zr(or(br(ir(or(ne(
    ((Ze(re(ob(ib(ob(nb(e
    o(o(no(eo(
    o(Zo(ro(bo(io(oo(no(eo(
    (Z
    (r
    (o
    (b
    o(o(no(eo(
    ((Zr(or(br(ir(or(nr(e
    (bi(oi(ni(e
    o(o(no(eo(
    o(Zo(ro(bo(io(oo(no(eo(
    o(rZ(oZ(bZ(io(no(eo(
    o(Zr(or(br(ir(or(nr(er(
    (Z
    (r
    (o
    (bi(oi(ni(e
    (ro(bo(io(oo(no(eo(
    (Z
    (r
    (o
    (b
    o(o(no(eo(
    o(Zo(ro(bo(io(oo(no(eo(
    e(rZ(oZ(bZ(iZ(oZ(ne(
    o(Ze(ro(bo(io(oo(no(eo(
    i(rZ(oZ(bi(oi(ni(ei(
    Z(rZ(oZ(bZ(iZ(oZ(nZ(eZ(
    (Z
    (r
    (o
    (b
    o(o(no(eo(
    b(Zo(ro(ob(ib(ob(nb(eb(
    e(Zr(or(br(ir(or(ne(
    n(Ze(ro(bo(io(on(en(
    i(Zn(rn(on(bi(oi(ni(ei(
    ((rZ(oZ(bZ(iZ(oZ(nZ(e
    b(b(ib(ob(nb(eb(
    e(Zr(or(br(ir(or(ne(
    e(Ze(ro(bo(io(oo(no(eo(
    (Z
    (r
    (o
    i(i(oi(ni(ei(
    n(Zr(or(br(ir(on(en(
    r(Zr(or(br(ir(or(nr(er(
    i(rZ(oZ(bi(oi(ni(ei(
    i(Zr(or(br(ir(or(nr(er(
    (Z
    (r
    (o
    (b
    o(o(no(eo(
    i(rZ(oZ(bi(oi(ni(ei(
    n(rZ(oZ(bZ(iZ(on(en(
    i(Zn(rn(on(bi(oi(ni(ei(
    n(rZ(oZ(bZ(iZ(on(en(
    o(Zn(ro(bo(io(oo(no(eo(
    e(Zr(or(br(ir(or(ne(
    ((Ze(re(ob(ib(ob(nb(e
    b(b(ib(ob(nb(eb(
    ((Zr(or(br(ir(or(nr(e
    i(i(oi(ni(ei(
    n(Zr(or(br(ir(on(en(
    o(Zn(ro(bo(io(oo(no(eo(
    n(Zr(or(br(ir(on(en(
    o(Zn(ro(bo(io(oo(no(eo(
    n(rZ(oZ(bZ(iZ(on(en(
    n(Zr(or(
    Aby kontynuować, naciśnij dowolny klawisz . . .


    W pętli od 0 do 1000. To samo się dzieje po usunięciu bitów parzystości. Jestem na dobrej drodze, wiem że już blisko sukcesu :)

    Pozdrawiam serdecznie
  • Helpful post
    #4
    krru
    Level 33  
    lukiradom wrote:

    Code: c
    Log in, to see the code


    Dlaczego do bufora 32 znakowego wpisujesz 64 znaki?

    lukiradom wrote:

    Lekko zmodyfikowałem funkcję ReadUart, aby wypisywała zmienną buf:

    Code: cpp
    Log in, to see the code



    Jakbyś jeszcze kończył string w miejscu, gdzie skończyły się dane, to nie wypisywałyby się śmeci. Coś w tym stylu:

    Code: cpp
    Log in, to see the code


    Tak w ogóle to wypisywanie lepiej przesunąć tam, gdzie już wiadomo że odczyt się udał (warto sprawdzić ret). A jeszcze lepiej poza bibliotekę.

    Widać, że odczytujesz po 1-2 znaki z tego co wysyła AVR.
  • #5
    lukiradom
    Level 10  
    Dzięki wielkie, udało się! Program odczytuje poprawnie informacje, dodatkowo ograniczyłem bufor do 1 znaku, bo Atmega wysyła znaki jeden po drugim.

    Poniżej zamieszczam wszystkie kody działające, dla potomnych :)

    Code: cpp
    Log in, to see the code



    Code: vbnet
    Log in, to see the code


    Biblioteka UART.h dostępna tutaj Link

    Proszę moderatorów o niezamykanie tego tematu, gdyż czeka mnie jeszcze wysyłanie informacji do AVR-a, więc mogę mieć jeszcze kilka pytań do Kolegów. Jednak jeśli uda mi się napisać działający program bez pomocy z forum, to też umieszczę go tutaj :)

    Pozdrawiam serdecznie


    UPDATE: ---------------------------------------------------------------------------------

    No i chyba poległem z wysyłaniem, nie obejdzie się bez pomocy Kolegów. Kombinowałem na różne strony, zostałem na tym kodzie:


    Code: cpp
    Log in, to see the code



    Program wypisuje następującą wiadomość:

    Udalo sie
    0
    W1
    
    *****
    Odbieram...
    0
    Aby kontynuować, naciśnij dowolny klawisz . . .


    Czyli, otwarto port, nic nie odebrano, wysłano literę "W", funkcja WriteUart() zwróciła 1, jednak też nic nie odebrano. Atmega jest zaprogramowana, aby "odbijała" wiadomość:

    Code: vbnet
    Log in, to see the code
  • #6
    lukiradom
    Level 10  
    Odkryłem coś ciekawego, mianowicie gdy uruchomię swój program, on się poprawnie wykona i napiszę coś w terminalu, to AVR "dokleja" mi do zwróconej wiadomości literę 'w', którą wysyłam programem w C++. Żeby zobrazować to zjawisko, zamieszę tekst z terminala:

    
    cos
    wcos
    



    UPDATE: -----------------------------------------------------------------

    Wygląda na to, że się udało. Program przeniosłem do z DevC++ do C++ Buildera, żebym lepiej widział działanie programu. Docelowo miał być ukończony w Builderze. W terminalu wyświetliłem sobie dane w hexach i ujrzałem kod <0D>, który przenosił kursor do nowej linijki, także po każdej transmisji znaku/tekstu wysyłam tenże znak w heksie:

    Code: cpp
    Log in, to see the code


    Po tym zabiegu po kliknięciu przycisku, w polu tekstowym odbieram bez problemu wysłany znak, teraz pobawię się w C++ i myślę, że jak mi się uda napisać program, to zamieszczę go tutaj, razem z kodem :)

    Pozdrawiam

    UPDATE: -----------------------------------------------------------------

    Zgodnie z obietnicą przesyłam swój program napisany w C++ Builder (początkowa wersja, ale pewnie się komuś przyda)
    Attachments: