AE Napisano Styczeń 8, 2015 Udostępnij Napisano Styczeń 8, 2015 Skończyły mi się pomysły co z tym fantem zrobić. Mam problem z obsługą akcelerometru przez i2c. Jaki rejestr nie chciałbym odczytać, cały czas otrzymuje wartość 0x3C. Próbowałem już na ATmega32 i ATmega88PA. Korzystałem z konwertera napięć "samoróbki", jak i gotowego konwertera jaki można kupić. Próbuje obsłużyć MMA8452. Początkowo myślałem, że go uszkodziłem i kupiłem drugi LSM303D (ma już wbudowany stabilizator oraz konwerter napięć) i efekt jest ten sam. W MMA8452 ustawiam rejestr 0x2A na 0x03, czyli bit FREAD oraz ACTIVE. W LSM303D rejestr 0x20 na 0x17, czyli uruchomienie osi x,y,z oraz wyjście z trybu power-down mode. Korzystam z biblioteki Mirka Kardasia do obsługi i2c. Poniżej jest kod do obsługi LSM303D. #include <avr/io.h> #include "LCD/lcd44780.h" #include "i2c_twi.h" int main(int argc, char **argv) { unsigned char i2cInitBuf = 0x17; unsigned char bufor; i2cSetBitrate(100); lcd_init(); TWI_write_buf(0x3A, 0x20, 1, &i2cInitBuf); TWI_read_buf(0x3B, 0x0F, 1, &bufor); //tutaj chcę odczytać rejestr WHO AM I lcd_hex(bufor); while(1) { } } Oraz plik i2c.c #include <avr/io.h> #include "i2c_twi.h" void i2cSetBitrate(uint16_t bitrateKHz) { uint8_t bitrate_div; bitrate_div = ((F_CPU/1000l)/bitrateKHz); if(bitrate_div >= 16) bitrate_div = (bitrate_div-16)/2; TWBR = bitrate_div; } void TWI(void) { TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); while ( (TWCR&(1<<TWSTO))); } void TWI_write(uint8_t bajt) { TWDR = bajt; TWCR = (1<<TWINT)|(1<<TWEN); while ( !(TWCR&(1<<TWINT))); } uint8_t TWI_read(uint8_t ack) { TWCR = (1<<TWINT)|(ack<<TWEA)|(1<<TWEN); while ( !(TWCR & (1<<TWINT))); return TWDR; } void TWI_write_buf( uint8_t SLA, uint8_t adr, uint8_t len, uint8_t *buf ) { TWI(); } void TWI_read_buf(uint8_t SLA, uint8_t adr, uint8_t len, uint8_t *buf) { TWI(); } Cytuj Link do komentarza Share on other sites More sharing options...
Elvis Styczeń 8, 2015 Udostępnij Styczeń 8, 2015 Spróbuj zamienić TWI_read_buf(0x3B, 0x0F, 1, &bufor); na TWI_read_buf(0x3A, 0x0F, 1, &bufor); 1 Cytuj Link do komentarza Share on other sites More sharing options...
AE Styczeń 9, 2015 Autor tematu Udostępnij Styczeń 9, 2015 Wprowadziłem tę zmianę i działa. Nieźle się zawiesiłem na takiej głupocie 😋 Ta tabela mnie zmyliła. Wielkie dzięki! Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!