Problem z komunikacją z EEPROM

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Problem z komunikacją z EEPROM

Post autor: Jasam » 08 cze 2008, 19:58

Koledzy... pomóżcie proszę. Podłączyłem pamięć typu AT24c256 do ATtiny26. Linie magistrali I2c podłaczyłem do portów pa6 i pa7. Jednak nie mogę nic odczytać z tej pamięci. Wszystkie wejścia adresujące pamięci sciągnąłem do masy. Wiem, że pami·ęć jest sprawna poniewać za pomocą ponyproga mogę z niej wszystko sczytac, a także zapisać na nią.

Kod: Zaznacz cały

$regfile="attiny26"
$crystal=4000000
Declare Sub Czytaj(adres As Byte , Zawartosc As Byte)
Dim Adres As Byte , Zawartosc As Byte , I As Integer
Cls
Lcd "testnowy"
Wait 1

Adres = 0

 Do
Incr Adres
Call Czytaj(adres , Zawartosc)
Cls
 Lcd Zawartosc
 Lowerline
Lcd "-adres:" ; Adres
Waitms 300
Loop





 Sub Czytaj(adres As Byte , Zawartosc As Byte)

 I2cstart

 I2cwbyte 160

 I2cwbyte Adres

 I2cstart

 I2cwbyte 161

 I2crbyte Zawartosc , 9

 I2cstop
End Sub
czy coś jest źle w programie?
uprzedzam pytania. linie i2c i lcd są skonfigurowane w komnpilatorze i są dobrze skonfigurowane.

Awatar użytkownika
radzio
Użytkownik
Posty: 573
Rejestracja: 07 gru 2004, 23:06
Lokalizacja: Sosnowiec
Kontakt:

Post autor: radzio » 08 cze 2008, 22:21

Czytałeś datasheeta? Źle adresujesz komórkę pamięci.

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 08 cze 2008, 22:27

Czytałem i wydawało mi się, że dobrze to robię. Więc jak powinno być?

Awatar użytkownika
radzio
Użytkownik
Posty: 573
Rejestracja: 07 gru 2004, 23:06
Lokalizacja: Sosnowiec
Kontakt:

Post autor: radzio » 09 cze 2008, 7:34

Adres komórki składa się z dwóch bajtów (jeśli na pewno chodzi o 24C256), tak więc powinien być typu Word a nie Byte.

Awatar użytkownika
Tranzystor
Użytkownik
Posty: 889
Rejestracja: 28 sie 2005, 19:19
Lokalizacja: Świętochłowice
Kontakt:

Post autor: Tranzystor » 09 cze 2008, 7:50

Lub powinien się składać z dwóch bajtów i wtedy powinno to wyglądać mniej więcej tak:

Kod: Zaznacz cały

I2cstart
I2cwbyte 160
I2cwbyte Adres1
I2cwbyte Adres2
I2cstart
I2cwbyte 161
I2crbyte Dane, Nack
I2cstop
Prościej się już nie da...

Pozdrawiam ;)

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 09 cze 2008, 11:56

Dzięki.. Już widzę swój błąd. Naprawdę dziekuje :)

[ Dodano: 2008-06-09, 13:00 ]
Czyli program po przeróbce powinien wyglądać dokłądnie tak prawda?'

Kod: Zaznacz cały


	

$regfile="attiny26"
$crystal=4000000
Declare Sub Czytaj(adres As Word , Zawartosc As Byte)
Dim Adres As Word , Zawartosc As Byte
Cls
Lcd "testnowy"
Wait 1

Adres = 0

 Do
Incr Adres
Call Czytaj(adres , Zawartosc)
Cls
 Lcd Zawartosc
 Lowerline
Lcd "-adres:" ; Adres
Waitms 300
Loop





 Sub Czytaj(adres As Word , Zawartosc As Byte)

 I2cstart

 I2cwbyte 160

 I2cwbyte Adres

 I2cstart

 I2cwbyte 161

 I2crbyte Zawartosc , 9

 I2cstop
End Sub 

Awatar użytkownika
radzio
Użytkownik
Posty: 573
Rejestracja: 07 gru 2004, 23:06
Lokalizacja: Sosnowiec
Kontakt:

Post autor: radzio » 09 cze 2008, 12:08

Raczej nie, bo skoro i2cwbyte to można przypuszczać, że zapisuje ona tylko bajt. Musisz rozbić zmienną word na dwa bajty.

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 09 cze 2008, 12:09

Więc jak rozbić jeden adres na dwa bajty?

Awatar użytkownika
radzio
Użytkownik
Posty: 573
Rejestracja: 07 gru 2004, 23:06
Lokalizacja: Sosnowiec
Kontakt:

Post autor: radzio » 09 cze 2008, 12:17

Mniej więcej tak :

Kod: Zaznacz cały

  Lsb = Adres And 255
  Shift Adres , Right , 8
  Msb = Adres And 255

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 09 cze 2008, 12:31

a potem?
Czy dobrze rozumiem, że trzeba je potem wysłać w ten sposób?

Kod: Zaznacz cały

$regfile="attiny26"
$crystal=4000000
Declare Sub Czytaj(adres As Word , Zawartosc As Byte)
Dim Adres As Word , Zawartosc As Byte, Lsb as Byte, Msb as Byte
Cls
Lcd "testnowy"
Wait 1

Adres = 0

 Do
Incr Adres
Call Czytaj(adres , Zawartosc)
Cls
 Lcd Zawartosc
 Lowerline
