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.

Attinny i klawiatura. Poprawny program? Jak to zrobić inaczej?

vain 24 Lis 2006 11:44 1421 14
  • #1 24 Lis 2006 11:44
    vain
    Poziom 13  

    Witam,

    Napisalem sobie taki program:

    $regfile = "attiny2313.dat"
    $crystal = 8000000
    $baud = 19200


    Config Serialout = Buffered , Size = 10
    Config Portb = &B00101010
    Portb = &B00101010

    Dim K As String * 1
    Dim B As String * 1




    Getkey:
    Do
    Disable Interrupts

    If Pinb.2 = 1 And Pinb.3 = 1 Then
    Reset Pinb.2
    If K <> "" And B <> "" Then
    Gosub Getkey
    Elseif K <> "" Then
    B = "1"
    Else
    K = "1"
    End If


    Elseif Pinb.2 = 1 And Pinb.1 = 1 Then
    Reset Pinb.2
    If K <> "" And B <> "" Then
    Gosub Getkey
    Elseif K <> "" Then
    B = "2"
    Else
    K = "2"
    End If


    Elseif Pinb.2 = 1 And Pinb.5 = 1 Then
    Reset Pinb.2
    If K <> "" And B <> "" Then
    Gosub Getkey
    Elseif K <> "" Then
    B = "3"
    Else
    K = "3"
    End If


    Elseif Pinb.7 = 1 And Pinb.3 = 1 Then
    Reset Pinb.7
    If K <> "" And B <> "" Then
    Gosub Getkey
    Elseif K <> "" Then
    B = "4"
    Else
    K = "4"
    End If


    Elseif Pinb.7 = 1 And Pinb.1 = 1 Then
    Reset Pinb.7
    If K <> "" And B <> "" Then
    Gosub Getkey
    Elseif K <> "" Then
    B = "5"
    Else
    K = "5"
    End If


    Elseif Pinb.7 = 1 And Pinb.5 = 1 Then
    Reset Pinb.7
    If K <> "" And B <> "" Then
    Gosub Getkey
    Elseif K <> "" Then
    B = "6"
    Else
    K = "6"
    End If


    Elseif Pinb.6 = 1 And Pinb.3 = 1 Then
    Reset Pinb.6
    If K <> "" And B <> "" Then
    Gosub Getkey
    Elseif K <> "" Then
    B = "7"
    Else
    K = "7"
    End If


    Elseif Pinb.6 = 1 And Pinb.1 = 1 Then
    Reset Pinb.6
    If K <> "" And B <> "" Then
    Gosub Getkey
    Elseif K <> "" Then
    B = "8"
    Else
    K = "8"
    End If


    Elseif Pinb.6 = 1 And Pinb.5 = 1 Then
    Reset Pinb.6
    If K <> "" And B <> "" Then
    Gosub Getkey
    Elseif K <> "" Then
    B = "9"
    Else
    K = "9"
    End If


    Elseif Pinb.4 = 1 And Pinb.3 = 1 Then
    Reset Pinb.4
    If K <> "" And B <> "" Then
    Gosub Getkey
    Elseif K <> "" Then
    B = "0"
    Else
    K = "0"
    End If


    Elseif Pinb.4 = 1 And Pinb.1 = 1 Then '* kasowanie znaku
    Reset Pinb.4
    If B <> "" Then
    B = ""
    Else
    K = ""
    End If


    Elseif Pinb.4 = 1 And Pinb.5 = 1 Then '# - wybranie numeru
    Reset Pinb.4
    If K = "" And B = "" Then
    Gosub Getkey
    Else
    Exit Do
    End If

    End If
    Loop


    Enable Interrupts

    Do
    Printbin K ; B
    Loop Until _rs_head_ptrw0 = _rs_tail_ptrw0

    K = ""
    B = ""

    Gosub Getkey


    End



    Czy moglby mi ktos powiedziec czy jest on teoretycznie i praktycznie poprawny jesli chodzi o dzialanie i jak mozaby go skrocic? Ewentualnie zrobic cos podobnego innym sposobem ?

    PS. Testowalem ten program na plytce testowej, nie dziala tak jak powinien: jak tylko wgram program wypisuje "1", jak wykasuje identyfikacje 1 to 2 i tak dalej? Ma ktos pomysl dlaczego?

    0 14
  • #2 24 Lis 2006 16:18
    JacekCz
    Poziom 36  

    vain napisał:
    Witam,

    Czy moglby mi ktos powiedziec czy jest on teoretycznie i praktycznie poprawny jesli chodzi o dzialanie i jak mozaby go skrocic? Ewentualnie zrobic cos podobnego innym sposobem ?

    PS. Testowalem ten program na plytce testowej, nie dziala tak jak powinien: jak tylko wgram program wypisuje "1", jak wykasuje identyfikacje 1 to 2 i tak dalej? Ma ktos pomysl dlaczego?


    Program poprawny czyli zgodny ze specyfikacją.
    Podaj specyfikację.
    Jakiego działania się spodziewasz po nim i co mamy niby ocenić?

    0
  • #3 24 Lis 2006 16:59
    vain
    Poziom 13  

    "program zgodny ze specyfikacja. podaj specyfikacje." ??


    Program ma za zadanie odczytyanie znakow z klawiatury w sposob wynikajacy z programu (podam jak by ktos mial problem z odczytaniem z programu):

    jeżeli pinb.xn =1 i pinb.xm =1 to
    jeżeli K nierowna sie "" (czyli nie puste) i b<> "" (nie puste) to
    jezeli K <> "" to
    b="klawisz"
    inaczej
    K="klawisz"


    jezeli klawisz * to kasuje znak
    jezeli klawisz # K i B puste to wroc do petli
    inaczej wyskocz z petli

    przechodzi do nastepnej
    wysyla K i B

    kasuje K i B

    wraca do pierwszej petli.

    btw. nie dziala w tak

    zachowuje sie jak by na wszystkich pinach byl stan wysoki.

    po zgraniu na uP odrazu wysyla 1

    Pomoze mi ktos?

    0
  • Pomocny post
    #4 24 Lis 2006 17:53
    zumek
    Poziom 39  

    vain napisał:
    ...Napisalem sobie taki program:

    To go szybko usuń z dysku i zapomnij że wogóle takie coś napisałeś :(
    vain napisał:

    Code:

    Config Portb = &B00101010
    Portb = &B00101010

    Dim K As String * 1
    Dim B As String * 1

    Getkey:
    Do
    Disable Interrupts

    If Pinb.2 = 1 And Pinb.3 = 1 Then

    Po co sprawdzasz czy Pinb.3=1 , skoro sam ustawiłeś na nim wysoki stan :?:
    I dalej.Pinb.2 ustawiłeś w stan wysokiej impedancji , więc w momencie kiedy nie jest naciśnięty klawisz , króry wymusi na nim stan wysoki , to stan jaki z niego odczytasz jest loterią :(
    vain napisał:

    Code:

       Reset Pinb.2

    Rejestr Pinx , służy wyłącznie do odczytu :(
    I na sam koniec pytanie:
    Wiesz co to jest rekurencja :?:
    Jeśli nie wiesz , to jej nie stosuj , czyli nie wywołuj funkcji/procedury przez samą siebie.
    Code:

    Getkey:
     ^   Do
     |    Disable Interrupts
     |
     |    If Pinb.2 = 1 And Pinb.3 = 1 Then
     |    Reset Pinb.2
     |    If K <> "" And B <> "" Then
      <- Gosub Getkey
    ...

    Przemyśl to na spokojnie i spróbuj jeszcze raz :D

    Piotrek

    0
  • #5 24 Lis 2006 19:05
    vain
    Poziom 13  

    Przemyslalem i masz racje, a tym gosubem to strasznie przegiolem.

    Teoretycznie ( bo na symulatorze) ten program dziala dobrze.

    Masz moze jakis pomysl jak cos takiego zrobic zeby dzialalo?

    Prosze o jakies wskazowki.

    Tez Piotrek ;)

    0
  • #6 24 Lis 2006 19:27
    zumek
    Poziom 39  

    vain napisał:
    ...Masz moze jakis pomysl jak cos takiego zrobic zeby dzialalo?
    Prosze o jakies wskazowki.
    Tez Piotrek ;)

    Wydumałem sobie , że Twoja klawiatura jest typu telefonicznego , matrycowa , o 3 rzędach i 4 kolumnach lub na odwrót :D
    https://www.elektroda.pl/rtvforum/viewtopic.php?p=1055982#1055982
    Zanim zacznę podpowiadać , powiedz czy ona musi być podpięta tak jak jest , czy można to zmienić :?:

    Piotrek

    0
  • #7 24 Lis 2006 20:03
    vain
    Poziom 13  

    Jestem otwarty na propozycje.


    Klawaitura ma 7 wyjsc (jak to w klawiaturze 3x4 ;) )
    Dzialanie:

    1 - 3,5
    2 - 3,6
    3 - 3,7
    4 - 2,5
    5 - 2,6
    6 - 2,7
    7 - 1,5
    9 - 1,7
    8 - 1,6
    * - 4,5
    0 - 4,6
    # - 4,7

    Znak - wyjscia

    0
  • #8 25 Lis 2006 08:38
    vain
    Poziom 13  

    Znalazlem tam Twoj program keybforyou, tylko nie do konca go rozumie.
    Mogbys mi go objasnic?
    Jak jest klawiatura podpieta?

    0
  • #9 25 Lis 2006 10:14
    JacekCz
    Poziom 36  

    vain napisał:
    "program zgodny ze specyfikacja. podaj specyfikacje." ??


    Program ma za zadanie odczytyanie znakow z klawiatury w sposob wynikajacy z programu (podam jak by ktos mial problem z odczytaniem z programu):

    Pomoze mi ktos?


    Definicja konia: Koń jaki jest każdy widzi.

    Zapłątałeś się bo nie miałeś z góry zaplanowanego opisu programu (dumnie zwaną specyfikacji). Siada się wtedy, leeeeeci myśl gdzie chce. Ustawiasz niepotrzebne ci bity, zapomnisz o potrzebnych itd.
    Myślę ze narysowanie sobie bitów portów na kartce PRZED pierwszą linijką kodu, wypunktowanie sobie czynności itd.

    Ty nie rozumiesz swojego programu, kolega vain tez pisze że nie rozumie.

    0
  • #10 25 Lis 2006 10:26
    vain
    Poziom 13  

    Moze i tak, ale...

    Problem w tym ze nie wiedzialem (jeszcze do wczoraj) jak dziala portd pind itd...
    ucze sie na bledach i prosze o pomoc..

    PS. Symulator BASCOMA wprowadzil mnie w blad.

    0
  • Pomocny post
    #11 25 Lis 2006 20:52
    zumek
    Poziom 39  

    W wolnej chwili skrobnąłem "uniwersalną" procedurkę do czytanie matrycy 3x4 , a po drobnej przeróbce , może być nawet 8x8 :D
    Warunki jakie musi spełniać połączenie klawiaturki z uC , to:
    a)Wyprowadzenia rzędów oraz kolumn , muszą zajmować kolejne(sąsiadujące) bity na porcie.Rzędy i kolumny , mogą być podłączone do tego samego portu , lub rzędy na innym i kolumny na innym porcie , byle był spełniony warunek "a".
    Np. kolumny porta.0-porta.2 , a rzędy portd.3-portd.6.Ma się rozumieć , że liczby w pętlach for,nazw(y)ę port(ów)u , oraz kolejność znaków w linii data , należy przystosować do połączeń.
    Wprawdzie nie testowałem tego "na żywo" , ale mam nadzieję , że toto będzie działać :D Procedura jest przystosowana , do schematu pod kodem.

    Code:

    Ddrb = &B000000       'cały portb=wejście
    Portb = &B11110000       'bity 4-7 - włącz pull-up'y

    Dim Row As Byte , Col As Byte , Tmpr1 As Byte , Tmpr2 As Byte

    Do
    Gosub Scankey
    If Tmpr1 >12  Then Print Chr(tmpr1)
    Loop


    Scankey:

    Tmpr1 = 12
    For Col = 1 To 3
       Set Ddrb.col
       For Row = 4 To 7
          If Pinb.row = 0 Then
             Tmpr1 = Col - 1
             Shift Tmpr1 , Left , 2
             Tmpr2 = Row - 4
             Tmpr1 = Tmpr1 + Tmpr2
             Exit For
          End If
       Next
    Ddrb = Ddrb And &B11110001
    If Tmpr1 < 12 Then
       Tmpr1 = Lookup(tmpr1 , Znaki0)
       Exit For
    End If
    Next

    Return

    Znaki0:
    Data "147*2580369#"


    '  1---2---3--PB4
    '  |   |   |
    '  4---5---6--PB5
    '  |   |   |
    '  7---8---9--PB6
    '  |   |   |
    '  *---0---#--PB7
    '  |   |   |
    ' PB1 PB2 PB3



    Piotrek
    EDIT: Poprawiłem to co trza :D

    0
  • #12 27 Lis 2006 18:28
    vain
    Poziom 13  

    dzieki za kod, ale jakos dziwnie dziala, odrazu wysyla 1 nie wiedziec dlaczego hmmm
    nie ukrywam, ze Twoj kod to troche czarna magia dla mnie...

    0
  • Pomocny post
    #13 27 Lis 2006 18:48
    zumek
    Poziom 39  

    vain napisał:
    dzieki za kod, ale jakos dziwnie dziala, odrazu wysyla 1 nie wiedziec dlaczego hmmm
    nie ukrywam, ze Twoj kod to troche czarna magia dla mnie...

    Mówisz o procku , czy symulatorze :?:

    Piotrek

    EDIT:
    Faktycznie , w 1-szej linii procedury Scankey jest Tmpr2=12 , a powinno być Tmpr1=12 :(

    Piotrek

    0
  • #14 27 Lis 2006 21:43
    vain
    Poziom 13  

    zumek napisał:
    vain napisał:
    dzieki za kod, ale jakos dziwnie dziala, odrazu wysyla 1 nie wiedziec dlaczego hmmm
    nie ukrywam, ze Twoj kod to troche czarna magia dla mnie...

    Mówisz o procku , czy symulatorze :?:

    Piotrek


    O procesorze. Dopsialem do Twjego kodu konfiguracje serialouta napisalem odbiornik, ktory zapisuje odebrany znak do epromu. Procesory sa na plytkach testowych wiec moge zczytac eprom. Faktem jest ze robilem to w pospiechu, po 20 bede to testowal bardziej szczegolowo.

    Dodano po 2 [godziny] 39 [minuty]:

    zumek napisał:
    vain napisał:
    dzieki za kod, ale jakos dziwnie dziala, odrazu wysyla 1 nie wiedziec dlaczego hmmm
    nie ukrywam, ze Twoj kod to troche czarna magia dla mnie...

    Mówisz o procku , czy symulatorze :?:

    Piotrek

    EDIT:
    Faktycznie , w 1-szej linii procedury Scankey jest Tmpr2=12 , a powinno być Tmpr1=12 :(

    Piotrek



    Wielkie dzieki!!! Dziala idealnie.

    Pozdrawiam

    0
  • #15 29 Lis 2006 19:20
    vain
    Poziom 13  

    Witam ponownie,

    Moglbys mi podpowiedziec jak zrobic zeby program ten czekal az wcisniety klawisz zostanie puszczony?

    Dopisalem do tego tablice zbierajaca wciskane znaki i wypelnia mi ja jednym przycisnietym klawiszem. Wait waitms niebardzo zdaje egzamin.

    0