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

Bascom AVR / Atmega32 - Przerwanie od UART, opóźnienie o jeden znak...

MES Mariusz 11 Sty 2013 19:38 2628 4
REKLAMA
  • #1 11774670
    MES Mariusz
    Poziom 36  
    Witam.

    Kod jest taki:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    A efekt taki...


    Cytat:
    Jestem w petli...

    Naciskam klawisz "1" otrzymuję odpowiedź: Enter=0 Znak:
    Naciskam klawisz "2" otrzymuję odpowiedź: Enter=0 Znak: 1
    Naciskam klawisz "3" otrzymuję odpowiedź: Enter=0 Znak: 2
    Naciskam klawisz "4" otrzymuję odpowiedź: Enter=0 Znak: 3
    Naciskam klawisz "5" otrzymuję odpowiedź: Enter=0 Znak: 4
    Naciskam klawisz "ENTER" otrzymuję odpowiedź: Enter=0 Znak: 5
    Naciskam klawisz "ENTER" otrzymuję odpowiedź: Enter=1 Zdanie: 12345


    Dlaczego tak się dzieje? Przecież naciskam klawisz i w tym momencie generowane jest przerwanie i powinien zostać wydrukowany znak odpowiadający klawiszowi, który właśnie wcisnąłem. Ale nie. Ponoć wcisnąłem "pusty" znak co jest nie prawdą. Dopiero kiedy wcisnę drugi klawisz drukowany jest znak, który wcisnąłem poprzednio.

    Jak to ogarnąć? Jak uzyskać poprawny efekt po wciśnięciu danego klawisza?
  • REKLAMA
  • #2 11775054
    BlueDraco
    Specjalista - Mikrokontrolery
    To może (chociaż nie musi) mieć jakiś związek z tym, że czytasz 3 razy rejestr Udr. Podstaw go jeden raz pod jakąć zmienną i kolejne testy i operacje rób na tej zmiennej, a nie na Udr.
    No i wyrzuć ten Waitms z obsługi przerwania!

    Coś tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #3 11775311
    MES Mariusz
    Poziom 36  
    Właściwie nie wiem co tak na prawdę wywołuje przerwanie. Czy dana która napłynęła na UART? Tu wygląda to tak, jakby to było jakieś przepełnienie bufora UART dwoma znakami...


    ---edit---

    Ale numer. Faktycznie odczytywanie rejestru wielokrotnie było przyczyną... Poniżej w pełni działający kod :-)

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #4 11775538
    BlueDraco
    Specjalista - Mikrokontrolery
    Przerwanie jest zgłaszane, gdy zostanie odebrany bajt.

    Wywal przynajmniej jedno z porównań z 13. Przecież jeśli jest równe 13 to nei ma sensu sprawdzać, czy jest różne od 13.

    Stare przysłowie pszczół, które cytuję to co 3 dni: żadnego oczekiwania w obsłudze przerwania. Wyrzuć Waitms 100 z obsługi przerwania!

    Nie możesz również nic nadawać w obsłudze przerwania, bo to też wiąże się oczekiwaniem.
  • #5 11790850
    MES Mariusz
    Poziom 36  
    Rozwiązano, jak wyżej. Działa.
REKLAMA