اطلاعیه

Collapse
No announcement yet.

نوشتن و خواندن اطلاعات بروی AT24C1024 از طریق Xmega128A1 در بسکام

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    نوشتن و خواندن اطلاعات بروی AT24C1024 از طریق Xmega128A1 در بسکام

    با سلام ؛

    بنده تا بحال از پروتوکل I2C و TWI استفاده نکردم ام ، در حال حاضر نیاز به نوشتن اطلاعات بروی یک آی سی حافظه خارجی مدل AT24C1024 دارم که به پورت سی میکروکنترلر Xmega128A1 متصل هستش . اطلاعاتی که لازم به ذخیره کردن هستند یک سری اعداد اعشاری هستند که در حقیقت مختصات جغرافیایی هستند ( Latitude , Longitude ) . اگر دوستان راهنمایی کنند ممنون میشم . ( اگر مقدور باشه با مثال )

    کامپایلر بنده بسکام 2.0.7.3

    متشکرم .

    #2
    پاسخ : نوشتن و خواندن اطلاعات بروی AT24C1024 از طریق Xmega128A1 در بسکام

    برای اتصال حافظه ها سری AT24Cxx به AVR از طریق کامپایلر بسکام یکسری نمونه کد موجود است که در صورت تسلط به XMEGA با یکسری تغییرات جزئی می توانید از آنها استفاده کنید. مثلا نمونه کدی در لینک زیر برای AT24C1024 قرار داده شده است:

    http://www.mcselec.com/index2.php?op...amp;highlight=

    چند نمونه کد هم در همین سایت برای این خانواده eeprom ها موجود است که با جستجو می توانید آنها را بیابید.



    اوژن: به معنای افکننده و شکست دهنده است
    دانایی، توانایی است-Knowledge is POWER
    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

    دیدگاه


      #3
      پاسخ : نوشتن و خواندن اطلاعات بروی AT24C1024 از طریق Xmega128A1 در بسکام

      با سلام ؛

      بنده طبق راهنمایی شما از نمونه برنامه ای که در لینک قرار داشت استفاده کردم

      کد:
      $regfile = "xm128a1def.dat"
      $crystal = 32000000
      $hwstack = 64
      $swstack = 64
      $framesize = 64
      $lib "xmega.lib"
      $external _xmegafix_clear
      $external _xmegafix_rol_r1014
      Disable Jtag
      Config Osc = Enabled , 32mhzosc = Enabled
      Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
      Config Com1 = 19200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
      Open "COM1:" For Binary As #1
      Declare Sub Read_eeprom(byval Adres As Long , Byval Dataee As Byte)
      Declare Sub Write_eeprom(byval Adres As Long , Byval Dataee As Byte)    'Lokalne spremenljivke
      
      Enable Interrupts
      Enable Usartc0_rxc
      On Usartc0_rxc Datalink
      
      Start Adca
      Config Adca = Single , Convmode = Unsigned , Resolution = 8bit , Dma = Off , Reference = Arefa , Event_mode = None , Prescaler = 32 , Ch0_gain = 1 , Ch0_inp = Single_ended , Mux0 = &B000_00 _
      Ch1_gain = 1 , Ch1_inp = Single_ended , Mux1 = &B1_000 , Ch2_gain = 1 , Ch2_inp = Single_ended , Mux2 = &B10_000 , Ch3_gain = 1 , Ch3_inp = Single_ended , Mux3 = &B11_000
      
      Start Adcb
      Config Adcb = Single , Convmode = Unsigned , Resolution = 8bit , Dma = Off , Reference = Arefa , Event_mode = None , Prescaler = 32 , Ch0_gain = 1 , Ch0_inp = Single_ended , Mux0 = &B000_00 _
      Ch1_gain = 1 , Ch1_inp = Single_ended , Mux1 = &B1_000 , Ch2_gain = 1 , Ch2_inp = Single_ended , Mux2 = &B10_000 , Ch3_gain = 1 , Ch3_inp = Single_ended , Mux3 = &B11_000
      
      Dim Twi_start As Byte
      Const Usechannel = 1
      Dim B1 As Byte , B2 As Byte
      Dim W As Word At B1 Overlay
      Open "TWIC" For Binary As #9
      I2cinit #9
      Config Twic = 100000
      
      Dim Buffer As Byte
      Dim Readeddata As Byte
      Dim A As Byte
      Dim B As Byte
      Dim C As Byte
      Dim D As Byte
      Dim E As Byte
      Dim F As Byte
      Dim G As Byte
      Dim H As Byte
      Dim I As Byte
      Dim J As Byte
      
      Do
        A = Getadc(adcb , 0 , 0)
        B = Getadc(adcb , 0 , 8)
        C = Getadc(adcb , 1 , 16)
        D = Getadc(adcb , 1 , 24)
        E = Getadc(adcb , 2 , 32)
        F = Getadc(adcb , 2 , 40)
        G = Getadc(adcb , 3 , 48)
        H = Getadc(adcb , 3 , 56)
        I = Getadc(adca , 1 , 16)
        J = Getadc(adca , 1 , 24)
        Print #1 , A ; "-" ; B ; "-" ; C ; "-" ; D ; "-" ; E ; "-" ; F ; "-" ; G ; "-" ; H ; "-" ; I ; "-" ; J
        Call Write_eeprom(1 , A)
        Waitms 50
      Loop
      
      Sub Write_eeprom(byval Adres As Long , Byval Dataee As Byte)    'Lokalne spremenljivke
      Local Local_tempw_write As Word
      Local Local_adreshi_write As Byte
      Local Local_adreslo_write As Byte
      Local Local_tempb_write As Byte
      Local_tempw_write = Adres                  'long v word
      Local_adreshi_write = High(local_tempw_write)        'zgornje byte worda v byte
      Local_adreslo_write = Low(local_tempw_write)        'spodnje byte worda v byte
      Local_tempw_write = Highw(adres)              'C(e je vec( kot 65535 prenese 1
      Shift Local_tempw_write , Left , 1             'Shift bit za eno mesto levo v registru
      Local_tempb_write = Low(local_tempw_write)         'Addressw Or Low(local_tempw_write) 'Vpisni register 1 v drugim bitu
      I2cstart                          'start condition
      I2cwbyte Local_tempb_write                 'slave address
      I2cwbyte Local_adreshi_write                'asdress of EEPROM
      I2cwbyte Local_adreslo_write                'asdress of EEPROM
      I2cwbyte Dataee                       'value to write
      I2cstop                           'stop condition
      Waitms 8                          'wait for 10 milliseconds
      End Sub
      
      Sub Read_eeprom(byval Adres As Long , Byval Dataee As Byte)
      Local Local_tempw_read As Word               'Lokalne RAM spremenljivke
      Local Local_adreshi_read As Byte
      Local Local_adreslo_read As Byte
      Local Local_tempb_read As Byte
      Local_tempw_read = Adres                  'naslov ve EXT. EE
      Local_adreshi_read = High(local_tempw_read)         'MSB za EE
      Local_adreslo_read = Low(local_tempw_read)         'LSB za EE
      Local_tempw_read = Highw(adres)
      Shift Local_tempw_read , Left , 1              '
      Local_tempb_read = Low(local_tempw_read)          'Addressw Or Low(local_tempw_read)
      I2cstart                          'generate start
      I2cwbyte Local_tempb_read                  'slave adsress
      I2cwbyte Local_adreshi_read                 'address of EEPROM
      I2cwbyte Local_adreslo_read                 'address of EEPROM
      I2cstart                          'repeated start
      Local_tempb_read = Low(local_tempw_read)          'Addressr Or Low(local_tempw_read)
      I2cwbyte Local_tempb_read                  'slave address (read)
      I2crbyte Dataee , Nack                   'read byte
      I2cstop
      End Sub
      
      Datalink:
      Disable Usartc0_rxc
      Buffer = Inkey(#1)
      If Chr(buffer) = "r" Then
        Call Read_eeprom(1 , Readeddata)
        Print #1 , Readeddata
      End If
      Enable Usartc0_rxc
      Return
      
      End
      ولی متاسفانه این برنامه چیزی رو ذخیره نمیکنه ، یا اگر هم میکنه وقتی کلید r رو بروی کیبرد میزنم برنامه از کار می افته تا زمانی که مجددا خاموش و روشن کنم .

      اگر لطف کنید و راهنمایی بفرمایید ممنون میشم .
      با تشکر .

      دیدگاه


        #4
        پاسخ : نوشتن و خواندن اطلاعات بروی AT24C1024 از طریق Xmega128A1 در بسکام

        برای تست در ابتدا یک برنامه ساده بنویسید که فقط یک بایت را ذخیره و بازیابی کند و بعد از به نتیجه رسیدن و مطمئن شدن از عملکرد EEPROM به برنامه نهایی بپردازید. ضمنا پین های WP و آدرس هم در 24c1024 باید در وضعیت مناسب باشد تا عملیات نوشتن در آن به درستی انجام شود.
        اوژن: به معنای افکننده و شکست دهنده است
        دانایی، توانایی است-Knowledge is POWER
        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

        دیدگاه


          #5
          پاسخ : نوشتن و خواندن اطلاعات بروی AT24C1024 از طریق Xmega128A1 در بسکام

          با سلام و عرض ادب ؛

          در دیتاشیت این محصول آمده است : ( Atmel Doc1471 )
          Pin Description : SERIAL CLOCK (SCL): The SCL input is used to positive edge clock data into each
          EEPROM device and negative edge clock data out of each device.
          SERIAL DATA (SDA): The SDA pin is bi-directional for serial data transfer. This pin is opendrain
          driven and may be wire-ORed with any number of other open-drain or open-collector
          devices.
          DEVICE/ADDRESSES (A1): The A1 pin is a device address input that can be hardwired or
          left not connected for hardware compatibility with other AT24Cxx devices. When the A1 pin is
          hardwired, as many as two 1024K devices may be addressed on a single bus system (device
          addressing is discussed in detail under the Device Addressing section). If the A1 pin is left
          floating, the A1 pin will be internally pulled down to GND if the capacitive coupling to the circuit
          board VCC plane is <3 pF. If coupling is >3 pF, Atmel recommends connecting the A1 pin to
          GND.
          WRITE PROTECT (WP): The write protect input, when connected to GND, allows normal
          write operations. When WP is connected high to VCC, all write operations to the memory are
          inhibited. If the pin is left floating, the WP pin will be internally pulled down to GND if the
          capacitive coupling to the circuit board VCC plane is <3 pF. If coupling is >3 pF, Atmel recommends
          connecting the pin to GND. Switching WP to VCC prior to a write operation creates a
          software write-protect function.
          و در بخش Device Addressing آمده :

          The 1024K EEPROM requires an 8-bit device address word following a start condition to
          enable the chip for a read or write operation (see Figure 7 on page 11). The device address
          word consists of a mandatory one, zero sequence for the first five most significant bits as
          shown. This is common to all two-wire EEPROM devices.
          The 1024K uses the one device address bit, A1, to allow up to two devices on the same bus.
          The A1 bit must compare to the corresponding hardwired input pin. The A1 pin uses an internal
          proprietary circuit that biases it to a logic low condition if the pin is allowed to float.
          The seventh bit (P0) of the device address is a memory page address bit. This memory page
          address bit is the most significant bit of the data word address that follows. The eighth bit of
          the device address is the read/write operation select bit. A read operation is initiated if this bit
          is high and a write operation is initiated if this bit is low.
          Upon a compare of the device address, the EEPROM will output a zero. If a compare is not
          made, the device will return to a standby state.
          DATA SECURITY: The AT24C1024 has a hardware data protection scheme that allows the
          user to write-protect the entire memory when the WP pin is at VCC.
          ولی بنده متوجه نمیشم آدرس رو که در نمونه برنامه هم از نوع Long تعریف شده رو باید چی بذارم و همچنین آیا نیازی هست پینهایی از میکروکنترلر که پایه های WP و A1 آی سی حافظه به اونها متصل هستند رو 0 و 1 کنم ؟ ( در بسکام Set و Reset )

          ضمنا پایه های A1 را به پین شماره 0 پورت H و پایه WP را به پین شماره 1 پورت H متصل نموده ام .
          ممنون میشم اگر بتونید با نمونه برنامه مشکلم رو حل کنید .
          سپاسگزارم .

          دیدگاه


            #6
            پاسخ : نوشتن و خواندن اطلاعات بروی AT24C1024 از طریق Xmega128A1 در بسکام

            برای نوشتن، WP باید در وضعیت صفر باشد و در صورتی که یک eeprom در مدار استفاده شده، A1 می تواند در وضعیت 0 قرار بگیرد (در صورتی که A1 در وضعیت 1 باشد، این مسئله باید در آدرس دهی رعایت شود). برای آدرس دهی باید بایت سوم آدرس همیشه H50& در نظر گرفته شود و بیت های شماره 0 تا 16 آدرس هم آدرس بایت مورد نظر است. مثلا برای نوشتن عدد 100 در اولین مکان حافظه بصورت زیر آدرس دهی کنید.
            کد:
            Call Write_eeprom(&H500000 , 100)


            یا برای نوشتن 200 در آخرین آدرس حافظه:

            کد:
            Call Write_eeprom(&H51FFFF , 200)
            اوژن: به معنای افکننده و شکست دهنده است
            دانایی، توانایی است-Knowledge is POWER
            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

            دیدگاه


              #7
              پاسخ : نوشتن و خواندن اطلاعات بروی AT24C1024 از طریق Xmega128A1 در بسکام

              با سلام ؛

              ضمن عرض ادب و تشکر ، برنامه رو خیلی ساده کردم و فقط با زدن کلید w یک بایت در حافظه آی سی مینویسد و با زدن کلید r یک بایت میخواند ، ولی متاسفانه باز هم با زدن کلید r هیچ اتفاقی صورت نمیگیرد و باید مدار را خاموش و روشن کنم .

              کد برنامه :
              کد:
              $regfile = "xm128a1def.dat"
              $crystal = 32000000
              $hwstack = 64
              $swstack = 64
              $framesize = 64
              $lib "xmega.lib"
              $external _xmegafix_clear
              $external _xmegafix_rol_r1014
              Disable Jtag
              Config Osc = Enabled , 32mhzosc = Enabled
              Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
              Config Com1 = 19200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
              Open "COM1:" For Binary As #1
              Declare Sub Read_eeprom(byval Adres As Long , Byval Dataee As Byte)
              Declare Sub Write_eeprom(byval Adres As Long , Byval Dataee As Byte)    'Lokalne spremenljivke
              
              Enable Interrupts
              Enable Usartc0_rxc
              On Usartc0_rxc Datalink
              
              Dim Twi_start As Byte
              Const Usechannel = 1
              Dim B1 As Byte , B2 As Byte
              Dim W As Word At B1 Overlay
              Open "TWIC" For Binary As #9
              I2cinit #9
              Config Twic = 100000
              Config Pinh.0 = Output
              Config Pinh.1 = Output
              
              Dim Buffer As Byte
              Dim Readeddata As Byte
              Dim A As Byte
              Dim L As Byte
              
              Do
                !nop
              Loop
              
              Sub Write_eeprom(byval Adres As Long , Byval Dataee As Byte)    'Lokalne spremenljivke
              Local Local_tempw_write As Word
              Local Local_adreshi_write As Byte
              Local Local_adreslo_write As Byte
              Local Local_tempb_write As Byte
              Local_tempw_write = Adres                  'long v word
              Local_adreshi_write = High(local_tempw_write)        'zgornje byte worda v byte
              Local_adreslo_write = Low(local_tempw_write)        'spodnje byte worda v byte
              Local_tempw_write = Highw(adres)              'C(e je vec( kot 65535 prenese 1
              Shift Local_tempw_write , Left , 1             'Shift bit za eno mesto levo v registru
              Local_tempb_write = Low(local_tempw_write)         'Addressw Or Low(local_tempw_write) 'Vpisni register 1 v drugim bitu
              I2cstart                          'start condition
              I2cwbyte Local_tempb_write                 'slave address
              I2cwbyte Local_adreshi_write                'asdress of EEPROM
              I2cwbyte Local_adreslo_write                'asdress of EEPROM
              I2cwbyte Dataee                       'value to write
              I2cstop                           'stop condition
              Waitms 10                          'wait for 10 milliseconds
              End Sub
              
              Sub Read_eeprom(byval Adres As Long , Byval Dataee As Byte)
              Local Local_tempw_read As Word               'Lokalne RAM spremenljivke
              Local Local_adreshi_read As Byte
              Local Local_adreslo_read As Byte
              Local Local_tempb_read As Byte
              Local_tempw_read = Adres                  'naslov ve EXT. EE
              Local_adreshi_read = High(local_tempw_read)         'MSB za EE
              Local_adreslo_read = Low(local_tempw_read)         'LSB za EE
              Local_tempw_read = Highw(adres)
              Shift Local_tempw_read , Left , 1              '
              Local_tempb_read = Low(local_tempw_read)          'Addressw Or Low(local_tempw_read)
              I2cstart                          'generate start
              I2cwbyte Local_tempb_read                  'slave adsress
              I2cwbyte Local_adreshi_read                 'address of EEPROM
              I2cwbyte Local_adreslo_read                 'address of EEPROM
              I2cstart                          'repeated start
              Local_tempb_read = Low(local_tempw_read)          'Addressr Or Low(local_tempw_read)
              I2cwbyte Local_tempb_read                  'slave address (read)
              I2crbyte Dataee , Nack                   'read byte
              I2cstop
              End Sub
              
              Datalink:
              Disable Usartc0_rxc
              Buffer = Inkey(#1)
              If Chr(buffer) = "w" Then
                Pinh.0 = 0
                Pinh.1 = 0
                Call Write_eeprom(&H500000 , 100)
                Print #1 , "Write : " ; 100
                Waitms 50
              End If
              If Chr(buffer) = "r" Then
                Pinh.0 = 0
                Pinh.1 = 0
                Call Read_eeprom(&H500000 , A)
                Print #1 , "Read : " ; A
              End If
              Enable Usartc0_rxc
              Return
              
              End
              ممنون میشم اگر برنامه رو بررسی کنید .
              سپاسگزارم .

              دیدگاه


                #8
                پاسخ : نوشتن و خواندن اطلاعات بروی AT24C1024 از طریق Xmega128A1 در بسکام

                با سلام مجدد ؛

                سوال دیگری هم دارم :
                کد:
                Sub Write_eeprom(adres As Long , Byval Dataee As Byte) 'Lokalne spremenljivke
                Local Local_tempw_write As Word
                Local Local_adreshi_write As Byte
                Local Local_adreslo_write As Byte
                Local Local_tempb_write As Byte
                
                
                Local_tempw_write = Adres 'long v word
                Local_adreshi_write = High(local_tempw_write) 'zgornje byte worda v byte
                Local_adreslo_write = Low(local_tempw_write) 'spodnje byte worda v byte
                Local_tempw_write = Highw(adres) 'Če je več kot 65535 prenese 1
                Shift Local_tempw_write , Left , 1 'Shift bit za eno mesto levo v registru
                Local_tempb_write = Addressw Or Low(local_tempw_write) 'Vpisni register 1 v drugim bitu
                I2cstart 'start condition
                I2cwbyte Local_tempb_write 'slave address
                I2cwbyte Local_adreshi_write 'asdress of EEPROM
                I2cwbyte Local_adreslo_write 'asdress of EEPROM
                I2cwbyte Dataee 'value to write
                I2cstop 'stop condition
                Waitms 8 'wait for 10 milliseconds
                End Sub
                '****************************************************************************
                
                '************* BRANJE IZ EEPROMA 24C1024 ************************************
                Sub Read_eeprom(adres As Long , Byval Dataee As Byte)
                Local Local_tempw_read As Word 'Lokalne RAM spremenljivke
                Local Local_adreshi_read As Byte
                Local Local_adreslo_read As Byte
                Local Local_tempb_read As Byte
                
                Local_tempw_read = Adres 'naslov ve EXT. EE
                Local_adreshi_read = High(local_tempw_read) 'MSB za EE
                Local_adreslo_read = Low(local_tempw_read) 'LSB za EE
                Local_tempw_read = Highw(adres)
                Shift Local_tempw_read , Left , 1 '
                Local_tempb_read = Addressw Or Low(local_tempw_read)
                I2cstart 'generate start
                I2cwbyte Local_tempb_read 'slave adsress
                I2cwbyte Local_adreshi_read 'address of EEPROM
                I2cwbyte Local_adreslo_read 'address of EEPROM
                I2cstart 'repeated start
                Local_tempb_read = Addressr Or Low(local_tempw_read)
                I2cwbyte Local_tempb_read 'slave address (read)
                I2crbyte Dataee , Nack 'read byte
                I2cstop
                End Sub
                End
                در برنامه write_eeprom در بخشی آمده :
                کد:
                Local_tempb_write = Addressw Or Low(local_tempw_write)
                ولی جایی addressw تعریف نشده است و برنامه موقع کامپایل به Error 242 اشاره میکند با متن :
                کد:
                Source variable does not match the target variable [____BTMPA = Addressw]
                و در برنامه read_eeprom نیز آمده :
                کد:
                Local_tempb_read = Addressw Or Low(local_tempw_read)
                و چند خط بعد از آن :
                کد:
                Local_tempb_read = Addressr Or Low(local_tempw_read)
                ولی بنده مجبور شدم این Addressw و Addressr ها را حذف کنم تا برنامه کامپایل شود .
                ممنون میشم در این خصوص نیز راهنمایی بفرمایید
                سپاسگزارم .

                دیدگاه


                  #9
                  پاسخ : نوشتن و خواندن اطلاعات بروی AT24C1024 از طریق Xmega128A1 در بسکام

                  در کد شما هیچ وقفه ای فعال نیست و قرار دادن Enable Interrupts برای XMEGA به تنهایی باعث فعال شدن وقفه نمی شود. بلکه از طریق CONFIG PRIORITY باید اولویت مورد نظر هم فعال شود. در مورد سوال بعد هم به نظر می رسد در کد اولیه Addressw و Addressr برای آدرس دهی متناظر با وضعیت پین A1 در نظر گرفته شده اند و اگر این پین low باشد، باید مقدار آنها 0 و در صورتی که به high متصل شود باید مقدار 4 برای آنها در نظر گرفته شود. بنابراین در کد شما حذف آنها مشکلی را ایجاد نمی کند.
                  اوژن: به معنای افکننده و شکست دهنده است
                  دانایی، توانایی است-Knowledge is POWER
                  برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                  وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                  قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                  اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                  ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                  دیدگاه


                    #10
                    پاسخ : نوشتن و خواندن اطلاعات بروی AT24C1024 از طریق Xmega128A1 در بسکام

                    با سلام مجدد ؛

                    Priority را هم فعال کردم ولی مشکل نوشتن و خواندن از آی سی حافظه همچنان وجود دارد . راه حل دیگری وجود ندارد ؟

                    با سپاس .

                    دیدگاه


                      #11
                      پاسخ : نوشتن و خواندن اطلاعات بروی AT24C1024 از طریق Xmega128A1 در بسکام

                      شما احتمالا بر اساس ارتباط سریال در مورد عملکرد eeprom قضاوت می کنید و بهتر است در ابتدا با حذف بخش سریال، اطلاعات ذخیره شده را روی led یا 7segment و مانند آن نمایش دهید و بعد از اطمینان از صحت عملکرد آن، بخش usart را فعال کنید.
                      اوژن: به معنای افکننده و شکست دهنده است
                      دانایی، توانایی است-Knowledge is POWER
                      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                      دیدگاه


                        #12
                        پاسخ : نوشتن و خواندن اطلاعات بروی AT24C1024 از طریق Xmega128A1 در بسکام

                        $regfile = "xm64a3def.dat"
                        $crystal = 32000000 '32MHz
                        $hwstack = 128
                        $swstack = 128
                        $framesize = 128
                        Config Osc = Disabled , 32mhzosc = Enabled '32MHz
                        Config Sysclock = 32mhz '32Mhz
                        $lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014
                        Config Priority = Static , Vector = Application , Lo = Enabled 'config interrupts
                        Enable Interrupts
                        On Usartd0_rxc Datalink
                        Config Com3 = 57600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
                        Open "COM3:" For Binary As #1
                        Waitms 1
                        $lib "i2c.lbx"
                        Print #1 , "test"
                        Dim Twi_start As Byte
                        Declare Sub Read_eeprom(byval Adres As Long , Datae As Byte)
                        Declare Sub Write_eeprom(byval Adres As Long , Byval Dataee As Byte) 'Lokalne spremenljivke
                        Config Twic = 100000
                        Open "TWIC" For Binary As #2
                        I2cinit #2
                        Dim A As Byte
                        Dim Buffer As Byte
                        Dim Datae As Byte
                        Enable Usartd0_rxc , Lo

                        Do
                        !nop
                        Loop


                        Datalink:
                        Buffer = Inkey(#1)
                        If Chr(buffer) = "w" Then
                        Call Write_eeprom(&H500003 , 123)
                        Print #1 , "Write : " ; 123
                        Waitms 50
                        End If

                        If Chr(buffer) = "r" Then
                        Call Read_eeprom(&H500000 , A)
                        Print #1 , "Read : " ; A
                        End If
                        Return


                        Sub Write_eeprom(byval Adres As Long , Byval Dataee As Byte) 'Lokalne spremenljivke
                        Local Local_tempw_write As Word
                        Local Local_adreshi_write As Byte
                        Local Local_adreslo_write As Byte
                        Local Local_tempb_write As Byte
                        Local_tempw_write = Adres 'long v word
                        Local_adreshi_write = High(local_tempw_write) 'zgornje byte worda v byte
                        Local_adreslo_write = Low(local_tempw_write) 'spodnje byte worda v byte
                        Local_tempw_write = Highw(adres) 'C(e je vec( kot 65535 prenese 1
                        Shift Local_tempw_write , Left , 1 'Shift bit za eno mesto levo v registru
                        Local_tempb_write = Low(local_tempw_write) 'Addressw Or Low(local_tempw_write) 'Vpisni register 1 v drugim bitu
                        I2cstart #2 'generate start
                        I2cwbyte Local_tempb_write , #2 'slave address
                        I2cwbyte Local_adreshi_write , #2 'asdress of EEPROM
                        I2cwbyte Local_adreslo_write , #2 'asdress of EEPROM
                        I2cwbyte Dataee , #2 'value to write
                        I2cstop #2
                        Print #1 , Local_tempb_write
                        Print #1 , Local_adreshi_write
                        Print #1 , Local_adreslo_write
                        Print #1 , Dataee
                        'stop condition
                        Waitms 10 'wait for 10 milliseconds
                        End Sub

                        Sub Read_eeprom(byval Adres As Long , Datae As Byte)
                        Local Local_tempw_read As Word 'Lokalne RAM spremenljivke
                        Local Local_adreshi_read As Byte
                        Local Local_adreslo_read As Byte
                        Local Local_tempb_read As Byte
                        Local_tempw_read = Adres 'naslov ve EXT. EE
                        Local_adreshi_read = High(local_tempw_read) 'MSB za EE
                        Local_adreslo_read = Low(local_tempw_read) 'LSB za EE
                        Local_tempw_read = Highw(adres)
                        Shift Local_tempw_read , Left , 1 '
                        Local_tempb_read = Low(local_tempw_read) 'Addressw Or Low(local_tempw_read)
                        I2cstart #2 'generate start
                        I2cwbyte Local_tempb_read , #2 'slave adsress
                        I2cwbyte Local_adreshi_read , #2 'address of EEPROM
                        I2cwbyte Local_adreslo_read , #2 'address of EEPROM
                        I2crepstart #2
                        Local_tempb_read = Local_tempw_read + 1
                        I2cwbyte Local_tempb_read , #2 'slave address (read)
                        I2crbyte Datae , Nack , #2 'read byte
                        I2cstop #2
                        End Sub

                        'end program

                        دیدگاه

                        لطفا صبر کنید...
                        X