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:
Z góry dziękuje za wszelkie sugestie i informacje
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