Teade

Collapse

Foorumi reeglid.

Foorumi reeglistik on uuendatud. Palume tutvuda ja arvesse võtta.
See more
See less

4x3 matrix klahvi tuvastus

Collapse
X
 
  • Filter
  • Kellaaeg
  • Show
Clear All
new posts

    4x3 matrix klahvi tuvastus

    Tere.
    Üritan PIC16F877A-le selgeks teha 4x3 matrix klaviatuuri nuppe, et ta täidaks eri nuppude vajutamisel erinevaid ülessandeid. Soov on teha menüü süsteem mille vahel saab erinevate nuppudega liikuda.
    Proovin asja lahendada STATUS, Z lipu jälgimisega. Koodis loetakse nupp(ASCII koodile vastav) W-sse, siis lahutatakse arvatav väärtus (näit. SUBLW 0x23 ;#).Järgmisena kontrollin lipu olemasolu BTFSC STATUS, Z. Kui vastus oli 0 , siis Z=1 ja täidetakse järgmine käsk.
    Miskil põhjusel mul asi ei toimi. Nupu lugemis kood töötab ja nupu väärtused õiged.

    Küsiksin targematelt kuidas oleks kõige parem teostada nupu kontroll.
    Millist varjanti olete ise kasutanud?

    Tänud.

    #2
    Ehk saab kood mitu vajutust korrraga (lahti laskmisel samuti)? Sa ikka '"debounce" tegid?
    - Vend Hieronymus tunneb Motorola toodete nimekirja kõige paremini, las tema ütleb.
    - Motorola poolt loodud kiipide hulgas ei ole teda üles tähendatud. - Tähendab: ta on Intelist!

    Comment


      #3
      täiesti OT , aga kas Teil kunagi IOdest puudus ei ole tulnud ? siin on taibukas lahendus :
      http://www.mikerj.clara.net/keypad.html

      Comment


        #4
        Ei õnnestu ikka asja käima saada. Kood on selline:

        ;******** Menüü ***************
        meny call LCDCLEAR ; LCD puhtaks
        call LCDHOME ;LCD koju
        movlw 0x00
        call LCD_MENY ;Kiri LCD-le
        call LCD_Line2 ;LCD 2 rida
        movlw 0x00
        call LCD_MENY1 ;Kiri LCD-le
        call Delay50 ;viide 50ms
        movlw 0x00
        movwf key ;key väärtus 0-li
        meny1
        call Chk_Keys ;nupu lugemine, salvestatakse key-sse
        bcf STATUS, Z ;igaks juhuks Z=0
        movlw 0x23
        subwf key, 0 ;lahutab W-st key (nupp#)
        btfsc STATUS, Z ; kui vastus =0, siis täidab järgmise käsu
        goto Main_prog ; Z=1, läheb põhiprogrammi
        movlw 0x31
        subwf key, 0 ;lahutab W-st key(nupp1)
        btfsc STATUS, Z
        goto Kiirus ;valime erineva kiiruse

        movlw 0x32
        subwf key, 0 ;lahutab W-st key(nupp2)
        btfsc STATUS, Z
        goto Pesa ;muudame pesa väärtust

        movlw 0x33
        subwf key, 0 ;lahutab W-st key(nupp3)
        btfsc STATUS, Z
        goto max_pesa ;valime mitu pesa on
        nop
        goto meny1 ;kui ei ole tuvastatud, teeme uuesti

        Nuppude lugemine töötab, proovisin kuvada LCD-le numbreid, iga nupp annab oma ASCII koodi väärtuse.
        Miskil põhjusel aga sellest kohast edasi ei saa, järgmisesse alam menüüsse.

        Ei tea kas sellest koodist piisab või panen kogu projekti kuskile üles?
        Katsetanud mitut moodi, kuid tulemuseta

        Comment


          #5
          Huuvitav, mul simulaatoris töötas täpselt nii nagu peab....
          Kas peale "call chk_keys" on klahvi kood kindlasti õige, mingi katkestusproge ei solgi registrit ära?
          - Vend Hieronymus tunneb Motorola toodete nimekirja kõige paremini, las tema ütleb.
          - Motorola poolt loodud kiipide hulgas ei ole teda üles tähendatud. - Tähendab: ta on Intelist!

          Comment


            #6
            Ise kahtlustan ka, et nupu vajutus ei ole õige. Nupu lugemis kood:
            ;****** Nuppude lugemine********************
            Chk_Keys bcf STATUS, Z
            movlw 0x00 ;wait until no key pressed
            movwf KEY_PORT ;set all output pins low
            movf KEY_PORT, W
            andlw 0xF0 ;mask off high byte
            sublw 0xF0
            btfsc STATUS, Z ;test if any key pressed
            goto Keys ;if none, read keys
            call Delay20
            goto Chk_Keys ;else try again

            Keys call Scan_Keys
            movlw 0x10 ;check for no key pressed
            subwf key, w
            btfss STATUS, Z
            goto Key_Found
            call Delay20
            goto Keys
            Key_Found movf key, w
            andlw 0xF0
            call Key_Table ;lookup key in table
            movwf key ;save back in key

            return ;key pressed now in W

            Scan_Keys clrf key
            movlw 0x0F ;set all output lines high
            movwf KEY_PORT
            movlw 0x04
            movwf rows ;set number of rows
            bcf STATUS, C ;put a 0 into carry
            Scan rrf KEY_PORT, f
            bsf STATUS, C ;follow the zero with ones
            ;comment out next two lines for 4x3 numeric keypad.
            btfss KEY_PORT, Col4
            goto Press
            incf key, f
            btfss KEY_PORT, Col3
            goto Press
            incf key, f
            btfss KEY_PORT, Col2
            goto Press
            incf key, f
            btfss KEY_PORT, Col1
            goto Press
            incf key, f
            decfsz rows, f
            goto Scan
            Press return

            Key_Table ADDWF PCL, f
            RETLW 0x33 ;
            RETLW 0x32 ;
            RETLW 0x31 ;
            RETLW 0x30 ;
            RETLW 0x23 ;#
            RETLW 0x2A ;*
            RETLW 0x39 ;9
            RETLW 0x38 ;8
            RETLW 0x37 ;7
            RETLW 0x36 ;6
            RETLW 0x35 ;5
            RETLW 0x34 ;4
            RETLW 0x33 ;3
            RETLW 0x32 ;2
            RETLW 0x31 ;1
            RETLW 0x30 ;0
            Katkestusi ei kasuta. PORTB, 7(ehk Col4) ei kasuta, seda kasutan põhiprogrammist menüüsse minekuks.Miskit vale BANK värki ka ei saa olla, kogu programm mahub BANK0 ära
            Tänud kaasamõtlejatele

            Comment


              #7
              SElle testimiseks peab klaver PICi taga olema, ei viitci hetkel ehitada. Esmapilgul koodis vigu ei näinud. Proovi saata klahvi kood kontrolliks serial porti (movwf TXREG). Väga hea debugimise meetod ja ei riku ühtegi registrit (peale TXREGi muidugi).
              Seriali init: @4MHz ja 9600,n,8,1 , PIC16F628
              Kood:
              ;===============================================================================
              ; ******* seriali lisa-initsialiseerimine *******
              ;===============================================================================
              init_ser:  bcf  INTCON,GIE
                  bsf  pank  
                  movlw	.25    ; baudrate = 9600
                  movwf	SPBRG  
                  movlw	B'00100110'
                  movwf	TXSTA
                  bcf  pank
                  movlw	B'10010000'
                  movwf	RCSTA
                  movf	RCREG,W
                  bcf  PIR1,RCIF
                  bsf  INTCON,GIE
                  return
              GIE katkestused võib muidugi välja visata.
              pank=STATUS,RB0

              PS. Seda klaveri lugemise koodi olen kasutanud isegi, töötas küll. Soovid minu versiooni (õige veidi rauaga kohendatud)?
              - Vend Hieronymus tunneb Motorola toodete nimekirja kõige paremini, las tema ütleb.
              - Motorola poolt loodud kiipide hulgas ei ole teda üles tähendatud. - Tähendab: ta on Intelist!

              Comment


                #8
                Avastasin sellise asja, et kui nivoo pic-i ükskõik millisel nupu sisendil(Col1-Col3) madalaks teha siis läheb programm kolmanda osa juurde GOTO MAX_PESA.
                4x3 matrixi nuppude vajutused ei anna mingit tulemust. Tegin asja natuke ringi
                ;******** Menüü ***************
                meny
                call LCDCLEAR
                call LCDHOME
                movlw 0x00
                call LCD_MENY
                call LCD_Line2
                movlw 0x00
                call LCD_MENY1
                call Delay50
                bsf PORTB, 7
                movlw 0x00
                movwf key
                call LCDHOME ; LCD algus
                meny1 movlw 0x00 ;wait until no key pressed
                movwf KEY_PORT ;set all output pins low
                movf KEY_PORT, W
                andlw 0xF0 ;mask off high byte
                sublw 0xF0
                btfsc STATUS, Z ;test if any key pressed
                goto meny2 ;if none, read keys
                call Delay20
                goto meny1 ;else try again
                meny2 call Keys
                call LCDPUTCHAR ;lisasin selle, et näha mis on peale nupu lugemist W-s
                läheb edasi...

                Selle järgi on näha, et midagi ei toimu. LCD-le ei tule ühtki märki.

                Comment


                  #9
                  Õhtust.
                  Tekkisid veel mõned küsimused.
                  Kuhu tuleks panna programmis Table-d, kas programmi algusesse või lõppu?
                  Mis selle määrab? Küsimus tekkis sellest, et alguses olid Table-d alguses, kõik töötas, kui tõstsin lõppu siis enam LCD-le kirju ei tulnud.
                  Järgmiseks küsiks PCLATH registri kasutuse kohta. Saan ma õigesti aru, et seda tuleb sättida siis, kui programm või selle osad ei mahu 1-e PAGE-sse ära.
                  Lugesin materjale http://ww1.microchip.com/downloads/e...tes/00556e.pdf
                  http://ww1.microchip.com/downloads/e...Doc/31006a.pdf
                  kuid ei ole ingliskeelega eriti sinapeal ja mõned kohad jäävad segaseks.
                  PIC16F877A Data Sheet kirjas selline asi "When doing a table read using a computed GOTO method (kasutan seda), care should be exercised if the table location crosses a PCL memory boundary (each 256-byte block)", ehk keegi seletaks asja lahti.

                  Comment


                    #10
                    Põhimõtteliselt ei ole tabeli asukoht tähtis aga ta peab jääma samale koodilehele kus on väljakutsuv koodijupp. Muidu loeb valesti või jookseb kokku. Kui pead panema mõnele muule codepagele, seivi enne lugemnist PCLATH, siis lae temasse koodilehe high aadressi väärtus ja alles siis call tabel. Tagasi tulles taasta algne PCLATH.
                    - Vend Hieronymus tunneb Motorola toodete nimekirja kõige paremini, las tema ütleb.
                    - Motorola poolt loodud kiipide hulgas ei ole teda üles tähendatud. - Tähendab: ta on Intelist!

                    Comment


                      #11
                      Originally posted by felch@Mar 4 2005, 10:07
                      Tagasi tulles taasta algne PCLATH.
                      Ülejäänust saan aru, aga kas ma pean taastama PCLATH enne PAGE-le tagasi minemist(näit. enne RETURN käsku) või pärast. Näiteks kui lähen tagasi PAGE1-st PAGE0-i.
                      http://ww1.microchip.com/downloads/e...Doc/33023a.pdf
                      LK.110 võetud näide, ei anna ka miskit rohkem.
                      (PAGE0)
                      MOVLW HIGH (SUB_1) ; Select Program Memory Page of
                      MOVWF PCLATH ; Routine.
                      CALL SUB_1 ; Call the desired routine
                      :
                      :
                      SUB_1 : ; Start of routine (PAGE1)
                      :
                      RETURN ; Return from routine

                      Comment


                        #12
                        Enne tabeli väljakutset seivid PCLATHi. Laed PCLATHi tabeli HIGH aadressi. Kutsud tabeli välja. Tagasi tulles seivid tulemuse, taastad PCLATHi ja võtad tulemuse töötlemise ette.
                        Kood:
                          movf	PCLATH,W 	&#59; seivi PCLATH
                          movwf	lath_tmp
                          movlw	HIGH TempTabel &#59; ja lae tabeli aadress
                             movwf  PCLATH    
                          movf	ADRESH,W 	&#59; loe muundi tulemus
                          call  TempTabel     &#59; Loe temperatuuri väärtus Celsiuse kraadides
                          movwf	lcd_tmp                 &#59; seivi
                          movf	lath_tmp,W 	&#59; taasta PCLATH
                          movwf	PCLATH
                          movf	lcd_tmp,W                &#59; tulem tabelist W-s
                        - Vend Hieronymus tunneb Motorola toodete nimekirja kõige paremini, las tema ütleb.
                        - Motorola poolt loodud kiipide hulgas ei ole teda üles tähendatud. - Tähendab: ta on Intelist!

                        Comment

                        Working...
                        X