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

Bascom, Getatkbd(), zmienna systemowa err

janbernat 21 Kwi 2010 22:20 2375 16
  • #1 21 Kwi 2010 22:20
    janbernat
    Poziom 38  

    No wydawało mi się że będzie mi stale wyświetlać "err=1" jak nic nie nacisnę.
    A wyświetla mi "err=0" jak coś nacisnę na klawiaturze.
    A jak nie nacisnę- to nic.
    chciałbym to zrobić w jakimś sub- ale jak tak- to nie wiem jak.

    Code:

    Do
    Numer_kl = Getatkbd()

       If Err = 0 Then
          Cls
          Lcd "err=0"
       Else
          Cls
          Lcd "err=1"
        End If
    Loop

    Normalnie działa- ale chcę to wyrzucić z głównej pętli- i nie wiem jak.

    0 16
  • #2 22 Kwi 2010 12:24
    grzewoj
    Poziom 26  

    Dlaczego sprawdzasz stan zmiennej Err? Powinieneś sprawdzać zmienną Numer_kl

    czyli

    Code:

    Do
    Numer_kl = Getatkbd()

       If Numer_kl = 0 Then
          Cls
          Lcd "err=0"
       Else
          Cls
          Lcd "err=1"
        End If
    Loop

    0
  • #3 22 Kwi 2010 20:48
    janbernat
    Poziom 38  

    No właściwie to powinno być tak:

    Code:

    Do
    Temp_err = Getatkbd()

       If Err = 1 Then
          Cls
          Lcd "err=1"
       Else
          Cls
          Lcd "err=0"
        End If
    Loop

    W helpie napisane jest że funkcja Getatkbd() zwraca 0 gdy nie naciśnięto żadnego klawisza.
    No i jakąś zmienną err- którą można ustawić.
    Ale dlaczego funkcja zwraca dwie zmienne- to tego nie rozumiem.
    No i czy dwie-może ktoś mi to wytłumaczy.
    Funkcje zawsze zwracają jedną zmienną.
    Wymyśliłem sobie że jak jest wciśnięty jakiś klawisz to err nie będzie =0 i w podprogramie obsłużę klawiaturę.
    A jak err=0 to pętla będzie robić swoje i nie będzie odwoływać się do sub.
    No i co to jest ustawianie err w przerwaniu- nie rozumiem.

    0
  • #4 22 Kwi 2010 20:58
    grzewoj
    Poziom 26  

    Czekaj w którym miejscu dokumentacji jest mowa o tym że ta funkcja zwraca zmienną Err, funkcja Getatkbd() zwraca zero gdy nie jest naciśnięty żaden klawisz. Jeżeli poprawnie odczyta naciśnięcie klawisza to zwraca jego kod. Jeśli jest inaczej to niech mnie ktoś poprawi.

    0
  • Pomocny post
    #5 22 Kwi 2010 21:07
    atom1477
    Poziom 43  

    Ja też nic o zmiennej Err nie widzę.

    PS. Ale ogólnie to funkcja może zwrócić dwa parametry (albo i więcej). Procedura też ;)

    0
  • Pomocny post
    #6 22 Kwi 2010 21:13
    grzewoj
    Poziom 26  

    Może nawet więcej niż dwa, chodziło mi o tą konkretną. Kolego janbernat zmodyfikuj program wg. mojej pierwszej propozycji.

    Dodano po 4 [minuty]:

    Już wiem, zmienna Err jest tworzona automatycznie przez kompilator, można ją wykorzystać np. w funkcji Inkey(). Nie wiem czy działa też w przypadku Getatkbd(), ale w przykładowych programach z dokumentacji nie ma takiego zastosowania.

    0
  • #7 22 Kwi 2010 21:52
    janbernat
    Poziom 38  

    No to jest tak:
    Program działa dobrze.
    Jak jest normalnie napisany.
    Tak że chodzi mi o zupełnie inną modyfikację.
    Ale wpadłem na pomysł- może głupi- że jak zbadam w pętli głównej że żaden klawisz nie jest naciśnięty to dostanę err=0 i pętla swoje będzie robić.
    A jak nie- to przejdzie do podprogramu obsługi klawiatury.
    No i z tym nie daję sobie rady.
    Ten err jest opisany w helpie by zbeegin w "funkcja getatkbd()" -ale tak że nie rozumiem.
    W bascomie w declare jest tylko jedna wartość zwracana.
    W C też.
    O tym że w C z funkcji można "wyciągnąć" więcej wartości zwracanych jest- ale w następnym rozdziale książki- chyba przez wskaźniki.
    W helpie jest napisane że funkcja oczekuje na naciśnięcie klawisza i że można tę pętlę przerwać przez ustawienie err.
    No jak oczekuje- to czy wchodzi w "pustą" pętlę?

    0
  • Pomocny post
    #8 22 Kwi 2010 22:13
    grzewoj
    Poziom 26  

    Wystarczy sprawdzić czy funkcja Getatkbd() zwraca 0 wtedy żaden klawisz nie jest naciśnięty. Warunek można więc skonstruować tak, że gdy zmienna do której zwracana jest wartość funkcji Getatkbd() jest większa od zera to robimy obsługę klawiatury, a jeśli nie program normalnie kręci się w pętli. Wciąż nie rozumiem czemu tak uparcie chcesz do tego wykorzystywać zmienną Err :-)

    0
  • #9 22 Kwi 2010 22:25
    janbernat
    Poziom 38  

    No masz rację.
    Ale err wykorzystywałem w instrukcjach I2C i było dobrze.

    0
  • #10 24 Kwi 2010 09:58
    janbernat
    Poziom 38  

    No i jest niestety tak jak się obawiałem.

    Code:

    Do

      Kod_kl = Getatkbd()         'odczytanie danej z klawiatury
       If Kod_kl <> 0 Then
         Gosub Klawiatura
       End If

       Toggle Portb.2

    Loop
    End

    Klawiatura:

    If Kod_kl > 0 Then           'jeśli odczytany kod ma wartość większa niż 0, to
      If Kod_kl > 31 And Kod_kl < 127 Then       'jeśli Kod_kl jest > od 31 oraz mniejszy od 127, to
       Lcd Chr(kod_kl)            'wyświetlenie na LCD kodu znaku o kodzie ASCII zawartym w Kod_kl
      End If
      If Kod_kl = 44 Then         'jeśli Kod_kl = 44 (klawisz Del) to
       Cls
      End If
      If Kod_kl = 13 Then         'jeśli Kod_kl = 13 (klawisz Enter), to
       Lowerline                  'przeniesienie kursora do drugiej linii wyświetlacza LCD
      End If
     End If
    Return


    Code:
    Getatkbd()

    Czeka na naciśnięcie klawisza i zatrzymuje pętlę.
    Wstawiłem Toggle i zmienia się nie w takt pętli tylko po naciśnięciu klawisza.
    Pozornie wszystko działa- ale tylko obsługuje klawiaturę i nic więcej nie robi.
    Z helpa:
    "The Getatkbd function will wait for a pressed key. When you want to escape from the waiting loop you can set the ERR bit from an interrupt routine for example."
    Część rozumiem.
    Ale z jakiego przerwania?

    0
  • Pomocny post
    #12 26 Kwi 2010 08:53
    atom1477
    Poziom 43  

    Chodzi o dowolne przerwanie.
    Ale najlepiej oczywiście wykorzystać przerwanie od jakiegoś Timera.

    0
  • #13 26 Kwi 2010 20:12
    janbernat
    Poziom 38  

    No może w tym przypadku jakoś sobie poradzę.

    Code:

    sei
    Enable Urxc
    On Urxc Odb_znaku

    Do

      Kod_kl = Getatkbd()         'odczytanie danej z klawiatury
       If Kod_kl <> 0 Then
         Gosub Klawiatura
         Printbin 144;            '144
       End If

       Toggle Portb.2

    Loop
    End

    Klawiatura:
     If Kod_kl > 0 Then           'jeśli odczytany kod ma wartość większa niż 0, to
         If Kod_kl > 31 And Kod_kl < 127 Then       'jeśli Kod_kl jest > od 31 oraz mniejszy od 127, to
          Lcd Chr(kod_kl)         'wyświetlenie na LCD kodu znaku o kodzie ASCII zawartym w Kod_kl
         End If
       If Kod_kl = 44 Then        'jeśli Kod_kl = 44 (klawisz Del) to
          Cls
       End If
       If Kod_kl = 13 Then        'jeśli Kod_kl = 13 (klawisz Enter), to
          Lowerline               'przeniesienie kursora do drugiej linii wyświetlacza LCD
       End If
     End If
    Return

    Odb_znaku:
      Inputbin Odebrane

      Lcd Odebrane

    Return

    Robię młodemu jakieś MIDI- o którym to wiadomości mam mętne.
    Polutowałem płytkę i zamiast zrobić normalną klawiaturkę 4x4 zrobiłem odczyt zwykłej klawiatury przez Getatkbd.
    Wszystko przez to że znalazłem gniazdo do wpięcia klawiatury pasujące do wlutowania w płytkę- no to nie chciało mi się tworzyć albo szukać innej klawiatury.
    No i trzy gniazda do DIN5- chyba sprzed 35lat.
    No i to wysyła niezrozumiałe dla mnie sygnały i program w PC to odbiera.
    Tak że w tym szczególnym przypadku- chyba da się.
    Ale gdyby to miało być inaczej- z Timerem- powiedzmy co 40ms- to gdzie wstawić err=1 i gdzie skasować.

    0
  • Pomocny post
    #14 26 Kwi 2010 20:52
    atom1477
    Poziom 43  

    Err = 1 wstawiasz w obsłudze przerwania od Timera.
    A Err = 0 nigdzie ;)

    0
  • #15 26 Kwi 2010 21:34
    janbernat
    Poziom 38  

    W dodatku odbiera dane z jakiejś klawiatury z MIDI.
    A już myślałem że z tym odbiorem to się narobię.
    Na zwykłym CNY17-3 odbiera.
    Tylko ten kabel jest jakiś chiński.
    Ale ad meritum.
    To tak- co np. 40ms wywołuję przerwanie od Timera.
    Wstawiam err=1.
    Jak err=1 to pomija mi Getatkbd().
    Aż do ponownego przerwania.
    A pomiędzy- czyta.
    Czy tak?
    Czy mam wstawić if err=1 then?
    Sprawdzę- nie denerwujcie się.
    Ale teraz to uczę się MIDI.

    0
  • Pomocny post
    #16 26 Kwi 2010 22:37
    atom1477
    Poziom 43  

    Wystarczy Err = 1.
    Getatkbd samo wyzeruje zmienną Err jak zobaczy że jest ona równa 1.
    No i oczywiście na tym zakończy swoje działanie.

    1
  • #17 29 Cze 2010 19:37
    janbernat
    Poziom 38  

    No to problem został.
    W obsłudze MIDI nie przeszkadza.
    Ale jak to rozwiązać z wykorzystaniem Err- nie wiem.

    0