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

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

MES Mariusz 11 Jan 2013 19:38 2544 4
  • #1
    MES Mariusz
    Level 36  
    Witam.

    Kod jest taki:

    Code: basic4gl
    Log in, to see the code


    A efekt taki...


    Quote:
    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?
  • #2
    BlueDraco
    MCUs specialist
    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:

    Code: basic4gl
    Log in, to see the code
  • #3
    MES Mariusz
    Level 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 :-)

    Code: basic4gl
    Log in, to see the code
  • Helpful post
    #4
    BlueDraco
    MCUs specialist
    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
    MES Mariusz
    Level 36  
    Rozwiązano, jak wyżej. Działa.