Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Bascom][atmega8] Animacja, LCD

biglolo94 25 Apr 2010 14:09 10784 57
  • #1
    biglolo94
    Level 16  
    Witam,

    Ostatnio wziąłem się za zbudowanie sterownika do czego tylko chcemy. Ja przystosowałem swój do sterowania wentylatorami i odczytu temperatury w PC trwają jeszcze prace na zegarem. Wszystko pięknie działa, ale mam problem ze stroną menu która jest odpowiedzialna za wysterowanie wentylatorami :/

    Zamieszczam kod do strony wysterowania wentylatorami oraz film w avi

    Video


    Code:

    ..................  to jest w peti
    If Strona = 2 Then
    If Downigora = 1 Then ' to jest przycisk w dol na pilocie
    Cls
    Pod_2_strona
    End If
    End If
    ...................  koniec petli
    .................... Podprogramy
    Sub Pod_2_strona:
    If Address = 0 And Command = 1 Then
    Waitms 100
    Toggle Portb.1
    End If
    If Address = 0 And Command = 2 Then
    Waitms 100
    Toggle Portb.2
    End If

    Locate 1 , 1
    Lcd "Back MENU"
    Locate 1 , 16
    Lcd Chr(2)

    If Portb.1 = 0 Then
    Locate 2 , 1
    Lcd "1 ON"
    Migotanie
    End If
    If Portb.1 = 1 Then
    Locate 2 , 1
    Lcd "1 OFF"
    End If
    If Portb.2 = 0 Then
    Locate 2 , 12
    Lcd "2 ON "
    Migotanie1
    End If
    If Portb.2 = 1 Then
    Locate 2 , 12
    Lcd "2 OFF"
    End If



    If Address = 0 And Command = 32 Then  ' przycisk w gore na pilocie
    Cls
       2_strona
       End If

    End Sub

    Sub Pod_3_strona:
    End Sub

    Sub Migotanie:
    Locate 2 , 2
    Lcd Chr(3)
    Waitms 100
    Locate 2 , 2
    Lcd Chr(4)
    Waitms 100
    Locate 2 , 2
    Lcd Chr(5)
    Waitms 100
    Locate 2 , 2
    Lcd Chr(6)
    Waitms 100
    End Sub

    Sub Migotanie1:
    Locate 2 , 13
    Lcd Chr(3)
    Waitms 100
    Locate 2 , 13
    Lcd Chr(4)
    Waitms 100
    Locate 2 , 13
    Lcd Chr(5)
    Waitms 100
    Locate 2 , 13
    Lcd Chr(6)
    Waitms 100
    End Sub


    Na czym polega problem ??? :
    Gdy oba w tym przypadku wentylatory są wyłączone nie wiem czemu ale wyświetlacz miga jakby w kodzie były same " cls ".
    Gdy włączymy 1 wentylator wyświetlacz znowu miga jak poprzednio.
    Gdy naraz są włączone obydwa wentylatory to przy znaczniku 2 wentylatora jest przerwa pomiędzy ikoną wentylatora ( "czystka" ), lecz gdy wyłączymy 1 wentylator przerwa znika ale wyświetlacz nadal miga :/

    Trochę ten mój opis pokręcony ale trzymam kciuki abyście mnie zrozumieli :D

    Jeśli ktoś pomoże mi aby ten problem znikną dostanie ode mnie premii w wysokości 45 pkt.

    PS. Przepraszam za kod ale jestem początkującym i sie nadal uczę
  • #2
    OlekM
    Level 17  
    Z tego co widzę, najpierw wyświetlacz jest czyszczony w głównej pętli, następnie wysyłana jest na niego nowa zawartość w procedurze Pod_2_strona.

    Ta procedura zaczyna się od potencjalnego opóźnienia 100ms, w zależności od stanu zmiennych address i command - jeśli ten fragment się wykona wyświetlacz przez 100 ms będzie pusty. Ten fragment powinien być przed Cls lub po wyświetleniu wszystkiego. Ale to jeszcze nic :-)

    Następnie wyświetlany jest pierwszy tekst "ON " lub "OFF" i jeśli był "ON " rozpoczyna się (długotrwała) animacja i dopiero po jej ukończeniu ładowany jest drugi tekst "ON " lub "OFF". Zatem przez długi czas nie widać drugiego z napisów.

    Proponuję rozwiązać problem tak:
    1. nie czyścić wyświetlacza przez Cls, tylko wpisując nowe teksty ze spacjami w miejscach gdzie starsze znaczki mają zostać wyczyszczone - wówczas nie będzie "przygaśnięcia"
    2. najpierw wyświetlić wszystkie teksty w stylu "ON ", "OFF" a dopiero później rozpoczynać animację - wówczas drugi z napisów będzie od razu aktualny
  • #3
    arktik1
    Level 27  
    Miga bo CLS masz w pętli, zawsze będzie migał bo co pętla to powtarza CLS.
    Daj cały kod ,bo to co pokazujesz jest jakoś dziwnie napisane,przynajmniej dla mnie.
  • #4
    biglolo94
    Level 16  
    OlekM klawiatura jest czyszczona za każdym razem gdy jakaż komenda z pilota leci do procka co pokazuje część kodu :

    Code:
    If Address = 0 And Command = 16 Then
    
    Cls
    Incr Strona
    End If

    If Address = 0 And Command = 17 Then
    Cls
    Decr Strona
    End If

    If Address = 0 And Command = 33 Then
    Cls
    Downigora = 1
    End If

    If Address = 0 And Command = 32 Then
    Cls
    Downigora = 0
    End If


    No i oczywiście na początku innych podstron.

    A co do tych animacji to czy ten warunek
    Code:
    if portb.1 = 0 then
    
    migotanie
    end if
    if portb.2 = 0 then
    migotanie1
    end if

    Podac w pod_2_strona czy w petli gdzie jest analiza komend, stron itp. ???

    Podaje cały program tylko proszę o wyrozumiałość i nie wylatywać zaraz że mam zapomnieć o takim pisaniu programów, co ty robisz itp.

    Code:
    $regfile = "m8def.DAT"                                      'deklaracja procesora, w tym wypadku Atmega16
    
    $crystal = 8000000                                          'deklaracja cześtotlwiości pracy
    'Deklaracja portów od wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Config Lcd = 16 * 2
    Cursor Off
    Enable Interrupts
    Declare Sub Loading
    Loading

    '**** obsluga RC5 ****
    Config Rc5 = Pind.3
    Dim Address As Byte
    Dim Command As Byte
    '*********************
    '**** Termometr ****
    Config 1wire = Portb.0
    Dim I1 As Integer , Ss As String * 6
    Dim I2 As Integer
    Dim I3 As Integer
    Dim I4 As Integer
    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    Dim Dsid3(8) As Byte
    Dim Dsid4(8) As Byte
    Dim B As Byte                                               'deklaracja zmiennej do odczytu kodów ID
    Dim W As Byte                                               'deklaracja zmiennej do odczytu ilośc czujników
    W = 1wirecount()
    Cls
    Locate 1 , 1
    Lcd W
    Wait 1
    Cls
    Dsid1(1) = 1wsearchfirst()                                  'Znajdź kolejny czujnik podpięty do portu
    Dsid2(1) = 1wsearchnext()
    Dsid3(1) = 1wsearchnext()
    Dsid4(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu

    '*******************Odczyt numerów ID czujników temperatury*********************

    If W = 1 Then
     If Dsid1(8) = Crc8(dsid1(1) , 7) Then
     Cls                                                        'ta opcja pojawia się tylko przy włączaniu urządzenia
     Lcd "  Czujnik 1 OK  "
     Wait 2
     Locate 1 , 1
     For B = 1 To 8
     Lcd Hex(dsid1(b))
     Next
     Wait 2
     End If
    End If

    If W = 2 Then
     If Dsid1(8) = Crc8(dsid1(1) , 7) Then
     Cls
     Lcd "  Czujnik 1 OK  "
     Wait 2
     Locate 1 , 1
     For B = 1 To 8
     Lcd Hex(dsid1(b))
     Next
     Wait 2
     End If

     If Dsid2(8) = Crc8(dsid2(1) , 7) Then
     Locate 2 , 1
     Lcd "  Czujnik 2 OK  "
     Wait 2
     Locate 2 , 1
     For B = 1 To 8
     Lcd Hex(dsid2(b))
     Next
     Wait 2
     End If

    End If

    If W = 3 Then
    If Dsid1(8) = Crc8(dsid1(1) , 7) Then
    Cls
     Lcd "  Czujnik 1 OK  "
     Wait 2
     Locate 1 , 1
     For B = 1 To 8
     Lcd Hex(dsid1(b))
     Next
     Wait 2
     End If

     If Dsid2(8) = Crc8(dsid2(1) , 7) Then
     Locate 2 , 1
     Lcd "  Czujnik 2 OK  "
     Wait 2
     Locate 2 , 1
     For B = 1 To 8
     Lcd Hex(dsid2(b))
     Next
     Wait 2
     End If

     If Dsid3(8) = Crc8(dsid3(1) , 7) Then
     Cls
     Locate 1 , 1
     Lcd "  Czujnik 3 OK  "
     Wait 2
     Locate 1 , 1
     For B = 1 To 8
     Lcd Hex(dsid3(b))
     Next
     Wait 2
     End If
    End If

    If W = 4 Then
     If Dsid1(8) = Crc8(dsid1(1) , 7) Then
     Cls
     Lcd "  Czujnik 1 OK  "
     Wait 2
     Locate 1 , 1
     For B = 1 To 8
     Lcd Hex(dsid1(b))
     Next
     Wait 2
     End If

     If Dsid2(8) = Crc8(dsid2(1) , 7) Then
     Locate 2 , 1
     Lcd "  Czujnik 2 OK  "
     Wait 2
     Locate 2 , 1
     For B = 1 To 8
     Lcd Hex(dsid2(b))
     Next
     Wait 2
     End If

     If Dsid3(8) = Crc8(dsid3(1) , 7) Then
     Cls
     Locate 1 , 1
     Lcd "  Czujnik 3 OK  "
     Wait 2
     Locate 1 , 1
     For B = 1 To 8
     Lcd Hex(dsid3(b))
     Next
     Wait 2
     End If

     If Dsid4(8) = Crc8(dsid4(1) , 7) Then
     Locate 2 , 1
     Lcd "  Czujnik 4 OK  "
     Wait 2
     Locate 1 , 1
     For B = 1 To 8
     Lcd Hex(dsid4(b))
     Next
     Wait 2
     End If
    End If

    Wait 2
    Cls

    '*******************koniec odczytu ID czujników temperatury*********************

    '**** MENU ****
    Dim Strona As Byte
    Dim Podstrona As Byte

    Strona = 1

    Declare Sub 1_strona
    Declare Sub 2_strona
    Declare Sub 3_strona
    Declare Sub Pod_1_strona                                    'termometr
    Declare Sub Pod_2_strona                                    'wentylatory
    Declare Sub Pod_3_strona                                    'zegar
    Declare Sub Went_1
    Dim Downigora As Byte
    Downigora = 0
    Config Portb.1 = Output
    Portb.1 = 1
    Config Portb.2 = Output
    Portb.2 = 1
    Dim T As Byte
    T = 0



    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32             'znak stopnia Celsjusza
    Deflcdchar 1 , 4 , 4 , 4 , 4 , 21 , 14 , 4 , 32             ' strzalka dol
    Deflcdchar 2 , 4 , 14 , 21 , 4 , 4 , 4 , 4 , 32             ' strzalka gora

    Deflcdchar 3 , 32 , 6 , 16 , 21 , 1 , 12 , 32 , 32          ' replace ? with number (0-7)
    Deflcdchar 4 , 32 , 19 , 16 , 4 , 1 , 25 , 32 , 32          ' replace ? with number (0-7)
    Deflcdchar 5 , 32 , 25 , 1 , 4 , 16 , 19 , 32 , 32          ' replace ? with number (0-7)
    Deflcdchar 6 , 32 , 12 , 1 , 21 , 16 , 6 , 32 , 32          ' replace ? with number (0-7)

    Deflcdchar 7 , 4 , 10 , 10 , 10 , 17 , 17 , 17 , 14         'termometr


    Declare Sub Migotanie
    Declare Sub Migotanie1

    Do

    Getrc5(address , Command )
    Command = Command And &B01111111

    '***** klawiatura rc5 *****
    If Address = 0 And Command = 16 Then
    Cls
    Incr Strona
    End If

    If Address = 0 And Command = 17 Then
    Cls
    Decr Strona
    End If

    If Address = 0 And Command = 33 Then
    Cls
    Downigora = 1
    End If

    If Address = 0 And Command = 32 Then
    Cls
    Downigora = 0
    End If
    '***** koniec klawiatury rc5 *****
    '***** Strony menu *****
    If Strona = 1 Then
    1_strona
    End If

    If Strona = 2 Then
    2_strona
    End If

    If Strona = 3 Then
    3_strona
    End If

    If Strona =< 1 Then
    Strona = 1
    End If

    If Strona >= 3 Then
    Strona = 3
    End If
    '***** koniec stron menu *****
    '***** podstrony menu *****
    If Strona = 1 Then
    If Downigora = 1 Then
    Cls
    Pod_1_strona
    End If
    End If

    If Strona = 2 Then
    If Downigora = 1 Then
    Cls
    Pod_2_strona
    End If
    End If


    If Strona = 3 Then
    If Downigora = 1 Then
    Cls
    Pod_3_strona
    End If
    End If
    '***** koniec podstron menu *****

    Loop


    Sub 1_strona:
    Locate 1 , 1
    Lcd "Termometr"
    Locate 1 , 16
    Lcd Chr(1)
    Locate 2 , 15
    Lcd "=>"
    End Sub

    Sub 2_strona :
    Locate 1 , 1
    Lcd "Wentylacja"
    Locate 1 , 16
    Lcd Chr(1)
    Locate 2 , 1
    Lcd "<="
    Locate 2 , 15
    Lcd "=>"
    End Sub

    Sub 3_strona:
    Locate 1 , 1
    Lcd "Zegar"
    Locate 1 , 16
    Lcd Chr(1)
    Locate 2 , 1
    Lcd "<="
    End Sub


    Sub Pod_1_strona :
    Cls

    Do

    Getrc5(address , Command )
    Command = Command And &B01111111

    Locate 1 , 1
    Lcd "Back MENU"
    Locate 1 , 16
    Lcd Chr(2)

       1wreset
       1wwrite &H55
       1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
       1wwrite &HBE
       I1 = 1wread(2)
    '---------------------------------
       1wreset
       1wwrite &H55
       1wverify Dsid2(1)                                        'wysylam adres drugiego czujnika
       1wwrite &HBE
       I2 = 1wread(2)
    '---------------------------------
      1wreset
       1wwrite &H55
       1wverify Dsid3(1)                                        'wysylam adres trzeciego czujnika
       1wwrite &HBE
       I3 = 1wread(2)
        '---------------------------------
      1wreset
       1wwrite &H55
       1wverify Dsid4(1)                                        'wysylam adres czwartego czujnika
       1wwrite &HBE
       I4 = 1wread(2)

    '--------konwersja temp dla wszystkich dsow
       1wreset
       1wwrite &HCC
       1wwrite &H44

       Wait 1
    '****** Wyswietlanie temperatury *****



       If Address = 0 And Command = 16 Then
       Incr T
       End If

       If Address = 0 And Command = 17 Then
       Decr T
       End If

       If T < 0 Then
       T = 1
       End If

       If T > 1 Then
       T = 1
       End If

       If T = 0 Then
       I1 = I1 * 10
       I1 = I1 / 16
       'If I1 > 0 Then Cls                                       'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss = Str(i1)
       Ss = Format(ss , " 0.0")                                 'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
       Locate 2 , 1
       Lcd "1" ; Chr(7) ; ": " ; Ss ; Chr(0)
       Locate 2 , 15
       Lcd "=>"
       End If

       If T = 1 Then
       I2 = I2 * 10
       I2 = I2 / 16
       'If I1 > 0 Then Cls                                       'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss = Str(i2)
       Ss = Format(ss , " 0.0")                                 'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
       Locate 2 , 1
       Lcd "2" ; Chr(7) ; ": " ; Ss ; Chr(0)
       Locate 2 , 15
       Lcd "<="
       End If

       If Address = 0 And Command = 32 Then
       Exit Do
       1_strona
       End If

       Loop

    End Sub

    Sub Pod_2_strona:
    If Address = 0 And Command = 1 Then
    Waitms 100
    Toggle Portb.1
    End If
    If Address = 0 And Command = 2 Then
    Waitms 100
    Toggle Portb.2
    End If

    Locate 1 , 1
    Lcd "Back MENU"
    Locate 1 , 16
    Lcd Chr(2)

    If Portb.1 = 0 Then
    Locate 2 , 1
    Lcd "1 ON"
    Migotanie
    End If
    If Portb.1 = 1 Then
    Locate 2 , 1
    Lcd "1 OFF"
    Locate 2 , 2
    Lcd Chr(3)
    End If
    If Portb.2 = 0 Then
    Locate 2 , 12
    Lcd "2 ON "
    Migotanie1
    End If
    If Portb.2 = 1 Then
    Locate 2 , 12
    Lcd "2 OFF"
    Locate 2 , 13
    Lcd Chr(3)
    End If

    If Address = 0 And Command = 32 Then
    Cls
       2_strona
       End If

    End Sub

    Sub Pod_3_strona:
    End Sub

    Sub Migotanie:
    Locate 2 , 2
    Lcd Chr(3)
    Waitms 100
    Locate 2 , 2
    Lcd Chr(4)
    Waitms 100
    Locate 2 , 2
    Lcd Chr(5)
    Waitms 100
    Locate 2 , 2
    Lcd Chr(6)
    Waitms 100
    End Sub

    Sub Migotanie1:
    Locate 2 , 13
    Lcd Chr(3)
    Waitms 100
    Locate 2 , 13
    Lcd Chr(4)
    Waitms 100
    Locate 2 , 13
    Lcd Chr(5)
    Waitms 100
    Locate 2 , 13
    Lcd Chr(6)
    Waitms 100
    End Sub

    Sub Loading:
    Cls
    Locate 1 , 1
    Lcd "[loading]"
    Lowerline
    Lcd "Wczytuje program"
    Waitms 500
    Locate 1 , 2
    Lcd Chr(6)
    Locate 1 , 13
    Lcd "15%"
    Waitms 500
    Locate 1 , 3
    Lcd Chr(6)
    Locate 1 , 13
    Lcd "30%"
    Waitms 500
    Locate 1 , 4
    Lcd Chr(6)
    Locate 1 , 13
    Lcd "45%"
    Waitms 500
    Locate 1 , 5
    Lcd Chr(6)
    Locate 1 , 13
    Lcd "60%"
    Waitms 500
    Locate 1 , 6
    Lcd Chr(6)
    Locate 1 , 13
    Lcd "80%"
    Waitms 500
    Locate 1 , 7
    Lcd Chr(6)
    Locate 1 , 13
    Lcd "90%"
    Waitms 500
    Locate 1 , 8
    Lcd Chr(6)
    Locate 1 , 13
    Lcd "100%"
    Waitms 500
    Cls
    Locate 1 , 1
    Lcd "  Wczytywanie  "
    Locate 2 , 1
    Lcd "   zakonczone   "
    Waitms 500
    End Sub


    A i moze jescze damy radę skrócić komendę loading ???

    Proszę poprawić temat!
    Robak
  • #5
    OlekM
    Level 17  
    Z poniższego proponuję pozbyć się Cls:

    Code:

    If Strona = 2 Then
    If Downigora = 1 Then
    Cls
    Pod_2_strona
    End If
    End If


    A dalej zrobić zmiany w takim stylu:

    Code:

    Sub Pod_2_strona:
    Dim i As Byte

    If Address = 0 And Command = 1 Then
    Waitms 100
    Toggle Portb.1
    End If
    If Address = 0 And Command = 2 Then
    Waitms 100
    Toggle Portb.2
    End If

    Locate 1 , 1
    Lcd "Back MENU     "      'dopełnione do 15 znaków, by zamazać poprzednią zawartość
    Locate 1 , 16
    Lcd Chr(2)

    Locate 2 , 1
    If Portb.1 = 0 Then
    Lcd "1 ON "
    else
    Lcd "1 OFF"
    Locate 2 , 2
    Lcd Chr(3)
    End If
    'w tym momencie mamy w dolnej linii zawsze 5 znaków
    Locate 2 , 5
    Lcd "       "   'dopełnij spacjami do znaku 12

    Locate 2 , 12
    If Portb.2 = 0 Then
    Lcd "2 ON "
    Else
    Lcd "2 OFF"
    Locate 2 , 13
    Lcd Chr(3)
    End If

    'poniższy kod mógłby zastąpić oba "migotania"
    For i = 3 to 6
    If Portb.1 = 0 Then
    Locate 2 , 2
    Lcd Chr(i)
    End If
    If Portb.2 = 0 Then
    Locate 2 , 13
    Lcd Chr(i)
    End If
    Waitms 100
    Next

    If Address = 0 And Command = 32 Then
    Cls
    2_strona
    End If

    End Sub


    Możliwe, że zrobiłem w kodzie jakieś błędy - ale powinny być łatwe do usunięcia :-)
  • #6
    biglolo94
    Level 16  
    Twoja koncepcja pomogła i to nawet bardzo ale niestety gdy zmienimy któreś na on lub off dosłownie na chwilkę widać nie 2 podstronę ale 2 stronę w MENU :/
    A nawet gdy nie naciskamy nic ( brak komendy z pilota RC5 ) przez ułamek sekundy widać jak 2 strona z menu głównego tez się pokazuje :/
    Chcesz to mogę to nagrać



    Proszę poprawić pisownię, nazwę tematu, nie pisać posta pod postem oraz nie kasować wpisów moderacyjnych!
    Robak
  • #7
    OlekM
    Level 17  
    Wydaje mi się, że decydując się na wyświetlenie jednej ze stron...

    Code:

    If Strona = 2 Then
    2_strona
    End If


    powinniśmy wcześniej sprawdzić warunek

    Code:

    If Downigora = 0 Then


    bo jak rozumiem strona 2 powinna być widoczna, tylko gdy Downigora = 0. Może to pomoże :-)
  • #8
    biglolo94
    Level 16  
    No już działa xD
    Jestem bardzo szczęśliwy, że nareście wszystko działa.
    Jak obiecywałem na twoje konto wędruje właśnie 45 pkt.
    Ale jeszcze mam do ciebie pytanko czy te animację dało by rade dać w pętli??? Wtedy będzie ona lepsza i wyraźniejsza.


    Do moderatora:
    Poprawiłem wszystko i mam nadzieję, że nazwa tematu odpowiada
  • #9
    OlekM
    Level 17  
    Być może takie rozwiązanie animacji, okaże się optymalne:

    Na poziomie całego kodu zdefiniować nową zmienną i ustawić na 0, np.:
    Code:

    Dim Klatka As Byte
    Klatka = 0



    A w miejscu gdzie animacja miałaby się wykonać, umieścić taki kod:

    Code:

    If Portb.1 = 0 Then
    Locate 2 , 2
    Lcd Chr(Klatka + 3)
    End If
    If Portb.2 = 0 Then
    Locate 2 , 13
    Lcd Chr(Klatka + 3)
    End If

    Klatka = Klatka + 1
    If Klatka > 3 Then
      Klatka = 0
    End If

    Waitms 100 ' jeśli będą inne opóźnienia - to może być zbędne


    Wówczas w kolejnych obiegach wartości zmiennej Klatka będą wynosić: 0, 1, 2, 3, 0, 1, 2, ...
    Dzięki temu na wyświetlacz powinny trafiać kolejno znaki od 3 do 6 z generatora znaków LCD.
  • #10
    biglolo94
    Level 16  
    Code:
    Lcd Chr(Klatka + 3) 


    Niestety ale w tej czesci kodu bascom znajduje blad:/
    invalid datatype [0] , in file:C:\.......................
  • #11
    OlekM
    Level 17  
    Sorry, w C tak mogę robić :-)
    Ale już sugeruję inne podejście.

    "na górę" kodu:

    Code:

    Dim Klatka As Byte
    Klatka = 3


    "na dół" kodu:

    Code:

    If Portb.1 = 0 Then
    Locate 2 , 2
    Lcd Chr(Klatka)
    End If
    If Portb.2 = 0 Then
    Locate 2 , 13
    Lcd Chr(Klatka)
    End If

    Klatka = Klatka + 1
    If Klatka > 6 Then
      Klatka = 3
    End If

    Waitms 100 ' jeśli będą inne opóźnienia - to może być zbędne
  • #12
    biglolo94
    Level 16  
    To jest to samo co wcześniej :) tyle ze
    Code:
    Lcd Chr(Klatka) 


    w nawiasie usunąłeś + 3 ;P

    Działa wyśmienicie xD
    Wielkie dzięki

    Tematu narazie nie zamyakm bo może będę miał jeszcze jakieś problemy
  • #13
    biglolo94
    Level 16  
    OlekM mam jeszcze sprawe do ciebie.
    W moim projekcie jest termometr, ale nie wiem jak napisac program gdy np. temperatura jest wieksza niz 20 stopni to wentylator sie wlacza.

    Próbowałem coś takiego ale nie idzie :/

    Code:
    I1 = I1 * 10
    
       I1 = I1 / 16
       'If I1 > 0 Then Cls                                       'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss = Str(i1)
       Ss = Format(ss , " 0.0")                                 'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
       Locate 2 , 1
       Lcd "1" ; Chr(7) ; ": " ; Ss ; Chr(0)
       Locate 2 , 13
       Lcd "  =>"

       If  Ss > 10 Then
       Portb.0 = 0
       Locate 2 , 10
       Lcd "On"
       End If
  • #14
    OlekM
    Level 17  
    Proponuję porównanie zrobić na zmiennej liczbowej - czyli I1 - będzie lepiej.

    No i oczywiście dodać else wyłączające silnik i piszące "off" :-)
  • #15
    utak3r
    Level 25  
    Z tym "else" to nie tak do końca - próg wyłączania powinien być niżej, niż próg załączania, inaczej, gdy temperatura będzie się wahała w okolicach tych 20 stopni, wskazania będą np. 19,9-20.1, zmieniające się co kilka sekund - i wiatrak oszaleje... czyli coś a'la:

    Code:

    if (temp > 20)
      wlacz();
    else if (temp < 19)
      wylacz();
  • #16
    biglolo94
    Level 16  
    Zastosowałem coś takiego
    Code:
    If I1 > 30 Then
    
       Portb.0 = 0 ' wyłącz
       Elseif I1 < 29 Then
       Portb.0 = 1 ' wyłącz
       End If


    I mam jeszcze jedno pytanko. Znalazłem dużo atmeli ktore maja takie same wyjscia i w tym samym miejscu oraz mają więcej pamięci niż ATMEGA8, ale niestety są szersze :/ Może wiecie gdzie znajde taki sam układ co mega8 tyle, że o większej pamięci???
  • #17
    OlekM
    Level 17  
    Jeśli chodzi o niedostatek pamięci FLASH - to może Atmega168 - 16k FLASH, 1k SRAM, 512B EEPROM. Jest dostępna w "wąskim" DIP28, np. w TME.
  • #18
    biglolo94
    Level 16  
    Powracam z następnym pytaniem.
    Czy wie ktoś jak zapisywać coś z atmegi na karte SD i odwrotnie???
    Prosiłbym najlepiej o jakies kody no i oczywiscie BASCOM
  • #20
    kermit64
    Level 10  
    Sorki wszystkich,ze nie na temat.Czy może mi ktoś doradzić,jak sobie poradzić z wyświetlaczem z lispolu?Chciałem zmontować termometr i za diabła nie może ruszyć,górna linijka świeci i nic po za tym.Jestem ciemny w pisaniu programu,więc korzystam z gotowców.Atmega dobrze zaprogramowana-tak twierdzi bascom.Da się to zrobić,tylko trzeba wiedzieć jak,ja nie wiem :cry:Bardzo proszę o sugestie.
  • #21
    OlekM
    Level 17  
    @kermit64

    Proponuję jednak rozpocząć nowy temat i na początek podać dokładny symbol wyświetlacza, zaprezentować zastosowany schemat dołączenia go do procesora oraz fragment kodu odpowiedzialny za sterowanie nim. Warto też napisać, jakie próby się już poczyniło, i czy ma się jakieś własne przypuszczenia w tej sprawie. Dość istotne może się także okazać zasilanie procesora i obwód jego resetu - warto je uwzględnić na schemacie.
  • #22
    biglolo94
    Level 16  
    Jesli napisales jakis program to podaj a ja ci powiem jak LCD podlaczyc.
    Sam mam wyświetlacze z LISPOLu i często poprostu miałem tak ze program był dobry ale źle podłączałem wyświetlacz.
    I jeszcze dokumentacje lcd i czy jest zgodny z HD44780
  • #23
    lukashb
    Level 39  
    A ja bym wszystkim Panom proponował przejście na wyświetlacz graficzny. np. taki KS0108. Swego czasu robiłem na nim większy projekt wywołania selektywnego, i na nim wyświetlałem dane. Bajecznie prosto się używa procedur, nie jesteśmy ograniczeni co do przestrzeni, sami określamy z dokładnością pixela gdzie ma być cyfra/litera, i jaka to czcionka, czy 5x5 czy 8x8 a może 32x32 ;), tylko taka duża pamięci zjada sporo. Tak więc radzę przemyśleć, ze zrobieniem takiego kręcącego się wiatraczka to niema problemu - chwila i zrobione ;) ! Pozdraiwam
  • #24
    biglolo94
    Level 16  
    Powiem ci że wyświetlacze graficzne naprawde są najlepszym rozwiązaniem, ale iż narazie nie brałem się za wyświetlacze graficzne więc go nie zastosowałem.
    Narazie w przeciągu miesiąca na elektrode powinienem wrzucic moj projekt który będzie w wersji V1 a w nowszej wersji zastosuje wyswietlacz graficzny.

    Ale skoro powiadzasz, że te wyświetlacze graficzne są takie łatwe do obsługi może podzieliłbyś się programami itp?
  • #25
    lukashb
    Level 39  
    Zaraz poszukam coś o tym skąd korzystałem, to było bardzo proste, ponieważ określało się zerem lub jedynką to czy ma być pozycja 0,90,180,240 stopni, czy czcionka 1,2 itp (do wyboru ile wpiszesz) i czy ma być odwrócone tło,bądź nie. Mozna mieszać oczywiście tryby i wyjdzie wspaniały sterownik bądź inne urządzenie :)

    Dodano po 2 [minuty]:

    Proszę :
    http://evertdekker.com/Joomla/index.php?option=com_content&task=view&id=49&Itemid=84 Gdyby było trzeba, to postaram się pomóc! Pozdrawiam
  • #26
    kermit64
    Level 10  
    Coś się zaświeciło-wyświetlacz jest OK,programy gotowe z tego forum.Zobaczyłem ciągi przesuwających się znaków więc sądze,że wyświetlacza nie uwaliłem.Będę próbował dalej-kolejnego pająka.A tak na marginesie,myślałem,że zrobienie prostego termometru to nic trudnego,zwłaszcza,że byłem kompletnie zielony.Nawet bascoma nie umiałem użyć.Teraz zaczynam troche rozumieć.A młody już nie jestem.Pomęczę trochę ludzi w innym temacie. :lol:
  • #27
    biglolo94
    Level 16  
    No dzięki za linka, zaraz kupuje sobie wyswietlacz graficzny.
    W sumie za wyświetlanie odpowiada tylko ta część kodu:
    Code:
    $regfile = "m128def.DAT"
    
    $crystal = 7372800
    $baud = 19200
    $hwstack = 100
    $swstack = 120
    $framesize = 100

    Config Graphlcd = 240 * 128 , Dataport = Porta , Controlport = Portc , Ce = 3 , Cd = 0 , Wr = 2 , Rd = 1 , Reset = 4 , Fs = 5 , Mode = 6
    Cursor Off
    Cls


    Declare Sub Lcdtext(byval S As String , Byval Xoffset As Byte , Byval Yoffset As Byte , Byval Fontset As Byte , Byval Inverse As Byte , Byval Rotation As Byte)
    'SYNTAX  Lcdtest String , Xoffset , Yoffset , Fontset , Inverse , Rotation
    '
    '* Xoffset and Yoffset is in pixels, so you can place text on every spot on the display
    '* You determin yourself in the subroutine witch font belongs to the fontset


    '=== Your main prog here ====
    Do
    Lcdtext "5X5 Font" , 10 , 2 , 4 , 0 , 0
    Lcdtext "8X8 Font" , 2 , 120 , 2 , 1 , 3
    Lcdtext "6X8 Font" , 10 , 20 , 3 , 0 , 0
    Lcdtext "16X16 font" , 10 , 30 , 2 , 0 , 0
    Lcdtext "Inverted" , 10 , 85 , 2 , 1 , 0
    Lcdtext "If you can't read this then incr. Swstack" , 1 , 120 , 4 , 0 , 0
    Wait 10
    Cls
    Lcdtext "0 deg.Rotation" , 10 , 10 , 1 , 0 , 0
    Lcdtext "90 deg.Rotation" , 170 , 1 , 1 , 0 , 1
    Lcdtext "180 deg.Rotation" , 120 , 20 , 1 , 0 , 2
    Lcdtext "270 deg.Rotation" , 200 , 120 , 1 , 0 , 3
    Lcdtext "Also inverted" , 150 , 80 , 1 , 1 , 2
    Lcdtext "Every font" , 150 , 100 , 2 , 0 , 2
    Wait 10
    Cls
    Loop
    End


    Ale powiedz mi jeszcze czy na atmega16 da rade taki wyswietlacz podlaczyć?
    I co kolejno oznacza ta linia kodu
    Code:
    150 , 100 , 2 , 0 , 2


    I czy przy wyswietlaczach graficznych komenda cls czysci caly ekran?

    Dodano po 2 [minuty]:

    A i jeszcze z kim sterownikiem tak łatwo to wszystko ubsługiwać?
  • #28
    lukashb
    Level 39  
    Witam! Więc po kolei. Ja z początku obsłużyłem taki LCD na Atmega8, lecz z powodu braku pamięci przesiadłem się na Atmegę 16, gdzie zostało mi jeszcze ok. 48 % pamięci. Najbardziej pamięciożerna jest czcionka, bo ona zajmuje w zalezności od rozmiaru ok. 4-5kB, lecz duże czcionki zajmują więcej. Tak CLS czyści całość. Co do pytania o sterownik nie rozumiem ;). Pamiętaj, że kod ten jest mnogi bo maobsługe 4 położeń, ja u siebie wywaliłem wszystkie oprócz jednej tej której potrzebowałem! Pozdrawiam
  • #29
    biglolo94
    Level 16  
    Z tym sterownikim chodziło mi oto, że każdy wyświetlacz może mieć inny sterownik i czy bez względu na rodzaj owego sterownika tak samo się je obsługuje???
    Na allegro jest duzo lcd z roznymi sterownikami.

    Quote:
    Pamiętaj, że kod ten jest mnogi bo maobsługe 4 położeń, ja u siebie wywaliłem wszystkie oprócz jednej tej której potrzebowałem

    I rozwin to bo nie kumam ;)

    A i jeszcze nie odpowiedziales o tej lini kodu - co ona kolejno oznacza
  • #30
    lukashb
    Level 39  
    A więc tak ;) musiało mi umknąć ponieważ z kolegą rozmawiałem. To oznacza w takiej kolejności następująco:
    Lcdtext string, x , y , fontset , inverse , rotation ;)
    Co do skrócenia kodu. Zapewne będziesz używał wyświetlacza w takiej pozycji jak wszyscy, czyli normalnie, żaden obrót tekstu. Tak więc zaczynasz usuwanie kodu od tej linijki (ją pozostawiając):
    Select Case Rotation
    Musisz więc zostawić Case 0, a wywalić Case1,2,3 do linijki:
    End Sub 'End of this amazing subroutine
    Lecz wtedy w linijce o którą pytałeś musisz koniecznie używać 0 w ustawieniu Fontset. Bo tylko takie ustawienie jest dostępne. Jak kupisz Lcd to popiszemy dalej ;). Nie bój się, to proste, ja też myślałem, że nie podołam, lecz się udało z dorbym efektem!