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.

[atmega8][Bascom]Kłopoty przy obsłudze przycisków.

czajnikx 08 Feb 2010 00:36 3300 9
  • #1
    czajnikx
    Level 13  
    Witam zacząłem projektować termometr na ds1820 do sterowania centralnym piecem.
    Odczyt temperatury działa ale nie mogę sobie poradzić z klawiszami np. wejście do menu, zwiększ histerezę itp.
    Poniżej zamieszczam mój kod jeżeli ktoś wyłapał by błąd jaki robię był bym wdzięczny

    Code:

    regfile = "m8def.dat"
    $crystal = 8000000


    Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portb.5 , Rs = Portb.6
    Config Lcd = 16 * 2

    Config 1wire = Portd.7
    Config Portc.5 = Input    'tutaj deklaruje przycisk
    Portc.5 = 0                   'ustawiam stan na 0
    Declare Sub Odcz_temp

    Dim A As Integer
    Dim B As Integer
    Dim Temperatura(2) As Byte
    Dim Temp1 As Byte
    Enter Alias Portc.5         'alias jako enter

    Deflcdchar 0 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32
    Deflcdchar 1 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31
    Deflcdchar 2 , 32 , 4 , 14 , 21 , 4 , 4 , 4 , 32
    Deflcdchar 3 , 32 , 4 , 4 , 4 , 21 , 14 , 4 , 32
    Deflcdchar 4 , 32 , 32 , 32 , 31 , 32 , 32 , 32 , 32



    Cls
    Lcd "Sterownik pieca CO"


    Cls
     Lcd "Loading..."
     Lowerline
    For A = 1 To 16
       Lcd Chr(1)

    Waitms 80
    Cls
    Home
    Lcd "wybierz 1 lub 2"
    Do                                     'i nie wiem dlaczego tego nie chce mi przejsc
    If Enter = 1 Then
    Gosub Odcz_temp
    End If

    Loop
    Next
    Do
     Call Odcz_temp
     Home



     If Temperatura(2) = 0 Then
     Lcd "Piec:" ; Temperatura(1) ; Chr(0) ; "C"
     Lowerline
     Lcd "Bojler: "
     Else
     Lcd "temp:-" ; Temperatura(1) ; "C"
     End If
    Loop


    End

    Sub Odcz_temp
    1wreset
    1wwrite &HCC
    1wwrite &H44

    Wait 1

    1wreset
    1wwrite &HCC
    1wwrite &HBE

    Temperatura(1) = 1wread(2)

    1wreset
    If Err = 1 Then
    Cls
    Lcd "brak ukladu"

    Do
    Loop
    End If

    If Temperatura(2) > 0 Then
    Temperatura(1) = 256 - Temperatura(1)
    End If
    Temperatura(1) = Temperatura(1) / 2



    End Sub

     End
    [28-30.06.2022, targi] PowerUP EXPO 2022 - zasilanie w elektronice. Zarejestruj się za darmo
  • #2
    leon1313
    Level 14  
    Ojojoj, dawno nie widziałem takiego kodu. Jak rozumiem, s a to twoje początki.
    Podejrzewam, że nie będzie się chciało nikomu tego poprawiać, bo to jest nie do naprawienia, tylko do napisania od nowa.
    Zainteresuj się help-em w BASCOM, ew. zainwestuj w książkę:
    http://www.btc.pl/?id_prod=65500
    Poczytaj też na forum o obsłudze klawiszy, konfiguracji portów (pin-ów) do odczytu.
    Zacznij od prostych rzeczy, np zwiększaniem lub zmniejszaniem zmiennej za pomocą przycisków i jej wyświetlaniem.
    Poniżej wkleje ci kawałek kodu, który , po naciśnięciu przycisku, powoduje zmianę jednego z jednego z wyjść portu na stan przeciwny.
    Code:

    $regfile = "M32DEF.DAT"

    Config Porta = Output  'cały port a jako wyjscie, z lenistwa
                      'diody podłączamy do pinow0-4 portu A poprzez rezystor /poszukaj jaki/

    'konfiguracja dla przyciskow
    Config Pinb.0 = Input
    Config Pinb.1 = Input
    Config Pinb.2 = Input
    Config Pinb.3 = Input


    Set Portb.0
    Set Portb.1
    Set Portb.2
    Set Portb.3


    Declare Sub Prz1()
    Declare Sub Prz2()
    Declare Sub Prz3()
    Declare Sub Prz4()






    Do
       Waitms 50
       Call Prz1()
       Call Prz2()
       Call Prz3()
       Call Prz4()
    Loop





    Sub Prz1()
    If Pinb.0 = 0 Then
       Waitms 50
       Toggle Porta.0
       Bitwait Pinb.0 , Set
       End If
    End Sub Prz1()

    Sub Prz2()
    If Pinb.1 = 0 Then
       Waitms 50
       Toggle Porta.1
       Bitwait Pinb.1 , Set
       End If
    End Sub Prz2()

    Sub Prz3()
    If Pinb.2 = 0 Then
       Waitms 50
       Toggle Porta.2
       Bitwait Pinb.2 , Set
       End If
    End Sub Prz3()

    Sub Prz4()
    If Pinb.3 = 0 Then
       Waitms 50
       Toggle Porta.3
       Bitwait Pinb.3 , Set
       End If
    End Sub Prz4()
  • #3
    LED5W
    Level 33  
    leon1313 wrote:
    Ojojoj, dawno nie widziałem takiego kodu.

    Bez urazy, ale ten Twój - mimo, że poprawny - nie jest zbyt rozsądny. Podprogramy tworzy się tylko, gdy jakaś procedura się powtarza - tu nie ma takiej potrzeby. Przykład z SUB znajdzie w help-ie.

    Od siebie daję przykład obsługi menu przez klawiaturę. Tutaj tylko 2 przyciski (PD0, PD1).
    Code:
    Reakcja = Pind
    
    Shift Reakcja , Left , 6                                    'zostają tylko 2 bity przycisków
    If Reakcja = 192 Then
          Reset S                                               'jeżeli żaden z przycisków nie naciśnięty, odblokuj reakcję
       Else                                                     'jeżeli przycisk(i) naciśnięty(e)
          If S = 0 Then                                         'i odblokowany
             Reakcja = Reakcja + Fs                             'ustal, jaka ma być reakcja
             Disp = 0                                           'umożliw zmianę zawartości LCD
             Select Case Reakcja:                               'wykonaj
                Case 64:                                        'podświetlenie
                   Toggle Portd.2
                   Set Disp
                Case 65:                                        'w menu głównym dla S1, FS=1
                   Incr Menu                                    'kolejna pozycja
                Case 76:                                        'dla ustawiania godzin
                   Menu = 22                                    'przejdź do ustawiania minut
                Case 86:                                        'dla ustawiania minut
                   Menu = 32                                    'przejdź do resetu sekund
                Case 96:
                   Menu = 255
                Case 128:                                       'dla stanu czuwania dla S1 FS=0:
                   Incr Menu                                    'wejdź do menu
                Case 129:                                       'dla menu głównego
                   Menu = Menu + 10                             'przejdź od podmenu
                Case 140:
                   Incr Godziny
                Case 150:
                   Incr Minuty
                   If Minuty = 60 Then Minuty = 0
                Case 160:
                   Sekundy = 0
                Case Else
                   Set Disp
             End Select
             Set S                                              'zablokuj kolejną reakcję
             Czuw = 8                                           'i resetuj czas automatycznego wyjścia z menu
             End If : End If

    Działa to tak:
    -ekran główny - Menu=0,
    -1. pozycja menu - Menu=1, itd.
    -podmenu danej pozycji to liczba tej pozycji + 10, stąd
    Code:
    Menu = Menu + 10                             'przejdź od podmenu

    Oczywiście nie musi to być 10.

    Może nie jest to optymalne, ale pisałem to już dość dawno i działa dobrze. ;)
  • #4
    leon1313
    Level 14  
    LED5W wrote:
    Bez urazy, ale ten Twój - mimo, że poprawny - nie jest zbyt rozsądny. Podprogramy tworzy się tylko, gdy jakaś procedura się powtarza - tu nie ma takiej potrzeby. Przykład z SUB znajdzie w help-ie.

    To jest przykład obsługi przycisków- zresztą bardzo prosty. Wkleiłem pierwszy-lepszy, który miałem w swoim archiwum. SUBy zostały zastosowane dla zwiększenia czytelności - przy tak małym kodzie jest to bez znaczenia.
  • #5
    czajnikx
    Level 13  
    Dziękuje za pomoc ale podejrzewam że jeszcze się tu dzisiaj zgłoszę. Mianowicie ten program co zamieściłem jest częścią tylko programu który muszę napisać. Generalnie ma być to sterownik centralnego ogrzewania
    czyli temperatura pieca i bojlera. Standardowo histereza + wł/wył pompę bojlera. Więc chyba w miarę dobrze zacząłem :)
  • #6
    LED5W
    Level 33  
    leon1313 wrote:
    To jest przykład obsługi przycisków- zresztą bardzo prosty.

    Dlatego napisałem o help-ie.
  • #7
    leon1313
    Level 14  
    LED5W - ciekawe podejście do kwestii menu. Ja zwykle CASEm robiłem płaskie, przechodzenie jednym przyciskiem a wartości (zwiększ, zmniejsz) ustalałem kolejnymi dwoma. Może pokusić się o napisanie uniwersalnego menu dwu lub trzy przyciskowego?
  • #8
    LED5W
    Level 33  
    leon1313 wrote:
    LED5W - ciekawe podejście do kwestii menu.

    Trzeba tylko pamiętać, że w każdym menu musi być taka sama ilość podmenu. Chyba, że zrezygnujemy z wygodnego przejścia do podmenu, ale wtedy łatwo będzie poplątać numerki. ;)

    leon1313 wrote:
    Ja zwykle CASEm robiłem płaskie, przechodzenie jednym przyciskiem a wartości (zwiększ, zmniejsz) ustalałem kolejnymi dwoma.

    Też nad tym myślałem, ale to zajmuje więcej pamięci, której i tak mi zabrakło w Tiny2313. ;)

    leon1313 wrote:
    Może pokusić się o napisanie uniwersalnego menu dwu lub trzy przyciskowego?

    Najlepiej pokuś się o zrobienie 4-przyciskowego. Lewo - wyjdź, prawo - wejdź, góra, dół. ;)