Lcd "-adres:" ; Adres
Waitms 300
Loop





 Sub Czytaj(adres As Word , Zawartosc As Byte)

  Lsb = Adres And 255
  Shift Adres , Right , 8
  Msb = Adres And 255

 I2cstart

 I2cwbyte 160

 I2cwbyte Msb
 I2cwbyte Lsb

 I2cstart

 I2cwbyte 161

 I2crbyte Zawartosc , 9

 I2cstop
End Sub 
Ostatnio zmieniony 09 cze 2008, 12:38 przez Jasam, łącznie zmieniany 1 raz.

Awatar użytkownika
radzio
Użytkownik
Posty: 573
Rejestracja: 07 gru 2004, 23:06
Lokalizacja: Sosnowiec
Kontakt:

Post autor: radzio » 09 cze 2008, 12:33

Najpierw MSB (starszy baj) a potem LSB.

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 09 cze 2008, 12:38

ale sposób jest dobry tak?

Awatar użytkownika
radzio
Użytkownik
Posty: 573
Rejestracja: 07 gru 2004, 23:06
Lokalizacja: Sosnowiec
Kontakt:

Post autor: radzio » 09 cze 2008, 12:43

Tak

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 09 cze 2008, 12:51

Dziękuję. Będę mógł dopiero wieczorem najprawdopodobniej w praktyce sprawdzić jak to działa, ale wydaje się rzeczywiście być dobrze. Dziękuje.

[ Dodano: 2008-06-10, 13:37 ]
Koledzy... Okazało się że to dalej nie działa. Gdzie tutaj jest błąd?

[ Dodano: 2008-06-10, 14:34 ]
Może to wina procesora? Czasami niektóre funkcje nie działają na niektórych procesorach. Na przykład sendrc5 nie da sie na nim zastosować ze względu na inną budowę liczników. może to problem tej samej natury?

[ Dodano: 2008-06-11, 08:17 ]
Zmieniłem procesor na Atmege8 ale problem jest dokładnie ten sam. Więc to chyba wina programu. I jeszcze ciekawa sprawa. Procesor zaczyna zwiększać stan zmiennej Adres dopiero kiedy zbliżę rękę do EEPROMU. Często (i ATtiny26 i ATmega8) zawieszają się przy wyświetleniu komunikatu testowego. Kiedy pamięć jest wyciągnięta z podstawki to nie następuje. Tu macie schemat układu:

Obrazek

pomóżcie proszę....

Awatar użytkownika
gwozdex
Użytkownik
Posty: 879
Rejestracja: 24 lut 2006, 10:04
Lokalizacja: Czechowice-Dziedzice
Kontakt:

Post autor: gwozdex » 17 cze 2008, 22:49

Oto z jakich procedur ja korzystam obsługując tę pamięć:

Kod: Zaznacz cały

Const Adr_w = 160             'adres zapisu danej do pamieci EEPROM
Const Adr_r = 161             'adres odczytu danej do pamieci EEPROM


Declare Sub Zap_eeprom(byval Adres As Word , Byval Dana As Byte)       'procedura zapisu danej do pamieci
Declare Sub Odc_eeprom(byval Adres As Word , Dana As Byte)       'procedura odczytu danej z pamieci

Dim Adres As Word             'zmienna adresu komorki pamieci
Dim Adr_h As Byte             'bardziej znaczaca polowka adresu
Dim Adr_l As Byte             'mniej znaczaca polowka adresu
Dim Dana As Byte              'zmienna zmienna na odczytana lub zapisana dana do pamieci

Sub Zap_eeprom(byval Adres As Word , Byval Dana As Byte)       'procedura zapisu danej do EEPROM
  Adr_h = High(adres)         'zapis do Adr_h bardziej znaczacej polowki adresu
  Adr_l = Low(adres)          'zapis do Adr_l mniej znaczacej polowki adresu
  I2cstart                    'start transmisji
  I2cwbyte Adr_w              'zapis adresu ukladu pamieci do zapisu
  I2cwbyte Adr_h              'bardziej znaczacy adres komorki pamieci
  I2cwbyte Adr_l              'mniej znaczacy adres komorki pamieci
  I2cwbyte Dana               'zapis danej
  I2cstop                     'koniec transmisji
  Waitms 7                    'opoznienie 7 ms
End Sub                       'koniec procedury

Sub Odc_eeprom(byval Adres As Word , Dana As Byte)       'procedura odczytu danej do EEPROM
  Adr_h = High(adres)         'zapis do Adr_h bardziej znaczacej polowki adresu
  Adr_l = Low(adres)          'zapis do Adr_l mniej znaczacej polowki adresu
  I2cstart                    'start transmisji
  I2cwbyte Adr_w              'zapis adresu ukladu pamieci do zapisu
  I2cwbyte Adr_h              'bardziej znaczacy adres komorki pamieci
  I2cwbyte Adr_l              'mniej znaczacy adres komorki pamieci
  I2cstart                    'ponowny start transmisji
  I2cwbyte Adr_r              'zapis adresu ukladu pamieci do odczytu
  I2crbyte Dana , Nack        'odczyt bajta danej - bez potwierdzenia sygnałem ACK
  I2cstop                     'koniec transmisji
End Sub                       'koniec procedury
Są sprawdzone i działają na 100%
Podciągnąłeś linie SDA SCL do +5V??

ODPOWIEDZ