Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega32 a klaw matr pracujaca na przerwaniu od Timer0

05 Lut 2008 22:47 1061 4
  • Poziom 15  
    Witam
    Mam taki problem. Pierwszys raz korzystam z takiego ukladu i klawiatury pracujacej na przerwaniu. Podejrzewam, że problem pochodzi od sposobu podłączenia klawiatury do mikrokontrolera tylko nie wiem dlaczego. Klawiaturę mam podłączoną tak do Atmegi
    3 kolumny do Portc.4, 5, 6 oraz 4 wiersze do Portd.0, 1, 2, 3. W programie jest zegar na PCF z ustawianiem czasu, układem do sterowania 4 urządzeń zał/wył bezpośrednio z portów. Na wyświetlaczu LCD 2x16 jest cały czas odczyt zegara i daty. Zla praca objawia się pojawiajacymi sie czasami zlymi odczytami godziny jakby wyswietlana byla czesc nie przekonwertowana godziny, lub minut i liczby zamiast 2 pol zajmują trzy pola wyświetlacza. Po przeniesieniu odczytu klawiatury do programu glownego i wyłączeniu przerwania to juz takich rzeczy nie ma... czy mozna jakos opuźniać przerwanie w podprogramach aby nie mialo ono wplywu na trwajace obliczenia...?, a tak musze teraz uruchamiac odczyt klawiatury w podprogramach bo mi nie wszystkie klawisze dzialaja tak jak trzeba...
    Pozdrawiam
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Poziom 24  
    Wektory przerwań mają odpowiednie priorytety ... jeżeli odczyt czasu masz w przerwaniu to przerwanie klawiatury powinno być o mniejszym priorytecie.

    Jeżeli obsługę odczytu masz w pętli głównej - to zrób własny "kontroler przerwania" :P Po odczytaniu godziny itd. sprawdź czy flaga przerwania jest ustawiona, a jeżeli tak to skocz do procedury obsługi klawiatury ;) Pamiętaj, że przy tym rozwiązaniu przerwanie ma być NIE aktywne. Flagi są ustawiane bez względu na aktywność przerwania, ale należy pamiętać, że większość z nich podczas odczytu się nie "zeruje" ;)
  • Poziom 27  
    A dlaczego nie w przerwaniu od INT0 lub 1 zmianą stanu. Po co timer do tego? Dobry przykład jest w książce AVR.. Baranowskiego. Jakby co to go mam.
  • Poziom 15  
    DEX - no cóż dlatego, bo taki układ już jest i nic nie da się teraz zrobić. Kolumny i wiersze są podpięte bezpośredni pod wymienione porty.. Więc bezpośrednie wykorzystanie zewnętrznego przerwania nie wchodzi w rachubę.
    mariuszlorenc - no wlasnie może o to mi chodzi, ale jak to się robi, bo to moje naprawdę pierwsze doświadczenie z Timerami, flagami i przerwaniami.

    Kod programu do obsługi takiej klawiatury zaczerpnąłem z książki Pana Wiązani.
    Wyglada tak:
    Code:
    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
    
          'dyrektyw mikrokontrolera
    $crystal = 8000000                                          'informuje kompilator
          'o częstotliwości oscylatora
          'taktującego mikrokontroler
    Config Pinb.0 = Input                                       'linia PB0 jako wejściowa
    Config Pinb.1 = Input                                       'linia PB1 jako wejściowa
    Config Pinb.2 = Output                                      'linia PB2 jako wyjściowa
    Config Pinb.3 = Output                                      'linia PB3 jako wyjściowa
    Config Lcd = 16 * 2                                         'konfigurowanie typu
          'wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5       'konfigurowanie linii
          'mikrokontrolera, do których
          'dołączono LCD
    Config Timer0 = Timer , Prescale = 1024
          'konfigurowanie Timer0 jako
          'timer z podziałem preskalera
          'przez 1024

    On Timer0 Mult_kl                                           'konfigurowanie przerwania od
          'przepełnienia Timer0, skok do
          'podprogramu Mult_kl

    Dim Temp1 As Byte                                           'zmienna pomocnicza Temp1
    Dim Temp2 As Byte                                           'zmienna pomocnicza Temp2
    Dim Przycisk As Byte                                        'zmienna, do której będzie
          'wpisywany kod naciśnietego
          'przycisku
    Dim I As Byte                                               'zmienna licznikowa

    W1 Alias Pinb.0                                             'przypisanie nazwie Pinb.0
          'nazwy W1
    W2 Alias Pinb.1                                             'przypisanie nazwie Pinb.1
          'nazwy W2
    Kol1 Alias Portb.2                                          'przypisanie nazwie Portb.2
          'nazwy Kol1
    Kol2 Alias Portb.3                                          'przypisanie nazwie Portb.3
          'nazwy Kol2
    Enable Interrupts                                           'odblokowanie globalnego systemu
          'przerwań
    Enable Timer0                                               'odblokowanie przerwania od
          'przepełnienia Timer0
    Load Timer0 , 200                                           'wpisanie do licznika wartości
          'początkowej 56, bo
          '256 - 200 = 56

    Set Portb.0                                                 'dołączenie do linii PB0
          'rezystora podciągającego
    Set Portb.1                                                 'dołączenie do linii PB1
          'rezystora podciągającego
    Set Kol1                                                    'ustawienie linii Kol1
    Set Kol2                                                    'ustawienie linie Kol2

    Do                                                          'pętla główna programu
     Cls                                                        'czyszczenie LCD
     Lcd Przycisk                                               'wyświetlenie na LCD stanu
          'zmiennej Przycisk
     Waitms 100                                                 'opóźnienie 100 ms
    Loop
    End                                                         'koniec programu

    Mult_kl:                                                    'podprogram przerwania, w którym
          'jest obsługiwana klawiatura
     Load Timer0 , 200                                          'wpisanie do licznika wartości
          'początkowej 56
     For I = 1 To 2                                             'pętla wykonywana 2 razy
      If I = 1 Then                                             'jeśli I = 1, to
       Reset Kol1                                               'zerowanie linii Kol1
      Else                                                      'w przeciwnym razie
       Set Kol1                                                 'ustawienie linii Kol1
       Reset Kol2                                               'i zerowanie linii Kol2
      End If
      If W1 = 0 Or W2 = 0 Then                                  'jeśli przy I = 1 lub I = 2
          'wejścia W1 lub W2 maja stany
          'niskie - naciśniety przycisk,
          'to
       Temp1 = Pinb And &B00000011
          'zapisanie do zmiennej Temp1
          'wartości dwóch najmniej
          'znaczących bitów rejestru PINB
    '- linie W1 i W2
       Exit For                                                 'opuszczenie pętli For...Next
      Else                                                      'w przeciwnym razie
       Temp1 = 0                                                'wyzerowanie zmiennej Temp1
      End If
     Next I                                                     'zwiększenie o 1 wartości I
     If Temp2 = Temp1 Then                                      'jeśli wartości w Temp2 oraz
          'Temp1 są sobie równe, to
      Przycisk = Temp1                                          'zapisanie kodu naciśniętego
          'przycisku do zmiennej Przycisk
      If I = 2 Then                                             'jeśli I = 2, to
       Przycisk = Przycisk + 2                                  'dodanie do zmiennej Przycisk
          'wartości 2, gdyż odczytano
          'stany przycisków
          'drugiego wiersza
      End If
     Else                                                       'w przeciwnym razie
      Temp2 = Temp1                                             'zapisanie wartości Temp1 do
          'zmiennej Temp2
     End If
     Set Kol1                                                   'ustawienie linii Kol1
     Set Kol2                                                   'ustawienie linii Kol2
    Return

    Sam kod programu przerobiłem dla matrycy 3x4 i działa. Właśnie usunąłem część kodu:

    Load Timer1 , 200

    wyświetlacz się uspokoił, ale klawiaturka tak szybko nie odpowiada...
    Mam kwarc 16MHz więc dosyć szybko to idzie.... co powinienem zrobic jeszcze, bo według Pana Goreckiego w jego programikach tej funkcji nie uzywa... Jest ona potrzebna a jak tak to po co...? No i ustawianie tych flag.... może coś więcej...?


    Proszę umieszczać listingi programów w znacznikach "Code". [c_p]
  • Poziom 24  
    Widze BASCOM'a, więc ja nie pomogę... ale mogę dać troszkę dokładniejsze informacje :D

    Jeżeli do obsługi klawiatury używasz T0(Timer0) to podczas jego przepełnienia w rejestrze TIFR zostanie ustawiony bit TOV0. Sygnalizuje on, że licznik został przepełniony i przechodzi do obsługi przerwania jeżeli takie jest skonfigurowane. Ty jednak nie konfiguruj przerwania, ale po wyświetleniu czego tam chcesz na LCD sprawdzaj stan tej flagi, a jeżeli jest ona ustawiona to wywołaj obsługę klawiatury w której koniecznie przypisz wartość '1' bitowi TOV0 w rejestrze TIFR, aby wyzerować daną flagę i w przyszłości znów sprawdzać czy się ustawi ;)