Miller Artur
Guest
Thu Sep 14, 2006 10:22 pm
Drugi dzień walki ... powoli mam dość.
w datasheecie od 24FC.. piszą, że STOP na i2c po zapisie "initiates the
internal write cycle and during this time, the 24XX1025 will not generate
Acknowledge signals". po to oczywiscie, zeby poczekac z zabawą aż pamięc
zapisze to co ma. Fajnie. Jest więc taki kawałek kodu, zerżnięty z jakiejś
noty aplikacyjnej:
[tu jest zapis do pamięci]
TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN); /* send stop condition */
// ACK poll
ack_poll:
TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN); /* send start condition */
while ((TWCR & _BV(TWINT)) == 0) ; /* wait for transmission */
/* send SLA+W */
TWDR = sla | TW_WRITE;
TWCR = _BV(TWINT) | _BV(TWEN); /* start transmission */
while ((TWCR & _BV(TWINT)) == 0) ; /* wait for transmission */
switch ((twst = TW_STATUS))
{
case TW_MT_SLA_ACK: break;
case TW_MT_SLA_NACK: goto ack_poll;
}
TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN); /* send stop condition */
klopot w tym, ze 24FC... zawsze generuje ACK pomimo, ze zapis do pamieci sie
jeszcze nie skonczyl - po jednym zapisie następują następne zapisy lub
odczyty, oczywiście przerywajac proces zapisu, wiec wciaz mam stare
zawartosci komórek.
Kod zapisu jest poprawny, bo jak dam pętelkę wstrzymującą program po zapisie
na kilkaset ms, to wszystko sie ładnie zapisuje. nie moge niestety
zastosowac takiwgo czegos, bo program często pisze do pamięci a takie
wstrzymywanie niefajnie na niego wpłynie ...
aha, na i2c jest tylko 24FC1025 i 2xPCF8574
help pliiiz ... bo strzele sobie w oko z gumy od gaci ... :-|
@
Adam Dybkowski
Guest
Fri Sep 15, 2006 7:19 am
Miller Artur napisał(a):
Quote:
w datasheecie od 24FC.. piszą, że STOP na i2c po zapisie "initiates the
internal write cycle and during this time, the 24XX1025 will not generate
Acknowledge signals". po to oczywiscie, zeby poczekac z zabawą aż pamięc
zapisze to co ma.
[...]
klopot w tym, ze 24FC... zawsze generuje ACK pomimo, ze zapis do pamieci sie
jeszcze nie skonczyl - po jednym zapisie następują następne zapisy lub
odczyty, oczywiście przerywajac proces zapisu, wiec wciaz mam stare
zawartosci komórek.
Kod zapisu jest poprawny, bo jak dam pętelkę wstrzymującą program po zapisie
na kilkaset ms, to wszystko sie ładnie zapisuje. nie moge niestety
zastosowac takiwgo czegos, bo program często pisze do pamięci a takie
wstrzymywanie niefajnie na niego wpłynie ...
No to rusz nieco głową, poświęć trochę czasu i napisz nieblokujące (gdy
się da) funkcje obsługi pamięci korzystające z przerwań. Przykładowo
funkcja zapisu:
- poczekaj na zgaszenie globalnej flagi w RAMie (przez przerwanie)
- wyślij komendę zapisu i dane do pamięci
- zapal tą flagę
- uruchom timer procesora aby wygenerować przerwanie np. za 5 ms
Przerwanie timera:
- zgaś globalną flagę w RAMie
Funkcja odczytu z pamięci:
- poczekaj na zgaszenie globalnej flagi w RAMie
- wyślij komendę odczytu i odbierz dane z pamięci
Jako flaga wystarczy zmienna globalna typu volatile unsigned char.
Ewentualnie możesz dodać jeszcze funkcję tylko sprawdzającą wartość
flagi - aby móc w pętli spożytkować czas oczekiwania na zakończenie
zapisu np. robiąc jakieś obliczenia.
Jak już wszystko będzie działać, możesz pokusić się o buforowanie
zlecenia więcej niż jednego zapisu i wydawanie kolejnych rozkazów do
pamięci w przerwaniu timera (czyli: minęło 5 ms - można wysłać kolejny
rozkaz do pamięci). Oczywiście wtedy też uruchom przerwanie I2C (TWI)
aby nie czekać w przerwaniu timera aktywnie na przesłanie kolejnych
bajtów do/z pamięci tylko rób to w przerwaniu TWI.
Ja bym jednak łyknął jakiś uniwersalny wielozadaniowy system operacyjny
(FreeRTOS, NutOS itp) i posadził obliczenia w jednym wątku a zadanie
zapisujące w drugim.
--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.
Miller Artur
Guest
Fri Sep 15, 2006 9:19 am
Użytkownik "Adam Dybkowski" <adybkows123@amwaw.edu.pl> napisał w wiadomości
news:eedk6d$28q$1@atlantis.news.tpi.pl...
Quote:
Miller Artur napisał(a):
w datasheecie od 24FC.. piszą, że STOP na i2c po zapisie "initiates the
internal write cycle and during this time, the 24XX1025 will not
generate
Acknowledge signals". po to oczywiscie, zeby poczekac z zabawą aż pamięc
zapisze to co ma.
[...]
klopot w tym, ze 24FC... zawsze generuje ACK pomimo, ze zapis do pamieci
sie
jeszcze nie skonczyl - po jednym zapisie następują następne zapisy lub
odczyty, oczywiście przerywajac proces zapisu, wiec wciaz mam stare
zawartosci komórek.
No to rusz nieco głową, poświęć trochę czasu i napisz nieblokujące (gdy
się da) funkcje obsługi pamięci korzystające z przerwań.
obawiam sie, ze wyjdzie z tego armata do strzelania do wróbli ...
chcialem sie dowiedziec co robie źle albo czy akurat te pamięci mają jakis
feler, albo moze ATMega ma coś nie tegez z TWI. Jak nie pojdzie, to chyba
tak bede musial zrobic, z ruszaniem glową klopotu nie mam ;-)
Quote:
Ja bym jednak łyknął jakiś uniwersalny wielozadaniowy system operacyjny
(FreeRTOS, NutOS itp) i posadził obliczenia w jednym wątku a zadanie
zapisujące w drugim.
za pozno - nie ma czasu na tak dużą zmianę (za tydzień trzeba ustrojstwo
odpalić a jest jeszcze qpa do zrobienia), moze którąś następną wersję softu
wypuszczę na jakimś RTOSie ... tylko nie wiem czy sie zmieści do Flasha bo
większość już zajęta :-|
enyłej, fęks ;-)
@
Adam Dybkowski
Guest
Sun Sep 17, 2006 7:17 pm
Miller Artur napisał(a):
Quote:
No to rusz nieco głową, poświęć trochę czasu i napisz nieblokujące (gdy
się da) funkcje obsługi pamięci korzystające z przerwań.
obawiam sie, ze wyjdzie z tego armata do strzelania do wróbli ...
Wręcz przeciwnie. Wyjdzie ładna biblioteka obsługi pamięci EEPROM, którą
możesz opatrzyć np. licencją LGPL albo jeszcze lepiej BSD i podzielić
się ze światem. I tobie się przyda, i dla innych też będzie pomocne.
--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.