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

Wprowadzanie danych za pomocą mikroprzełączników TACT

Kriss112 18 Mar 2008 13:34 813 0
REKLAMA
  • #1 4923221
    Kriss112
    Poziom 10  
    Posty: 26
    Witam wszystkich.
    Od pewnego czasu próbuję, z wykorzystaniem Bascoma, napisać program, który będzie obsługiwał dwa mikroprzełączniki i wyświeltacz LCD. Ideą programu ma być wprowadzenie do tablicy danych, czyli jeden przycisk zmienia pole na LCD, a drugi zwiększa wartość znajdującej się tak cyfry. Skorzystałem z obsługi przerwań zewnętrznych. Problem pojawia się w momencie wyświetlania danych na LCD. Zmiana pola działa poprawnie, więc próbowałem zamienić przerwania, nic nie pomogło. Dowcip jest taki, że czasami, ale rzadko, działa poprawnie.

    Poniżej zamieszczam kod programu na Atmegę88 i LCD 16x4:

    
    
    $regfile = "m88def.dat"
    $crystal = 7372800
    $baud = 4800
    
    '-------------------------------------------------------------------------------------------
    Config Lcd = 16 * 4
    
    Config Lcdpin = Pin , Rs = Portc.5 , E = Portc.4 , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0
    
    Config Int0 = Low Level                                     'konfiguracja przerwania odpowiedzialnego za zmianę pozycji
    Config Int1 = Low Level                                     'konfiguracja przerwania odpowiedzialnego za zmianę wartości
    
    On Int0 Dodaj                                               'wykonanie podprogramu "Dodaj" w odpowiedzi na przerwanie
    On Int1 Zmien                                               'wykonanie podprogramu "Zmien" w odpowiedzi na przerwanie
    
    '----------------------------------------------------
    'POZĄTEK DEKLARACJI ZMIENNYCH
    '----------------------------------------------------
    Dim Wartstn1 As Byte
    Dim Wartste1 As Byte
    Dim Wartminn1 As Single
    Dim Wartmine1 As Single
    
    
    Dim Wartstn2 As Byte
    Dim Wartste2 As Byte
    Dim Wartminn2 As Single
    Dim Wartmine2 As Single
    
    
    Dim Wn(11) As Byte
    'Tablica zawierająca wartości odpowidające szerokości
    '----------------------------------------------------
    Wn(1) = 0                                                   'Wstn1
    Wn(2) = 0                                                   'Wstn2
    Wn(3) = 0
    Wn(4) = 0                                                   'Wminn1
    Wn(5) = 0                                                   'Wminn2
    Wn(6) = 0
    Wn(7) = 0                                                   'Wsekn1
    Wn(8) = 0                                                   'Wsekn2
    Wn(9) = 0
    Wn(10) = 0                                                  'Wsekn01
    Wn(11) = 0                                                  'Wsekn02
    '----------------------------------------------------
    
    Dim We(11) As Byte
    'Tablica zawierająca wartości odpowiadające długości
    '----------------------------------------------------
    We(1) = 0                                                   'Wste1
    We(2) = 0                                                   'Wste2
    We(3) = 0
    We(4) = 0                                                   'Wmine1
    We(5) = 0                                                   'Wmine2
    We(6) = 0
    We(7) = 0                                                   'Wseke1
    We(8) = 0                                                   'Wseke2
    We(9) = 0
    We(10) = 0                                                  'Wseke01
    We(11) = 0                                                  'Wseke02
    '----------------------------------------------------
    
    Dim X1(11) As Byte
    Dim X2(11) As Byte
    Dim X As Byte
    Dim I As Byte
    Dim Poz As Byte
    Dim Wart As Byte
    Dim Wiersz As Byte
    Dim Odl As Single
    '----------------------------------------------------
    'KONIEC DEKLARACJI ZMIENNYCH
    '----------------------------------------------------
    
    
    Config Pinb.0 = Input                                       ' przycisk podłączony do tego portu (zwiekszanie
    Config Pinb.1 = Input                                       ' przycisk podłączony do tego portu
    
    
    Wartstn1 = 54
    Wartminn1 = 32.5750
    Wartste1 = 18
    Wartmine1 = 32.6820
    
    Wartminn1 = Wartminn1 / 60
    Wartminn1 = Wartminn1 + Wartstn1
    Wartminn1 = Wartminn1 * 3.1415926
    Wartminn1 = Wartminn1 / 180
    
    Wartmine1 = Wartmine1 / 60
    Wartmine1 = Wartmine1 + Wartste1
    Wartmine1 = Wartmine1 * 3.1415926
    Wartmine1 = Wartmine1 / 180
    
    For I = 1 To 11
       X1(i) = 0
       X2(i) = 0
    Next
    
    Wiersz = 1
    Poz = 1
    Wart = 0
    X = 0
    
    Enable Int0
    Enable Int1
    Enable Interrupts
    Cursor On
    Cls
    Locate 1 , 1
    Lcd We(1) ; We(2) ; " " ; We(4) ; We(5) ; " " ; We(7) ; We(8) ; "." ; We(10) ; We(11)       'wyzerowanie pierwszej lini LCD
    Locate 2 , 1
    Lcd Wn(1) ; Wn(2) ; " " ; Wn(4) ; Wn(5) ; " " ; Wn(7) ; Wn(8) ; "." ; Wn(10) ; Wn(11)       'wyzerowanie drugiej lini LCD
    
    
    Declare Sub Spr_wart(poz As Byte , Wiersz As Byte)          'deklaracja podprogramu sprawdzania wartości tablic
    
    Do
       'Print "Szerokosc: " ; Wartstn ; Minn ; Kropka ; Sekn
       'Print "Dlugosc: " ; Ste ; Mine ; Kropka ; Seke
       Waitms 10
       Call Spr_wart(poz , Wiersz)
       Cursor Blink
       Disable Interrupts
       Locate Wiersz , Poz
       Lcd X
       Enable Interrupts
    Loop
    End
    
    Dodaj:
       Waitms 200
       Poz = Poz + 1
       If Poz = 3 Then
          Poz = 4
       End If
       If Poz = 6 Then
          Poz = 7
       End If
       If Poz = 9 Then
          Poz = 10
       End If
       If Poz = 12 Then
          Poz = 1
          If Wiersz = 1 Then
             Wiersz = 2
          Else
             Wiersz = 1
          End If
       End If
       Waitms 200
    Return
    
    Zmien:
       Waitms 500
       Call Spr_wart(poz , Wiersz)
       Wart = X
       Wart = Wart + 1
       If Wart >= 10 Then
          Wart = 0
       End If
       If Wiersz = 1 Then
          We(poz) = Wart
          If We(1) > 8 Then
             We(1) = 0
          End If
          If We(4) > 5 Then
             We(4) = 0
          End If
          If We(7) > 5 Then
             We(7) = 0
          End If
       Else
          Wn(poz) = Wart
          If Wn(1) > 8 Then
             Wn(1) = 0
          End If
          If Wn(4) > 5 Then
             Wn(4) = 0
          End If
          If Wn(7) > 5 Then
             Wn(7) = 0
          End If
       End If
       X = Wart
       Waitms 200
    Return
    
    Sub Spr_wart(poz As Byte , Wiersz As Byte)x As Byte
    If Wiersz = 1 Then
       X1(poz) = We(poz)
       X = X1(poz)
    Else
       X2(poz) = Wn(poz)
       X = X2(poz)
    End If
    End Sub
    


    Z góry dziękuje za wszelkie sugestie i informacje
  • REKLAMA
REKLAMA