Teade

Collapse

Foorumi reeglid.

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

DataTable lugemine

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

    DataTable lugemine

    Tere,
    On vaja lugeda DataTable erinevad osad
    näiteks:
    org 0x0300
    ;veerg A1 , A2 , A3 , A4 , A5 , A6
    dt 0x00,0x00,0x00,0x00,0x00,0x00 ; rida B1
    dt 0x10,0xE3,0x84,0x10,0x01,0x00 ; rida B2
    dt 0x6D,0xB4,0x80,0x00,0x00,0x00 ; rida B3
    dt 0x00,0x23,0x00,0x00,0xED,0x00 ; rida B4
    1-on vaja lugeda A1-B1
    2-on vaja lugeda A1-B2
    3-on vaja lugeda A1-B4
    4-on vaja lugeda A2-B1
    5-on vaja lugeda A2-B2
    6-on vaja lugeda A2-B4
    jne.
    Ei ole vaja lugeda järjest A1-B1, A2-B1, A3-B1...jne.
    DataTable-sid on palju. Lugemine ridade kaupa on suvaline, st. olenevalt muutujate X1 ,X2, X3 jne. väärtusest.

    Kas DataTable-ga saab sellist asja teha?
    Kuidas seda teha?
    Ei oska ennast hetkel paremini väljendada ka.

    Aitäh.

    #2
    Iga lugemine ja tabel eraldi. Muutuja + tabeli algusaadress W-sse ja siis addwf PCL,F. Toimub hüpe aadressile, sealt loetakse kood RETLW käsuga ja tehakse return.
    NB! Mälulehekülgede õigsust pead ise kontrollima. Tabel peab paiknema ühel leheküljel!
    PIC18 seerial on mugavam - kasuta table read registreid: movf TABLAT,W.
    - 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änud Felch, kiire vastuse eest.
      Oletame, et muutuja X väärtus on 0x02 ja tabeli väärtus 0x01.
      Kood:
      movf X, W ;paneme X-i W-sse
      addlw 0x01 ;tabeli väärtus
      call table
      .....
      .....
      table addwf PCL,F
      ;veerg A1 , A2 , A3 , A4 , A5 , A6
      dt 0x00,0x00,0x00,0x00,0x00,0x00 ; rida B1
      dt 0x10,0xE3,0x84,0x10,0x01,0x00 ; rida B2
      dt 0x6D,0xB4,0x80,0x00,0x00,0x00 ; rida B3
      dt 0x00,0x23,0x00,0x00,0xED,0x00 ; rida B4
      .......
      .......
      Siis ma vist satun reale B1 ja veerule A3.
      On mu mõttekäik õige?
      Mul on vaja sattuda aga reale B3 ja veerule A2.

      Comment


        #4
        Tabelid peavad iga veeru kohta olema omad. Või kui on 1 tabel siis pead panema eraldi märgendid, mis lubavad liita õige veeru offset'i: veerg1, veerg2 jne.

        movf muutuja,W
        ADDWF LOW veergX
        call tabel

        VeergX ei ole muutuja paraku. Kui peaks olema, tuleb pisike kavalus appi võtta.
        Muidu nagu võiks sobida.
        Microchipi lehel oli kunagi appnotede juures kena seletus kuidas tabeleid indekseerida, äkki tasub otsimist?
        - 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


          #5
          mõnikord võib olla kasulik panna see tabel üldse data eeprommi kui kontrolleril on data eeprom ka olemas. Seal saad siis EEADR, EECON registreid kasutades juhtida lugemist ja kirjutamist.
          Kui su tabelis on 6 baiti reas, siis on muidugi natuke mitte väga hea paigutus... aga lisame veel 2 tühja tulpa, mida sa kunagi ei kasuta - laiendamaks rida 8-le tulbale. Siis saab mugavalt võtta rea numbri, selle nihutada kolm kohta vasakule ja talle otsa liita / or'ida veeru numbri. Kõigele sellele liidad veel otsa tabeli algusaadressi (eeprommi võid ju terve hunniku kraami panna) ja siis käsid lugeda. Datasheedi järgi on kõik kenasti tehtav.
          Kusjuures programmimälust saab ka samamoodi lugeda. Kui 8-bitiseid arve on vaja, siis pole väga mõtet pingutada, sest ikka läheb igast 14-st bitist 6 kadudesse... või noh, kui ruumiga kitsas on, siis võib ju neid bitte 14 biti haaval salvestada või mida iganes veel. See tavaline tabeli realisatsioon paneb lihtsalt igasse 14-bitisesse sõnasse 6 bitti käsukoodi ja siis 8 bitti andmeid, käsuks on lihtne RETLW.
          Kokkuvõttes - imho sellist call+jump+return tüüpi tabelit ei ole nagu eriti mõtet teha, tulemus tuleb sama kiire kui otse eeprommi lugedes. Ja data eeprommi saab kenasti koodist seest ümber flashida näiteks jadaliidese kaudu juhides vms, see lisab palju uusi ja huvitavaid võimalusi.

          edit: tänud urmasele, öösel kell 2 ei ole eriti hea mõte vast bittidest ikkagi kirjutada parandasin vead ära.

          Comment


            #6
            Digital rääkis tegelikult bittidest, mitte baitidest. Kuid muidu teeks ka ise täpselt nii.

            Comment


              #7
              Eeprommi maht jääb väikseks vist.
              Tabeli iga rida on nn. Bitmap, teatud sümboli kohta. Igale sümbolile vastab ASCII kood. ASCII koodid saadakse RS232 kaudu ja salvestatakse buffrisse. Peale seda tuleb lugeda buffrist nr.1 koodi väärtus ja minna õigesse kohta Tabelis. Alustab esimesest veerust (näiteks A1) ja väljastab väärtuse PORTB registrisse. Järgmisena võtab buffrist nr.2 järgmise koodi ja uuesti õige Table rea pealt loeb esimese veeru (A1) väärtuse. Buffrist võetakse näit. 30 märgi koodid (kui on niipalju, selleks eraldi loendur). Peale viimast buffri numbrit hakatakse lugema teist veergu (A2). Nii tehakse ka veergudega A3, A4, A5, A6. Kogu tsükkel on pidevas ringluses seni, kuni katkestab RS232 vastuvõtt.

              Kasutan ainult RX pin-i PIC-l (Asynchronous mode 9600 8N1). Siit ka uus küsimus selline. Kui ma ei jõua RCREG registrit kiiresti tühjendada ja teine seade saadab uue info, kas see läheb siis kaduma või suudab PIC miskit moodi teisele seadmele selgeks teha, et ta peab ootama (RX pin madal seni???). On mingi kindel aeg mille jooksul saadetakse uus info. Lugesin erinevaid materjale USART kohta, aga vastust ei leidnud.
              Ei ole ka kindel, kas digital-i jutust õigesti aru sain.

              Comment


                #8
                ok, proovin uuesti.
                on kaks võimalust andmeid salvestada.
                1) return käsuga. On selline käsk retlw, mis läheb tagasi samasse kohta, kust call'iga hüpati viimati. Ainult return'i parameetriks olev arv pannakse w registrisse.
                Tabel tehakse siis nii, et call'iga hüpatakse tabeli algusaadressile, pannes w registrisse tabeli lahtri numbri. sealt siis liidetakse programmiloendurile see arv otsa ehk hüpatakse õige return käsu peale. sealt siis hüpatakse tagasi koos õige arvuga w registris. Loomulikult selline meetod pole just liiga hea; seda enam kui meil läheb igast 14 bitist 6 kaduma returni käsukoodi.

                2) otse vastava mooduli kaudu pannes teatud registrisse mäluaadressi, mida lugeda ja siis käskides lugeda. Muidugi programmimälu adresseerid ikka 14 bitise sõna kaudu, kuid võid ju ise sealt neid bitte lahti pakkida nihkega.

                RX ei anna mingit tagasisidet. selle pead ise mingi pin'iga tegema, kui tahad.


                btw, miks sa näiteks atmega88'ga ei tee?

                Comment


                  #9
                  Originally posted by digital@Mar 9 2006, 19:59
                  btw, miks sa näiteks atmega88'ga ei tee?
                  Kasutan PIC16F870 selle pärast, et ta on mul hetkel olemas ja olen mingi pildi PIC-de hinge elust ette saanud. Ei taha enne midagi osta, kui on kindel kas minu ideed on üldse võimalik realiseerida.

                  Ei tea, kas olete minu soovist aru saanud.
                  Proovin veelkord näite teha

                  Rida 1
                  movlw 0x41 ; ASCII koodi "A",siin on vaja jõuda rea "A" esimese pesa juurde
                  movwf Buffer
                  movlw 0x41
                  subwf Buffer, W ; W=0x00
                  call Message
                  movwf PORTB
                  Rida 2
                  movlw 0x42 ; ASCII koodi "B", siin on vaja jõuda rea "B" esimese pesa juurde
                  movwf Buffer
                  movlw 0x41
                  subwf Buffer, W ; W=0x01
                  call Message
                  movwf PORTB
                  Rida 3
                  movlw 0x41 ; ASCII koodi "A",siin on vaja jõuda rea "A" teise pesa juurde
                  movwf Buffer
                  movlw 0x41
                  subwf Buffer, W ; W=0x00
                  call Message
                  movwf PORTB
                  Rida 4
                  movlw 0x42 ; ASCII koodi "B",siin on vaja jõuda rea "B" teise pesa juurde
                  movwf Buffer
                  movlw 0x41
                  subwf Buffer, W ; W=0x01
                  call Message
                  movwf PORTB

                  Message addwf PCL,F
                  dt 0x01,0x02,0x03,0x04,0x00,0x00 ; A
                  dt 0x10,0xE3,0x84,0x10,0x01,0x00 ; B

                  Rida 1- peab lugema A rea 1 pesa
                  Rida 2- peab lugema B rea 1 pesa
                  Rida 3- peab lugema A rea 2 pesa
                  Rida 4- peab lugema B rea 2 pesa
                  Kuidas seda koodis teha?
                  Ei saa ju Rida2, Rida4 juures miskit juurde liita, kuna Tablesid on rohkem ja ei ole teada milline ASCII kood buffris on.
                  Ride 3 juures saaks 1 juurde liita ainult ASCII koodi "A" puhul. Ülejäänu korral ei loeta õiget pesa.
                  :unsure:

                  Comment


                    #10
                    kui saladus ei ole, siis mida see värk tegema peaks? antud hetkel on asi nii segane, et isegi aidata ei oska.

                    Comment


                      #11
                      Idee pärineb sellelt lehelt
                      http://dt.prohosting.com/pic/vidclock.html
                      skeem
                      http://dt.prohosting.com/pic/vidclock.gif
                      Minu mõte liigub selles suunas, et kella asemel näidata ASCII koodi märke.
                      Võimalik, et lähenen asjale valest otsast. Sammuti ei ole ma veel korralikult aru saanud kuidas lingil olev kood töötab.
                      Võiks kasutada mingeid OSD mikroskeeme ( STV5730), aga ei õnnestu neid kusagilt saada.

                      Comment


                        #12
                        Mida arvate taolisest ettevõtmisest? Kas tasub üldse jändama hakata?

                        Ise mõtlesin skeemist ära jätta protsessori "Clock" osa. Paneks protsessori 20MHz pealt käima ja sünkroniseeriks videosignaali kaadri ja rea pulsi järgi.
                        Hetkel ei suuda aga kuidagi välja mõelda seda osa, mis võtaks videosignaali rea ajal ASCII koodile vastava õige Bitmap-i osa.
                        Saaksin hakkama, kui oleks vaja näidata kindlaid märke samas kohas.

                        Comment


                          #13
                          seda on tehtud nii AVRi kui PICi kui veel X prosede pealt. googelda. suurim mure oli värina vältimine ( prose ei reageeri katkestusele alati yhesuguse tsyklite arvuga, seetöttu pilt hakkab värisema). lahendus oli selline et oodates uut rida pandi prose seisma, seisust tuleb aga prose alati yhesuguselt välja ja värisemist ei teki.

                          Comment

                          Working...
                          X