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

[C][ATmega168][USART] jak wysłać tablicę w przerwaniu a nie stosując pooling?

esnow 19 Kwi 2012 18:03 1680 8
REKLAMA
  • #1 10812133
    esnow
    Poziom 14  
    witam,
    o ile poradziłem sobie odbiorem w przerwaniu to nie mogę zmusić ATmegi168 do wysyłania tablicy charów w przerwaniu.

    stosując pooling działa:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    jak uzyskać ten sam efekt stosując przerwanie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i jeszcze funkcja inicjalizująca USART:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 10812624
    hotdog
    Poziom 26  
    metod jest kilka. Najprostsza i najpewniejsza to 3 zmienne:
    - index następnego wysyłanego bajtu
    - ilość bajtów do wysłania
    - tablica danych do wysłania

    samo przerwanie wygląda tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #3 10812645
    esnow
    Poziom 14  
    w pętli while(1) { ... } programu uzupełniam tablicę danymi. jak "wejść" w to przerwanie, albo jak zmusić mikrokontroler do wysłania tej tablicy ?
  • REKLAMA
  • #4 10812741
    hotdog
    Poziom 26  
    W funkcji przygotowującej dane musisz zapisać pierwszy bajt do UDR ręcznie. Reszta idzie w przerwaniu. W momencie kiedy w przerwaniu nie zapiszesz UDR (po ostatnim bajcie), to już się to przerwanie nie wykona.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Poza tym przerwanie USART_TX nie jest do tego zaprjektowane. Przerwanie powinieneś wykorzystać UDRE (czy jakoś tak Usart Data Register Empty).

    Różnica jest taka że USART_TX odpali się po ZAKOŃCZENIU transmisji każdego bajta, a UDRE od razu po przeniesieniu bajtu do rejestru przesuwnego.
  • Pomocny post
    #5 10812788
    sulfur
    Poziom 24  
    Moim zdaniem jest prostsza metoda. Tworzy się dwa indeksy i tablice buforującą. Oprogramowanie zapisuje znaki to bufora i zwiększa pierwszy indeks (umownie indeks programowy). Po takim zapisie przed wyjściem zezwala na przerwanie. Przerwanie z kolei jak wykryje, że bufor programowy jest różny od drugiego buforu (umownie bufor sprzętowy) to z aktualnie wskazywanego buforu sprzętowego zapisuje daną do wysłania i inkrementuje wartość bufora sprzętowego. Jeśli w przerwaniu kontrola wykaże, że wartość indeksu programowego jest równa wartości indeksu sprzętowego, to przerwanie blokuje się samo.

    Załączam Ci kawałem kodu z mojej inżynierki, to jest zrobione coś na wzór tego. Służyło do komunikacji z telefonem GSM. Możesz się na tym wzorować lub spróbować to wykorzystać w takiej formie, jak jest. Gdybyś miał jakieś pytania co do kodu, możesz spróbować zapytać. To nie było tak dawno, powinienem coś jeszcze z tego pamiętać.

    P.S. To jest na ATmegę8.
  • REKLAMA
  • #6 10813555
    esnow
    Poziom 14  
    @sulfur
    Twój kod wydaję się bardzo pomocny tylko będę musiał przerobić go pod AT168

    a którą funkcją pakujesz dane do bufora?
    void uart_putc(uint8_t data) ?
  • #7 10813598
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #8 10813646
    sulfur
    Poziom 24  
    putc przyjmuje jeden znak
    puts przyjmuje łańcuch
    putsp przyjmuje łańcuch z progmem
  • #9 10813672
    esnow
    Poziom 14  
    @Albert B.
    miałem zły init i dlatego mi nie działało więc się zapytałem. bez nerwów kolego

    @sulfur
    dziękuję Ci bardzo za pomoc wszystko działa, chciałem edytować post, ale Pan Albert zabrał już głos

    jeszcze raz dziękuję !
REKLAMA