Od kilku dni próbuje obsłużyć i2c na przerwaniach. W końcu mi się udało.
Zmieniłem bibliotekę i2c na Prycon
http://www.procyonengineering.com/embedded/avr/avrlib/ i wprowadziłem zmiany w funkcji
i2cMasterReceive(u08 deviceAddr, u08 length); przerzucając z jej końca odczyt bufora danych do nowej funkcji
i2cMasterReceiveBuffer(u08 length, u08* data); a także napisałem funkcję
MPU6050_Test_I2C() opierając się na kilkudniowych doświadczeniach z biblioteką avr315 atmel corporation.
main.c
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i2c_prycon.h
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i2c_prycon.c
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Z biblioteki do projektu należy także dodać pliki prycona
avrlibdefs.h
avrlibtypes.h
global.h
i2cconf.h
a także MKUART z bluebooka.
(oryginalna obsługa i2c prycona nazywa się i2c.c oraz i2c.h w jego bibliotece)
Tutaj otrzymany wynik


Aby obsłużyć urządzenie należy napisać sobie funkcję podobną do
MPU6050_Test_I2C(), która podzieli zadania na zapis (tutaj wysłanie do urządzenia adresu komórki do odczytu), odczyt z urządzenia (odczyt n bitów do bufora) i odczyt z bufora I2C do własnego bufora i wyświetlenie go. Jeżeli i2c jest aktualnie zajęte
i2cGetState() to wracamy do pętli głównej i wykonujemy inne zadania.
Przez odpowiednią zmianę
twiState sekwencyjnie dokonujemy zapisu, odczytu i odczytu z bufora. Następnie ustawiam twiState na TWI_IDLE aby ponownie zmienić stan na TWI_REQUEST_REGISTER i zwrócić funkcją wartość 1, która spowoduje 3 sekundowe opóźnienie w pętli głównej przed kolejnym odczytem.
Jak obsłużę całkowicie żyroskop to zabiorę się za przerobienie biblioteki na atnelowską modę.