I2C EEPROM kezelése

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
Atesz
Tranzisztorgyógyász
Hozzászólások: 164
Csatlakozott: 2006. január 19. csütörtök, 7:00

Hozzászólás Szerző: Atesz »

Jól értem a kapcsolási rajzon a leírást: Ne helyettesítsem az LM2936Z-5 -öt. Pl. LM78L05-el? Ha igen akkor miért ne?
Avatar
vavi
Biztosítékgyilkos
Hozzászólások: 72
Csatlakozott: 2006. április 29. szombat, 6:00

Hozzászólás Szerző: vavi »

Nem tudom, én spec nem vettem figyelembe. Sima 78L05-öt raktam bele. Lassan 6 éve megvan, nem volt vele gond. Mondjuk az utóbbi 2 évben nem sokat használtam, vettem komolyabbat.
kukuri
Bitmanipulátor
Hozzászólások: 132
Csatlakozott: 2014. január 20. hétfő, 12:50

Re: I2C EEPROM kezelése

Hozzászólás Szerző: kukuri »

Üdv!
Valaki tud egy normális linket ahol az I2C lib fent van?
Van egy RTC-m és szeretném a memóriát használni rajta.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: I2C EEPROM kezelése

Hozzászólás Szerző: Robert »

Mit szeretnél vele? Bascom alatt NEM libekben gondolkodunk ilyen egyszerű feladatnál.
24LC32 van rajta ha jól emlékszem.

Adatlap alapján a byte alapú kezelés nagyon egyszerű...
Pl:
http://mcselec.com/index2.php?option=co ... 5b82982ed0

Kb mintakód (ollózva):

Kód: Egész kijelölése

'--- Ala padatok ---
$crystal = 16000000                                         'Sebesseg
'$regfile = "M168def.dat"                                    'Chip
'$regfile = "M8def.dat"                                      'Chip
$regfile = "M328pdef.dat"                                   'Chip
$baud = 9600
$swstack = 128
$hwstack = 128
$framesize = 128


Config I2cdelay = 10                                        ' default slow mode:5
Config Sda = Portc.4
Config Scl = Portc.5


'I2C EEPROM
   Declare Sub I2c_ram_write(address_desired As Word , Content As Byte)
   Declare Sub I2c_ram_read(address_desired As Word)
   Dim I2c_eeprom_address_desired As Word                   ' I2C EEPROM address counter (provides for 65536 locations).
   Dim I2c_eeprom_address_high_byte As Byte                 ' High byte of EEPROM address.
   Dim I2c_eeprom_address_low_byte As Byte                  ' Low byte of EEPROM address.
   Dim I2c_eeprom_counter As Byte
   Const Eeprom_chip_write_command = &B10100000             ' Family "A", Device/unit 1, write.
   Const Eeprom_chip_read_command = &B10100001              ' Family "A", Device/unit 1, Read.

Prog4:
   'I2C detect
   Print "I2c-locator 1=no_device 0=device"
   Print
   Print "     0    2    4    6    8    A    C    E"
   Print " 00 ";
   For Temp1b = 0 To 254 Step 2
      Temp2b = Temp1b Mod 16                                ' addresses
      If Temp2b = 0 And Temp1b > 0 Then
         Print                                              ' end of line?
         Print " " ; Hex(temp1b) ; " ";
      End If
      I2cstart                                              ' generate start
      I2cwbyte Temp1b
      Print " " ; Err ; "   ";                              ' 1 no device, 0 device
      I2cstop
   Next Temp1b
   Print
   Wait 3


   Prog10:
      Input "Irasteszt (0-kihagy)" , Temp1b
      If Temp1b = 0 Then Goto Prog10olvas
      I2c_eeprom_address_desired = 0                        ' We start writing at EEPROM address zero.
      Print "Start I2CWrite (32 byte)"
      Temp1b = 0                                            ' Generate test data (=0<256).
      Do
         Call I2c_ram_write(i2c_eeprom_address_desired , Temp1b)       ' Write it to the EEPROM.
         Incr I2c_eeprom_address_desired                    ' Increment EEPROM address location desired.
         Incr Temp1b                                        ' Generate test data (=0<256).
         Toggle Led
      Loop Until I2c_eeprom_address_desired = 32
      Print "Mind beirva."                                  ' Tell what is going on.
      Prog10olvas:
      Print
      Print "Visszaolvasas...."

      I2c_eeprom_address_desired = 0                        ' We start reading at EEPROM address zero.
      Do
         Call I2c_ram_read(i2c_eeprom_address_desired)      ' Call sub to read from device.
         Decr I2c_eeprom_counter                            ' Decrement loop counter.
         If Err = 0 Then                                    ' Check status of operation.
            Print "OK:  " ; I2c_eeprom_address_desired ; " " ; Temp1b       ' Report success.
         Else                                               ' or
            Print "Hiba:" ; I2c_eeprom_address_desired      ' Reeort failure.0
         End If
         Incr I2c_eeprom_address_desired                    ' Increment address counter.
         Waitms 100
      Loop Until I2c_eeprom_address_desired = 32
      Print "Visszaolvasva"                                 ' Tell what is going on.
      Wait 5

