Teade

Collapse

Foorumi reeglid.

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

PIC-i EEPROMi kirjutamine ja lugemine.

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

    PIC-i EEPROMi kirjutamine ja lugemine.

    Tere.
    Proovin kirjutada koodi, mis loeb EEPROM-ist andmed(adr.0x10), siis liidetakse 1 ja summa pannakse teise mälu aadressi(adr.0x02). Järgnevalt loetakse sellelt samalt aadressilt(adr.0x02) väärtus ja väljastatakse PORTi B.
    Simuleerides koodi MPLAB SIM (MPLAB IDE v6.53)nimelise programmiga jääb asi pidama sinna, kus kirjutatakse andmed EEPROMi. Uut lugemist ei toimu ja porti andmeid ei jõua. Miks?
    Ei saa aru, kas viga on koodis või simulaator ei näita seda.
    Olen proovinud mitmeid varjante, kuid tulutult.
    Ehk keegi seletaks, mis on valesti.
    Tänan.

    Protsessor on PIC16F84A.
    EEPROM-i lugemiseks ja kirjutamiseks kasutan macrot, mille sain siit
    http://www.mikroelektronika.co.yu/english/...k/6_chapter.htm
    Program: EEPROM.INC
    Lisaks kasutan macrot elay 10ms, mis on vajalik kirjutamis protsessil.
    http://www.mikroelektronika.co.yu/english/...k/5_chapter.htm
    Punkt 5.3.4 Generating pause in miliseconds (1~65535ms).
    PORTB on out.
    [CODE]
    main eeread 0x10,W
    movlw 0x01 ;W-sse 01h
    movwf temp ;W loetakse tempi
    addwf EEDATA,temp ;EEDATA(17)+temp(01)=W(18)
    movwf temp ;W loetakse tempi
    eewrite 0x02,temp ;temp kirjutatakse eepromi aadressisse 02

    eeread 0x02,W ;loetakse aadressist 0x02
    movf EEDATA,W ;EEDATA väärtus pannakse W-sse
    movwf 06h ;W pannakse portB-sse
    goto main
    org 0x2100 ;eepromi algus
    de .5 ;väärtused,mis kirjutatakse programmeerimisel
    org 0x2110 ;eepromi
    de .23
    end

    #2
    Esimese hooga viga ei märka. Saada täis kood, proovin simuleerida.
    PIC-il oli vist 2 bitti mis määrasid EEPROMiga suhtlemist?
    - 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änan vastamast.
      Panin kõik failid siia
      http://www.hot.ee/ilmarnur/eepromlugemine.rar

      Comment


        #4
        Elou!

        Minul MPLAB IDE v6.40

        Proovisin ka seda programmi aga minul kirjutab EEPROMi aadressile "02" ilusasti h'18'. ainult kogu krempli käima saamiseks pidin tegema mitmed muudatused:

        algusesse:
        ;eepromist lugemine ja kirjutamine
        LIST P=16F84A
        errorlevel -302
        INCLUDE P16F84A.INC

        edasi:
        org 0x0000
        goto main
        #include paus.inc
        #include eeprom1.inc
        ja ühe hoiatuse annab:
        addwf EEDATA,temp ;EEDATA(17)+temp(01)=W(18)
        : Argument out of range. Least significant bits used.

        ja samuti kui temp'le anda väärtuseks 0x02 liidab ka kaks juurde(h'19&#39

        aga see viivis peale eepromi kirjutamist, kui viivis nulli jõuab siis ronib progamm
        jälle algusesse sellepärast porti midagi ei jõua...

        et kui see paus panna kinni ;pausems .10 ;10ms delay
        siis nagu toimiks?

        Samuti ei defineerita portb olekut vaid hüpatakse sellest üle "goto main"???????

        gOb
        Meie üle nalja ei mõisteta!

        Comment


          #5
          Elou!

          Selle viivisega mõtlesin välja mis valesti on!!!!
          Kui vaadata tähelepanelikult seda näidise makrot siis programmiga kaasas olnud makrol on erinevus:

          pausems macro par1
          local Loop1
          local dechi
          local Delay1ms
          local Loop2
          local Exit ; End asemel võiks olla Exit
          edasi lõpus peab olema:
          Loop2 nop
          nop
          ; natuke lõikasin lühemaks
          decfsz LOOPcnt, f
          goto Loop2 ; Time period necessary to execute loop Loop2
          return ; equals 10us
          Exit <--- siin peaks olema see Exit mis makro lõpetab&#33;&#33;&#33;&#33;&#33;
          endm

          ja selles kohas:
          dechi
          movf HIcnt, f
          btfsc STATUS, Z
          goto Exit

          Parimat soovides,
          gOb
          Meie üle nalja ei mõisteta!

          Comment


            #6
            Kas see "Exit" või "End" omab ültse tähtsust (kumb on)? Arvasin, et see võiks olla ükskõik milline sõna.
            Muidu kõik töötab, aga porti ikka andmeid ei jõua.
            Lisasin veel ühe 1/2s viite peale porti andmete lugemist. Viide töötab, port on muutusteta.

            Comment


              #7
              Tundub, et lahendus on juba leitud&#33; Igaks juhuksa panen siia ühe oma koodijupi fragmendi (töötab). On küll väljamaa keeles sest lugejad ei saa meie spraahest aru aga ehk siiski abiks. eepromi kirjutamine/lugemine
              PIC12F629
              - 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
                Tänud kaasamõtlejatele&#33;
                Probleem on ikka õhus, kuna porti B andmeid ei jõua. Selle koha pealt hüppab programm üle.
                Proovin selle lingi (felch antud) järgi teha kirjutamis macro, et ära jätta 10ms viite macro.

                Comment


                  #9
                  Elou&#33;

                  Porti ei jõua sellepärast et PORTB jääb defineerimata
                  See "goto main" uuri seda lõiku&#33;&#33;&#33;&#33;&#33;
                  goto main jätab selle koha vahele kus on pordi defineerimine&#33;
                  pane algusesse:
                  org 0x0000
                  goto INIT ; <----- goto main asemele INIT
                  #include paus.inc
                  #include eeprom1.inc

                  INIT ;<----- hüppab siia, teeb pordidefineerimise ja siis alles main
                  bsf STATUS,RP0 ; register bank 1 valik
                  movlw b&#39;00000000&#39; ;
                  movwf TRISB
                  bcf STATUS,RP0 ; register bank 0 valik

                  "End" on tavaliselt programmi lõpu tähis ja mina väldin selle kasutust kusagil mujal vahepeal. Et ükskõik milline sõna aga mitte "End"

                  Parimat,
                  gOb
                  Meie üle nalja ei mõisteta!

                  Comment


                    #10
                    END on enamasti koodi lõpus, mujal kasutatakse return.
                    INITit kasuta parem ka eraldi alamprogrammina, väljakutse: call init
                    Nii saad teda hiljem vajadusel koodis uuesti pruukida.
                    - 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
                      Sain lõpuks kõik tööle. Tegin uue projekti, kuna tundus, et programm ei uuendanud andmeid. Kaotasin ära selle 10ms macro ja panin kirjutamis macrosse
                      sisse WR biti kontrolli (millal lõppeb kirjutamine).

                      Ehk keegi seletaks milleks kasutada EECON1 registris seda:
                      bit 4 EEIF: EEPROM Write Operation Interrupt Flag bit
                      1 = The write operation completed (must be cleared in software)
                      0 = The write operation is not complete or has not been started

                      Comment


                        #12
                        Selle järgi kontrollid, kas kirjutamine lõppenud. Ei mingit umbmäärast viidet, jälgid vaid lippu.
                        - 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


                          #13
                          to Felch: sinu antud näites oli tehtud kontroll nii
                          cid2
                          btfsc EECON1,WR ;wait for writing completed
                          goto cid2
                          Kui ma õigesti aru sain. Et siis, võib kasutada kumba tahad. Ainult, et EEIF puhul
                          tuleb softis bit 0-da, peale igat kirjutamist.

                          Comment


                            #14
                            Nojah, nii on vähem asju meeles pidada. Bitti saab ainult 1-ks seada, mille peale hakatakse kirjutama. Nulli läheb ise ja täpselt siis kui kirjutamine valmis. Mugav ju&#33;?
                            Muide, minu prose oli 12F629, see ei pruugi olla 1:1 ülekantav sinu prosele.
                            - 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


                              #15
                              Originally posted by felch@Jun 22 2004, 18:22
                              Muide, minu prose oli 12F629, see ei pruugi olla 1:1 ülekantav sinu prosele.
                              Hetkel töötab. Tänud&#33;

                              Comment

                              Working...
                              X