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

[attiny2313][Bascom]Odczyt kilku 4pinów z jednego portu.Jak?

Sebastian.R 20 Kwi 2010 09:49 2660 7
REKLAMA
  • #1 7982177
    Sebastian.R
    Poziom 20  
    Witam!
    Mam problem z odczytem klawiatury. Tak jak na zamieszczonym schemacie mam podłączonych 15 klawiszy do ponad połowy pinów portu PB w Attiny2313. Połączone są one za pomocą dekodera 1z15 na BCD (zrobionego z kilku 1n4148).Czyli naciskając pierwszy zwiera nam PB.0 do masy , drugi zwiera PB.1 , trzeci - PB.0 i PB.1, czwarty tylko PB.2 itd. Reasumując na PB.0 - PB.4 otrzymuję od 00001 do 11111 . Teraz jak to mam odczytać do jednej zmiennej?
    Gdy dam zmienna = PinB czy PortB to wywala mi w LCD zmienna jakieś głupoty . Po naciśnięciu 15ego klawisza odczyt jakby się blokował.
    Pytanie pierwsze : jaką zmienną mam zadeklarować?
    Pytanie drugie : jak zastosować select case w tym przypadku?
    Jak odczytać ten port by zmienna wynikowa miała postać hex (albo BCD) ?
    [attiny2313][Bascom]Odczyt kilku 4pinów z jednego portu.Jak?
  • REKLAMA
  • Pomocny post
    #2 7982243
    korrus666
    Poziom 40  
    Odczytać musisz cały port B a potem zerować 3 najstarsze bity bo one mogą powodować zamieszanie. Zmienna oczywiście bajtowa. porównujesz potem zmienną z konkretnymi wartościami. Czyli masz 16 warunków sprawdzających jaki klawisz został wciśnięty.
  • REKLAMA
  • Pomocny post
    #3 7982478
    sylwunia35
    Poziom 18  
    W jakiejś zmiennej odczytujesz 5 bitów
    Np:
    A As bite
    Do
    A=PINB AND 31
    Print A
    IF A=coś Then
    coś dalsze decyzje
    loop
    Pozdrawiam
  • #4 7983333
    Sebastian.R
    Poziom 20  
    Szukałem i zadziwiło mnie że wszędzie opisany jest sposób odczytu jednego klawisza albo zaraz całej klawiatury matrycowej. Moja jest tego 3 rodzaju - poprzez dekoder 1z15 na BCD.
    Poczytałem nieco helpa plus Wasze wskazówki (za które niezmiernie jestem wdzięczny) i zmieniłem nieco to co wcześniej napisałem w załączniku wyżej.
    
                   '************* Konfiguracja uC *****************
    '***********************************************
    $regfile = "Attiny2313.dat"
    $crystal = 4000000
     Config Portd = Output
     Config Lcd = 16 * 2
     Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.1 , Db6 = Portd.5 , Db7 = Portd.4 , E = Portd.0 , Rs = Portd.6
     Cursor Off                                                 'wyłączenie kursora
     Config Portb = Input
     Set Pinb.0
     Set Pinb.1
     Set Pinb.2
     Set Pinb.3
     Set Pinb.4
     Set Pinb.5
    
     Dim K As Byte
     Dim K1 As Byte
    Cls : Upperline : Lcd " WITAM !" : Waitms 100 : Cls         'powitanie
    
    Do                                                          'program główny - pętla
       Upperline :
       Lcd "Klawisz:"
       Lowerline :
        If Pinb.0 = 0 Then
         K1 = Pinb And 31
         K = K1 - 14
       End If
        If Pinb.1 = 0 Then
         K1 = Pinb And 31
         K = K1 - 14
       End If
        If Pinb.2 = 0 Then
         K1 = Pinb And 31
         K = K1 - 14
       End If
        If Pinb.3 = 0 Then
        K1 = Pinb And 31
        K = K1 - 14
       End If
        If Pinb.4 = 0 Then
        K1 = Pinb And 31
        K = K1 - 14
       End If
        If Pinb.5 = 0 Then
        K1 = Pinb And 31
        K = K1 - 14
        End If
    
        Lcd K
        Waitms 100
    
       Locate 2 , 1 : Lcd "                "
    
       Loop                                                     'koniec pętli głównej programu
    
    End 

    .... I teraz zależy mi ,by odczyt klawisza nie "zatrzymywał się" pokazując ostatni wciśnięty lecz powracał do "0".
    Gdzie wcisnąć zerowanie portu?
    Dzięki za odpowiedzi :D Pozdrawiam
  • #5 7983527
    sylwunia35
    Poziom 18  
    Moim zdaniem troszkę to jest nie tak
    do
    K1 = Pinb And 31
    sprawdzenie
    loop
    użyj tylko raz K1=...
    i sprawdzaj klawisze i jeśli puścisz masz zawsze 31 więc napisz IF K1=>31 then K1=0
    Chyba tak ja to robiłem.
  • REKLAMA
  • #6 7984273
    Sebastian.R
    Poziom 20  
    wiecie co ... po ostatnim End If wsadziłem :
    Lcd K ; "to" ; Hex(k)
    Waitms 100
    
    Locate 2 , 1 : Lcd "                "
    K = 0

    i to wystarczyło :) . Teraz po jednym odczycie klawiszy K wraca do stanu początkowego czyli zera.
    Jeszcze jedno pytanie :
    Czy jest możliwe korzystać z tego portu tak by odczytać/zapisać układ 24cXX za pomocą :
    I2CSTART
    I2CSTOP
    I2CRBYTE
    I2CWBYTE ?
    Bo jeśli korzystam z części portu to czy muszę go "uwolnić" spod klawiatury?
    Znaczy , naprzemiennie korzystać z tego portu jako klawiatury i programatora odczyt/zapis pamięci 24cXX ?? Pozdro i czekam na odpowiedź.
  • REKLAMA
  • Pomocny post
    #7 7985704
    sylwunia35
    Poziom 18  
    Według mnie musisz na początku podprogramu z obsługą I2C dać Config Scl = PORTB.X i SDA a na końcu obsługi I2C przestawić jako wejścia ale przecież Attiny ma swoją pamięć eprom.
  • #8 7986467
    Sebastian.R
    Poziom 20  
    Jeszcze wracając do poprzedniego pytania o sczytywanie z klawiatury to w końcu zajarzyłem że niezbyt dobrze napisałem , więc poprawiłem na :
    $regfile = "Attiny2313.dat"
    $crystal = 4000000
    Config Portd = Output
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.1 , Db6 = Portd.5 , Db7 = Portd.4 , E = Portd.0 , Rs = Portd.6
    Cursor Off                                                  'wyłączenie kursora
    Config Portb = Input
    Set Pinb.0                                                  'porty
    Set Pinb.1
    Set Pinb.2                                                  'podciągamy rezystorki
    Set Pinb.3
    Set Pinb.4
    Dim K As Byte
    Dim K1 As Byte
    Cls : Upperline : Lcd " WITAM !" : Waitms 100               'powitanie
    Upperline :
    Lcd "Klawisz:"
    Do
    K1 = Pinb And 31                                            'Porównanie portu
    K = 31 - K1                                                 'gdzie klawisz "0" ?
    Lowerline :
    Lcd K
    Waitms 100
    K1 = 31
    Loop                                                        'koniec pętli głównej programu
    End
    

    Dodatkowo jeśli zamienimy od DO do Loop na
    
    Do
    K1 = Pinb And 31                                            'Porównanie portu
    K = 127 - K1                                                'gdzie te literki ?
    Lowerline :
    Lcd Chr(k)
    Waitms 100
    K1 = 98
    Loop 

    to otrzymamy dekoder znaków które się wyświetlają po kolei (w takiej kolejności jak klawisze) . Myślę że to istotne rozwiązanie dla tych co robią urządzenie "Piórnik". Kto by chciał tachać ze sobą klawiaturę :D ?
    Myślę że temat wyczerpany i mogę go zamknąć chyba że jeszcze jakieś (EXTRA) wskazówki - za które dziękuję Wam. Poczekam , jeśli nikt już nic tu nie napisze to zamknę temacik. Otworze nowy co do tego współdzielenia portu między klawiaturę a SCL/SDA dla I2C - 24cXX. Zanim to zrobię posiedzę nieco przy helpie do BASCOMa. Pozdro
    A to moje dzieło nad którym "siedzę" :
    [attiny2313][Bascom]Odczyt kilku 4pinów z jednego portu.Jak?



    ----------------------------------------------------------------------
    OK . Temat zamykam i dziękuję za odpowiedzi.Były pomocne.
REKLAMA