END


Sub I2c_ram_write(address_desired As Word , Content As Byte)       ' Writes data to the I2C EEPROM.
   I2c_eeprom_address_low_byte = Low(address_desired)       ' Extract low byte of address to be written.
   I2c_eeprom_address_high_byte = High(address_desired)     ' Extract high byte of addesss to be written.
   I2cstart                                                 ' Send I2C Start.
   I2cwbyte Eeprom_chip_write_command                       ' Select MicroChip EEPROM device type, address and write bit.
   I2cwbyte I2c_eeprom_address_high_byte                    ' Send high address to write to.
   I2cwbyte I2c_eeprom_address_low_byte                     ' Send low address to write to.
   I2cwbyte Content                                         ' Send the data to be written.
'   If Err = 0 Then                                          ' check status of operation.
'      Print "OK:   " ; Address_desired                      ' Report success.
'   Else                                                     ' or
'      Print "Hiba: " ; Address_desired                      ' Report failure.
'   End If
   I2cstop                                                  ' All we want to do is done.
   Waitms 10                                                ' Wait for write to finish up.
End Sub

Sub I2c_ram_read(address_desired As Word)                   ' Reads data from the I2C EEPROM.
   I2c_eeprom_address_low_byte = Low(address_desired)       ' Extract low byte of address to be read.
   I2c_eeprom_address_high_byte = High(address_desired)     ' Extract high byte of address to be read.
   I2cstart                                                 ' Send I2C Start..
   I2cwbyte Eeprom_chip_write_command                       ' Select MicroChip EEPROM device type, address and write bit
   I2cwbyte I2c_eeprom_address_high_byte                    ' Send high byte of address to read from.
   I2cwbyte I2c_eeprom_address_low_byte                     ' Send low byte of address to read from.
   I2cstart                                                 ' Issue another start sequence.
   I2cwbyte Eeprom_chip_read_command                        ' Select MicroChip EEPROM device type, address and read bit
   I2crbyte Temp1b , Nack                                   ' Read data from desired location in chip.
   I2cstop                                                  ' All we want to do is done.
End Sub
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Re: I2C EEPROM kezelése

Hozzászólás Szerző: winnerbt »

Sziasztok!
BascomAVRben meg tudom azt csinálni, hogy I2Cwbyte visszajöjjön az ACK előtt? Tehát kimegy a byte és nekem akkor kellene más bitet állítanom, valamint, ha "átveszem a vezérlést" az I2C porton (én kibillegtetem ezt az 1 byte-ot), akkor hogyan tudom visszaadni a vezérlést a Bascomnak? Most az SDA portot kimenetnek állítom, majd 'ki-órajelezem' az adatot, utána az SDA-t bemenetnek állítom, adok még egy extra órajelet (ez elméletileg az ACK) aztán úgy hagyom, jönnek a Bascom I2C adatfolyamok... Ha nincs ötlet, akkor kibitezem mind a 4 byte-ot, de akkor is vissza kellene állítani (?) valamit.
Azért az üljön sünbe, aki a microchipnél kiagyalta ezt az idióta vezérlési módot.
Válasz küldése