logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak odczytać pamięć 24C01 przez I2C w assemblerze? Sprawdzenie kodu

25 Cze 2006 23:02 1443 8
REKLAMA
  • #1 2763720
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #2 2763775
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    djFoBoS napisał:

    czy ktos moglby zucic okiekiem na moj kod i powiedziec co niby jest nie tak?
    
    
    ;****************
    i2c_start:
    			SETB SDA
    			SETB SCL
    			
    			CALL delay_5us
    
    			CLR SDA
    			call delay_5us
    
    RET
    ;*****************************************************
    


    Czy Twoim zdaniem , to jest prawidłowa sekwencja start ?
    Moim zdaniem - NIE ;)
  • #3 2763788
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • Pomocny post
    #4 2763820
    Skubik
    Poziom 15  
    Posty: 106
    Pomógł: 12
    Ocena: 2
    Kiedys napisałem takie proceudy pod asm i działały bez problemu

    bit stopu
    clr	scl
    clr	sda
    setb	scl
    setb	sda


    bit startu
    setb	sda
    setb	scl
    clr		sda
    clr		scl


    ;       **************************************************
    ;       *  Procedura wysłania bajtu na magistrale I2C    *
    ;       **************************************************
    
    wysl_e:
    		mov 	r1,#8			;do R1(rejest roboczy) wpisujemy 8 bo 8 bitów wysyłamy
    		clr		scl				;scl=0
    wysw_e1:
    		rlc		a   			;przesówamy w lewo ACC z flagš C, najstarszy bit w ACC idzie do flagi C
    		mov 	sda,c			;na sda wystawiamy to co we fladze C
    		setb 	scl				;scl=1  \jeden takt (prawie)
    		
    		clr 	scl				;scl=0	/
    		djnz 	r1,wysw_e1		;gdy R1 rózne od 0 to skocz do wysw_e1
    		setb	sda				;sda=1 zeby mozliwe było odebranie bitu potwierdzenia odbioru
    		jb		sda,$			;czekanie czu urzdzenie zewnetrzne na I2C odebrało bajt 
    		setb 	scl				;scl=1	\jeden takt
    		
    		clr 	scl				;scl=0	/kaskowanie potwierdzenia
    		ret


    ;       **************************************************
    ;       *   Procedura odczytu bajtu z magistrali I2C     *
    ;		*          z potwiedzeniem odbioru               *
    ;       **************************************************
    
    odcz_e:							
    
    		mov 	r1,#8			;do R1(rejest roboczy) wpisujemy 8 bo 8 bitów odbieramy
    		clr		scl				;scl=0 
    		setb	sda				;sda=1 zeby mozliwy był odbiór (wsytawianie bitów przez urzadzenie zewnetrze)
    		
    odcz_e1:		
    		setb 	scl				;scl=1
    		mov 	c,sda			;do flagi C wpisujemy bit jaki jest na sda
    		rlc		a				;przesówamy w lewo ACC z flagš C, flaga C idzie na najmłodszy bit ACC
    		clr		scl				;scl=0
    		djnz 	r1,odcz_e1		;gdy R1 rózne od 0 to skocz do odcz_e1
    		clr		sda				;sda=0 (potwierdzenie odbioru przez procka)
    		setb 	scl				;scl=1	\jeden takt
    		clr 	scl				;scl=0	/zeby urzadzenie zewnetrze odebrało potwierdzenie odbioru
    		setb 	sda				;sda=1 zeby mozliwe było wystawianie danych na sda przez zewnetrze urzadzenia
    		ret
    


    ;       **************************************************
    ;       *   Procedura odczytu bajtu z magistrali I2C     *
    ;		*         bez potwiedzeniem odbioru              *
    ;       **************************************************
    		
    odczk_e:					
    		mov 	r1,#8		;do R1(rejest roboczy) wpisujemy 8 bo 8 bitów odbieramy
    		clr		scl			;scl=0 
    		setb	sda			;sda=1 zeby mozliwy był odbiór (wsytawianie bitów przez urzadzenie zewnetrze)
    odczk_e1:		
    		setb 	scl			;scl=1
    		mov 	c,sda		;do flagi C wpisujemy bit jaki jest na sda
    		rlc		a			;przesówamy w lewo ACC z flagš C, flaga C idzie na najmłodszy bit ACC
    		clr		scl			;scl=0
    		djnz 	r1,odczk_e1	;gdy R1 rózne od 0 to skocz do odczk_e1
    		setb 	sda				;sda=1 zeby mozliwe było wystawianie danych na sda przez zewnetrze urzadzenia
    		ret
    
    


    Zeby odczytac doc z urzadzenia przez I2C należy wysałac
    1 bit startu
    2 adres urzadzenia i ze chcemy zapisac do niego dane( ostatni bit adresu 0)
    3 adres w pamieci urzadzenia
    4 bit stopu
    5 bit startu
    6 adres urzadzenia i ze chcemy odczytac z niego dane ( ostatni bit adresu 1)
    7 oczytujemy dane jakie wysyła urzadznie
    8 bit stopu

    Pisałem z pamieci wiec mogą byc pomyłki
  • REKLAMA
  • #5 2763836
    Konto nie istnieje
    Konto nie istnieje  
  • #6 2763892
    Skubik
    Poziom 15  
    Posty: 106
    Pomógł: 12
    Ocena: 2
    Uzywałem rezystory podciagające 2,4k

    Edit:
    Jak dobrze pamietam dla pamieci 24c02 pirwsze 4 bity adresu urzadznia to 1010 nastepne 3 bity ustawiane są przez odpowiedznie podłaczenie pinów A0, A1, A2 pamieci do masy lub zasilania i ostatni bit to czy chcesz czytac czy zapisyac.
  • REKLAMA
  • #7 2763898
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #8 2763907
    Skubik
    Poziom 15  
    Posty: 106
    Pomógł: 12
    Ocena: 2
    Pamięc podpinałem pod port P1 i dawałem rezystory i musza tam byc bo pamieć nie bedzie jak miała wystawic 1 logicznej.
  • #9 2763930
    Konto nie istnieje
    Konto nie istnieje  

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z odczytem pamięci EEPROM 24C01 przez magistralę I2C za pomocą kodu w asemblerze dla mikrokontrolera 89C430. Głównym problemem była nieprawidłowa sekwencja startu I2C oraz brak sygnału ACK podczas transmisji, co mogło wynikać z braku lub niewłaściwej wartości rezystorów podciągających na liniach SDA i SCL. Zalecane jest stosowanie rezystorów podciągających o wartości około 4,5 kΩ do 6 kΩ, które umożliwiają poprawne wystawienie stanu logicznego „1” przez pamięć. Adresowanie pamięci 24C01/24C02 opiera się na stałym prefiksie 1010, a kolejne bity adresowe zależą od podłączenia pinów A0, A1, A2 do masy lub zasilania. Po zapisie do pamięci należy odczekać około 10 ms na zakończenie operacji. Przykładowe procedury startu, stopu i wysyłania bajtu na magistralę I2C w asemblerze zostały przedstawione i omówione, wskazując na konieczność prawidłowego generowania sygnałów zegarowych i danych oraz oczekiwania na potwierdzenie ACK od urządzenia. Po zastosowaniu odpowiednich rezystorów podciągających i korekcie sekwencji startu, odczyt pamięci zadziałał poprawnie.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA