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

[Atmega328P][avr-gcc] - Odbiór String, USART, bez przerwań.

Initial 28 Maj 2013 00:28 3081 11
REKLAMA
  • #1 12353663
    Initial
    Poziom 9  
    Witam

    Potrzebuję odebrać z komputera ciąg znaków (tablicę 10 elementową). Korzystam przy tym z funkcji:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    w programie wywoluje to tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jednak string nie jest poprawnie wysyłany do komputera (mieszają się znaki itd), co może być tego przyczyną? Nie chcę korzystać z przerywań, ponieważ to właśnie odbiór danych z PCta ma być impulsem do działania programu na mikroprocku (gdy nie otrzyma on rozkazu nic się nie dzieje).
    Poprawiono tytuł.
    LordBlick
  • REKLAMA
  • #2 12353674
    dondu
    Moderator na urlopie...
    Witaj,

    Initial napisał:
    Nie chcę korzystać z przerywań, ponieważ to właśnie odbiór danych z PCta ma być impulsem do działania programu na mikroprocku (gdy nie otrzyma on rozkazu nic się nie dzieje).

    Skoro odbiór danych z PC ma być impulsem do działania mikrokontrolera, to właśnie do tego są przerwania.
    Nie bój się ich to jest proste: http://mikrokontrolery.blogspot.com/2011/03/rs-232-atmega8-komputer-terminal.html

    BTW:
    Przerwania, a nie przerywania. :)
    Ode mnie w prezencie 20pkt, bo masz zaledwie 4, a mogą się przydać.
  • #3 12353680
    Initial
    Poziom 9  
    Dzięki za szybką odpowiedź, oczywiście masz racje błąd wynika z dość później pory :P

    Czytałem o przerwaniach, mam nawet w tej chwili książkę Mirka przed sobą, ale chciałbym jednak zrobić to w sposób jak powyżej. No chyba, że kompletnie się to nie nadaje to przysiądę nad przerwaniami.

    Pytanie moje, jest więc wciąż aktualne - co zrobić by to działało? Analizuje ten prosty algorytm i nie mogę znaleźć błędu..

    Dzięki za punkty :)

    Edit:
    Zresztą z tego co o przerwaniach czytam to by odebrać string również będę potrzebował takiej funkcji (lub podobnej) do odebrania stringa w przerwaniu.
  • REKLAMA
  • #4 12353688
    dondu
    Moderator na urlopie...
    Niestety nie mam czasu teraz analizować Twojego programu, ale zachęcam do spróbowania zrobienia na przerwaniach. To naprawdę jest proste i nie obciąża mikrokontrolera.

    Podałem Ci link, tam masz gotowca (na ATmega8) i dokładny opis oraz efekt działania, właśnie takiego programu, który terminalem wysyła do mikrokontrolera dane, a ten odpowiada - zobacz filmik.

    Powodzenia, idę do wyrka :)
  • REKLAMA
  • #5 12354541
    Initial
    Poziom 9  
    No poczytałem sobie o przerwaniach dokładniej, jednak nadal nie widze rozwiązania mojego problemu. Program tak jakby gubi znaki, albo pętla while nie kończy się gdy kończy się ciąg (poniżej przykładowa próba komunikacji, korzystałem z Herculesa, znacznikiem [b] oddzielone to co wysylam - ciag "123456"). Jak widać muszę go dwa razy wysłać zanim program zareaguje.
    
    [b]123456[/b][b]123456[/b]1234561™3[b]123456[/b][b]12345656[/b]12345›1[b]123456123456[/b]3461234Mó[b]123456123456[/b]2361234M›[b]123456123456[/b]2361234Mó[b]123456123456[/b]2361234Mó[b]123456123456[/b]2361234Mó
  • #6 12354790
    BlueDraco
    Specjalista - Mikrokontrolery
    Jak to testujesz? Wpisujesz znaki na terminalu czy wysyłasz z programu? Jeśli to drugie - musisz czekać na odpowiedź mikrokontrolera po wysłaniu każdego łańcucha.

    Proponuję też wyczyścić kod procedury odbioru łańcucha:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Oczywiście prawidłowo wypadałoby to zrobić na przerwaniach, z buforem cyklicznym.
  • #7 12354884
    Initial
    Poziom 9  
    Na razie chciałbym sprobować zrobić bez przerwań. Wysyłam z programu.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Ten kod, nie działa - wysyładam dane i nic do mnie nie wraca. Jednak gdy usunę
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    to program normalnie się wykonuje, na PCie dostaję cały czas "Hello World". Podejrzewam, że funkcja uart_gets się zapętla, jednak nie mogę określić w którym momencie (specjalne na sztywno ustawiłem w niej długość łańcucha na 5).
  • #8 12355123
    BlueDraco
    Specjalista - Mikrokontrolery
    Czyli obecnie masz zepsutą i błędną funkcję pobierającą rzekomo łańcuch, a w rzeczywistości jeden znak na ATmega oraz program na PC niedopasowany do poprzedniej, nieco kulawej ale jakoś działającej funkcji odbioru łańcucha.
    Program na PC nie może wysyłać nowych znaków dopóki nie odbierze całego łańcucha z ATmega, bo inaczej nadawane znaki nie będą odbierane przez ATmega.
  • #9 12355158
    Initial
    Poziom 9  
    No podsumowałeś dość ładnie rzeczy oczywiste, jednak nadal nie wiem czemu ta funkcja pobierająca string nie działa? Jeżeli, wysyłam coś przez terminal, a nie przez Herculesa dzieje się dokładnie tak samo..
  • REKLAMA
  • #10 12355320
    slx
    Poziom 19  
    Jak tak bardzo chcesz to robić bez przerwań, to w funkcji USART_receive() czekaj aż przyjdzie nowy znak.

    Bo na razie, to nie wiadomo o co tu chodzi?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Porównaj to z funkcją USART_send().
  • #11 12355465
    BlueDraco
    Specjalista - Mikrokontrolery
    Nowa wersja funkcji pobierającej rzekomo łańcuch pobiera tylko jeden znak i wypełnia nim łańcuch - nie masz już czytania znaków w pętli, bo je wyrzuciłeś. Jak to ma niby czytać łańcuch?

    No i, jak napisał wyżej slx, zamiast if napisz while w funkcji czytania znaku.
  • #12 12362424
    Initial
    Poziom 9  
    Dziękuje Panowie za pomoc. Jednak odechciało mi się z tym męczyć, zrobiłem to na przerwaniach wraz z buforem cyklicznym - wszystko pięknie działa.

    Zamykam.
    Dar.El
REKLAMA