tulis baca eeprom internal atmega128

void writeeeprom(unsigned int alamat, unsigned char datana)
{
loop_until_bit_is_clear(EECR,EEWE);
EEAR = alamat;
EEDR = datana;
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
}

unsigned char readeeprom(unsigned int alamat)
{
unsigned char dataeeprom;
loop_until_bit_is_clear(EECR,EEWE);
EEAR = alamat;
EECR |= (1<<EERE);
dataeeprom=EEDR;
return dataeeprom;
}

kalo datanya penting penting banget kalo bisa pakai eeprom eksternal lah. apalagi kalo penulisan ke eeepromnya minimal 1 menit sekali, itu mah udah harus pakai eksternal. sebuah ic yang fungsinya banyak lebih jelek daripada ic yang fungsinya  khusus untuk 1 pekerjaan.

itu perkataan siapa ya dulu, tapi memang benar. sudah terbukti.

Iklan

i2c manual (atmega 8 —- at24c04)

I2C versi 1.0 dikenalkan oleh Philips pada tahun 1992, direvisi menjadi versi 2.0 pada tahun 1998, setahun kemudian direvisi lagi menjadi versi 2.1

Komunikasi data secara I2C dilakukan melalui dua saluran, masing-masing adalah saluran data secara seri (SDA) dan saluran clock (SCL), kedua saluran ini dikenal sebagai I2C Bus yang dipakai menghubungkan banyak IC I2C untuk berbagai macam keperluan. IC-IC I2C itu dibedakan menjadi induk (master) dan anak buah (slave), yang dimaksud dengan induk adalah peralatan I2C yang memulai transfer data dan yang membangkitkan clock (SCK). Yang bertindak sebagai master adalah Mikrokontroler yang bertugas mengendalikan I2C Bus.

i2c

berikut potongan programnya:

$regfile = “m8def.dat”
$crystal = 8000000
$baud = 9600

Sdaout Alias Portc.4
Sdain Alias Pinc.4

Sclout Alias Portc.5
Sclin Alias Pinc.5

Ddrscl Alias Ddrc.5
Ddrsda Alias Ddrc.4

_ack Alias 1
No_ack Alias 0
Declare Sub I2c_write(byval Datana As Byte)
Declare Sub I2c_read(datana As Byte , Byval Ack_bit As Byte)
Declare Sub Readi2ceeprom(byval Alamatdevice As Byte , Byval Alamat As Byte , Datana As Byte)
Declare Sub Writei2ceeprom(byval Alamatdevice As Byte , Byval Alamat As Byte , Byval Datana As Byte)

Dim Dataeeprom As Byte
Dim Index As Byte

Utama:
Index = 0
Do
Call Writei2ceeprom(&B10100000 , Index , Index)
Incr Index
Loop Until Index = 33

Index = 0
Do
Call Readi2ceeprom(&B10100000 , Index , Dataeeprom)
Incr Index
Loop Until Index = 33
Print “selesai”
Do
Loop

Goto Utama

I2c_start:
Set Ddrsda
Set Ddrscl
Set Sdaout
Set Sclout
Waitus 10
Reset Sdaout
Waitus 10
Reset Sclout
Return

I2c_stop:
Set Ddrsda
Set Ddrscl
Reset Sdaout
Reset Sclout
Waitus 10
Set Sclout
Waitus 10
Set Sdaout
Return

Sub I2c_write(byval Datana As Byte)
Local I As Byte
Set Ddrsda
Set Ddrscl
Reset Sclout
For I = 7 To 0 Step -1
If Datana.i = 1 Then
Set Sdaout
Else
Reset Sdaout
End If
Waitus 5
Set Sclout
Waitus 8
Reset Sclout
Next I
Set Sclout
Waitus 5
Reset Sclout
End Sub

Sub I2c_read(datana As Byte , Byval Ack_bit As Byte)
Local I As Byte
Datana = 0
Reset Ddrsda
Set Ddrscl
Reset Sclout
For I = 7 To 0 Step -1
Waitus 10
Datana.i = Sdain
Set Sclout
Waitus 10
Reset Sclout
Next I
Set Ddrsda
If Ack_bit = 1 Then
Reset Sdaout
Else
Set Sdaout
End If
Waitus 10
Set Sclout
Waitus 10
Reset Sclout
End Sub

Sub Readi2ceeprom(byval Alamatdevice As Byte , Byval Alamat As Byte , Datana As Byte)
Gosub I2c_start
Call I2c_write(alamatdevice)
Call I2c_write(alamat)
Gosub I2c_start
Call I2c_write(&Ha1)
Call I2c_read(datana , No_ack)
Gosub I2c_stop
Waitms 10
Print Datana
End Sub

Sub Writei2ceeprom(byval Alamatdevice As Byte , Byval Alamat As Byte , Byval Datana As Byte)
Gosub I2c_start
Call I2c_write(alamatdevice)
Call I2c_write(alamat)
Call I2c_write(datana)
Gosub I2c_stop
Waitms 10
End Sub

‘==================================================

Sinyal dasar I2C meliputi sinyal START, STOP dan ACK sebagai berikut :

SCK merupakan sinyal clock untuk ‘mendorong’ data di SDA, dalam keadaan tidak ada transfer data SDA dan SCK harus dalam keadaan ‘1’. Data di SDA boleh berubah hanya pada saat SCK =’0’, isi SDA diambil peralatan I2C pada saat SCL berubah dari ‘1’ menjadi ‘0’. Jika terjadi perubahan SDA pada saat SCL = ‘1’, perubahan itu diartikan sebagai sinyal START atau STOP.

·        Sinyal START menandakan master akan mulai mengirim data,  sinyal ini  berupa perubahan tegangan SDA dari ‘1’ menjadi ‘0’ pada saat SCK=’1’..

·        Sinyal STOP menandakan master akan mengakhiri komunikasi data, sinyal ini  berupa perubahan tegangan SDA dari ‘0’ menjadi ‘1’ pada saat SCK=’1’. .

Catatan : Sinyal START dan STOP muncul saat awal dan akhir pengiriman 1 blok data, bukan sinyal yang muncul pada awal dan akhir pengiriman 1 byte data.

device address untuk at24c04

1010 A2 A1 P0 R/W

misal untuk alamat 0 device addresnya 0b10100000

misal untuk alamat 256 device addresnya 0b10100010

p0 merupakan page. pada at24c04 kalo po=0 maka alamat yang diakses 0-255

p0 merupakan page. pada at24c04 kalo po=1  maka alamat yang diakses 256-512

nyiksa eeprom spi m95256 pake bascom avr

peuting kuring ngimpi disiksa ku eeprom spi m95256, duka gara2 naon bisa ngimpi eta, maenya dina jero ngimpi kuring titah ngecek alamat hiji hiji, sebenerna kuring teh ngoprek eeprom eta teh 3 poe ka tukang, naha bet ayeuna balas dendam, cape di udak udak ku eeprom spi, teu hayang deui, teu bisa sare di jam12 -jam 04.00, mun aya ku urang di duruk

tah ieu pagawean ngadodet eeprom spi m95256

spi1ieu jeroan alamat memorina

spi2

ieu programna

$regfile = “M8DEF.DAT”
$crystal = 8000000
$baud = 9600

Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1
Spiinit

Selct Alias Portb.1
Config Selct = Output
Set Selct

Declare Sub Eepromtest
Declare Sub E_write(byval E_addr As Word , Byval Dat As Byte)
Declare Sub E_read(byval E_addr As Word , E_dat As Byte)
Dim Schr As Byte
Dim Dat As Byte
Dim E_addr As Word
Dim E_dat As Byte
Dim E_ah As Byte
Dim E_al As Byte
Dim E_ctlw As Byte
Dim E_ctlr As Byte

Schr = &H06 ‘Write Enable
E_ctlw = &H02 ‘Write to Memory Array
E_ctlr = &H03 ‘Read from Memory Array

Dim Addr As Word
Dim Temp As Byte
Addr = 0
Temp = 0
‘==========================================
Utama:
Call Eepromtest
Incr Addr
Incr Temp
If Temp >= 100 Then
Temp = 0
End If
If Addr >= &H1000 Then
Addr = 0
Do
Print “selesai”
Loop
End If
Goto Utama
‘==========================================

Sub Eepromtest
Call E_write(addr , Temp)
Call E_read(addr , E_dat)
Print E_dat
End Sub

Sub E_write(byval E_addr As Word , Byval Dat As Byte)
E_ah = High(e_addr)
E_al = Low(e_addr)
Reset Selct
Spiout Schr , 1 ‘Write Enable
Set Selct
Reset Selct
Spiout E_ctlw , 1 ‘Schreibbefehl
Spiout E_ah , 1 ‘Adresse
Spiout E_al , 1 ‘Adresse
Spiout Dat , 1 ‘Daten schreiben
Set Selct

End Sub

Sub E_read(byval E_addr As Word , E_dat As Byte)
E_ah = High(e_addr)
E_al = Low(e_addr)
Set Selct
Waitms 10
Reset Selct
Spiout E_ctlr , 1 ‘Lesebefehl
Spiout E_ah , 1 ‘Adresse
Spiout E_al , 1 ‘Adresse
Spiin E_dat , 1 ‘Daten lesen
Set Selct
End Sub