Skocz do zawartości

Odczyt pamięci eeprom I2C, atmega8 asm.


w1941srobot

Pomocna odpowiedź

Witam szukam po internecie jak odczytywać dane z eeprom po i2c w języku asm ale nic nie widzę wszystko w C albo bascomie, a asm dlatego że chce się go nauzyć. Napisałem już część kodu która działa i wysyła bajt pod odpowiedni adres komórki w eeprom 24c04 wszystko według tego TUTORIALU , droga część kodu odpowiedzialna za odebranie bajtu jest zrobiona w połowie ponieważ nw. do czego zapisywany jest bajt i jak go zapisać do zmiennej żeby potem można było użyć jej w bascomie, a tu macie kod:

$regfile = "m8def.dat"                                      'zadeklarowanie użytego procesora
$crystal = 8000000

Config Portd.0 = Output

Declare Sub Wr
Declare Sub Rd
Dim Komorka As Byte
Dim Bajt As Byte
Dim Odczytana As Byte
Komorka = 1
Bajt = 3

Sub Wr                                                      'write(zapis)
$asm

  ldi r16,&B10100100
  Out Twcr , R16                                           'sekwencja startowa

  Wait1:
  in r16,TWCR
  sbrs r16,TWINT                                           ' odczekaj az wysle sekwencje startowa
  rjmp wait1

  LDI r16, &B10100000                             'adres pamieci i ostatni bit 0= zapis
  Out Twdr , R16
  ldi r16, &B10000100
  Out Twcr , R16

  Wait2:
  in r16,TWCR                                              'odczekaj i spr
  sbrs r16,TWINT
  rjmp wait2

  LDS r16, {komorka}		'adres komorki w ktorej ma byc zapisany bajt	
  Out Twdr , R16
  ldi r16, &B10000100                                     
  Out Twcr , R16

  Wait3:
  in r16,TWCR
  sbrs r16,TWINT                                           'odczekaj i spr 
  rjmp wait3

  LDS r16, {bajt}
  Out Twdr , R16                                           'bajt do zapisania i wyslanie
  ldi r16, &B10000100
  Out Twcr , R16

  Wait4:
  in r16,TWCR                                              'odczekaj i spr
  sbrs r16,TWINT
  rjmp wait4

  ldi r16, &B10010100                                      'koniec
  Out Twcr , R16

$end Asm
End Sub

Sub Rd			'read (odczyt)

$asm
  ldi r16,&B10100100
  Out Twcr , R16                                           'sekwencja startowa

  Wait10:
  in r16,TWCR
  sbrs r16,TWINT                                           ' odczekaj az wysle sekwencje startowa
  rjmp wait10

  LDS r16, &B10100000                                      'adres pamieci i ostatni ZAPIS
  Out Twdr , R16
  ldi r16, &B10000100
  Out Twcr , R16

  Wait20:
  in r16,TWCR                                              'odczekaj i spr zy wyslalo adres pamieci
  sbrs r16,TWINT
  rjmp wait20

  LDS r16, &B00000011
  Out Twdr , R16
  ldi r16, &B10000100                                      'adres komorki z ktorej ma nastapic odzyt
  Out Twcr , R16

  Wait30:
  in r16,TWCR			'odczekaj i spr
  sbrs r16,TWINT                                           
  rjmp wait30

  ldi r16,&B10100100                                       'sekwencja startowa
  Out Twcr , R16

  Wait40:
  in r16,TWCR
  sbrs r16,TWINT                                           ' odczekaj az wysle
  rjmp wait50


  LDS r16, &B10100001                                      'adres pamieci i ostatni bit=1 - odczyt
  Out Twdr , R16
  ldi r16, &B10000100
  Out Twcr , R16

  Wait50:
  in r16,TWCR                                              'odczekaj i spr
  sbrs r16,TWINT
  rjmp wait50



'I TU MA BY SaMO ODEBRANIE BAJTU I ZAPISANIE DO ZMIENNEJ W RAM, Jak to zrobić ????



  ldi r16, &B10010100                                      'koniec
  Out Twcr , R16
$end Asm
End Sub

[ Dodano: 29-08-2012, 16:30 ]

POMOCY 🙁.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.