Cześć, chciałem sobie podłączyć zewnętrzny eeprom do atmega8 przez interfejs TWI, napisałem procedury ale niestety nie działają i nie wiem w czym jest problem.
Linie NC eepromu pozostawiłem bez połączenia, A1 i A0 zwarłem do masy, piny te służą do zaadresowania max 4 kostek eeprom na interfejsie TWI i tutaj dla pewności zapytam czy jeśli zwarłem je do masy to później w programie kiedy jako pierwszy bajt wysyłam adres urządzenia to adres tej kostki w miejscach przeznaczonych na A1 i A0 będzie '00', czy tak?? SDA i SCL przez 10k do zasilania, Vcc i GND to wiadomo, a WP do masy...
Moje procedury:
Aby sprawdzić działanie chciałem najpierw zapisać bajt pod jakiś adres a potem go odczytać spod tego samego adresu ale się nie udało...
I potem miało się to wyświetlić na LCD ale niestety efektem był migający kursor, procedury obsługi LCD mi działają na 100% więc nie w tym problem.
Zamieszczam jeszcze z noty eepromu przebiegi zapisu i odczytu:
Dodano po 2 [minuty]:
Znajduja się tutaj przebiegi zapisu, odczytu i format pierwszego bajtu.
Wszelkie pomysły i sugestie bardzo wskazane...
Z góry dzięki,
Pozdrawiam
Linie NC eepromu pozostawiłem bez połączenia, A1 i A0 zwarłem do masy, piny te służą do zaadresowania max 4 kostek eeprom na interfejsie TWI i tutaj dla pewności zapytam czy jeśli zwarłem je do masy to później w programie kiedy jako pierwszy bajt wysyłam adres urządzenia to adres tej kostki w miejscach przeznaczonych na A1 i A0 będzie '00', czy tak?? SDA i SCL przez 10k do zasilania, Vcc i GND to wiadomo, a WP do masy...
Moje procedury:
;********************************************************************
;Ustawienie zegara Fscl = 100kHz
;Wzór na stronie 167 noty aplikacyjnej Atmega8
sbi DDRC, 4
sbi DDRC, 5 ;piny TWI jako wyjścia
ldi r16, 32
out TWBR, r16
ldi r16, 0b00000000
out TWSR, r16
;********************************************************************
;***********************************************************************
;Procedura transmisji sygnalu 'start'
twi_start: ldi r17, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR, r17
wait_twint:
in r17, TWCR
sbrs r17, TWINT
rjmp wait_twint
ret
;Procedura transmisji sygn 'stop'
twi_stop: ldi r17, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
out TWCR, r17
wait1_twint:
in r17, TWCR
sbrc r17, TWINT
rjmp wait1_twint
ret
;Procedura wyslania bajtu danych
; parametr r16 - dana wejsciowa
twiwrite_r16: ldi r17, (1<<TWINT)|(1<<TWEN)
out TWDR, r16
out TWCR, r17
wait2_twint:
in r17, TWCR
sbrs r17, TWINT
rjmp wait2_twint
ret
;Procedura odczytu bajtu danych
; parametr r16 - dana wyjsciowa
twiread_ACK_r16: ldi r18, (1<<TWINT)|(1<<TWEN)|(1<<TWEA)
out TWCR, r18
wait3_twint:
in r17, TWCR
sbrs r17, TWINT
rjmp wait3_twint
in r16, TWDR
ret
twiread_noACK_r16: ldi r18, (1<<TWINT)|(1<<TWEA)
out TWCR, r18
wait4_twint:
in r17, TWCR
sbrs r17, TWINT
rjmp wait4_twint
in r16, TWDR
ret
;***********************************************************************
;Procedury obslugi zewnetrzengo EEPROM 512kb
;procedura zapisu bajtu pod zadany adres
;parametry r16 - dana wejściowa ; X - adres do zapisu
twiwrite16_tX: push r16
rcall twi_start
ldi r16, 0b10100000
rcall twiwrite_r16
mov r16, XH
rcall twiwrite_r16
mov r16, XL
rcall twiwrite_r16
pop r16
rcall twiwrite_r16
rcall twi_stop
ret
;procedura odczutu bajtu z podanego adresu
;parametr: r16 - odczytany bajt X - adres do odczytu
twireadr16_fX: rcall twi_start
ldi r16, 0b10100000
rcall twiwrite_r16
mov r16, XH
rcall twiwrite_r16
mov r16, XL
rcall twiwrite_r16
rcall twi_start
ldi r16, 0b10100001
rcall twiwrite_r16
rcall twiread_noACK_r16
rcall twi_stop
ret
Aby sprawdzić działanie chciałem najpierw zapisać bajt pod jakiś adres a potem go odczytać spod tego samego adresu ale się nie udało...
ldi r16, 234
ldiw X, 0
rcall twiwrite16_tX
ldiw X, 0
rcall twireadr16_fX
I potem miało się to wyświetlić na LCD ale niestety efektem był migający kursor, procedury obsługi LCD mi działają na 100% więc nie w tym problem.
Zamieszczam jeszcze z noty eepromu przebiegi zapisu i odczytu:
Dodano po 2 [minuty]:
Znajduja się tutaj przebiegi zapisu, odczytu i format pierwszego bajtu.
Wszelkie pomysły i sugestie bardzo wskazane...
Z góry dzięki,
Pozdrawiam