Witam
Od dwóch dni próbuję dogadać się z ultradźwiękowym czujnikiem odległości "sonar MOBOT-US" firmy Wobit za pomocą interfejsu TWI.
Dokumentacja: http://www.mobot.pl/download/Instrukcja%20do%20sonaru.pdf
Zapoznanie się z interfejsem rozpocząłem od lektury kilku stron, między innymi http://www.autokacik.pl/i2c/ i przejrzenia przynajmniej 20. tematów na elektrodzie + analiza dołączanych działających plików, mam jednak nadal kilka wątpliwości.
Według załączonej dokumentacji czujnika aby dokonać najprostszego pomiaru należy wysłać do czujnika ramkę danych 0x10 0x01 (pomiar, auto). Następnie należy odczekać 200 ms i zarządzać odpowiedzi (wyniku) wysyłając bajt 0x20 i odebrać dwa bajty danych.
Zakładam że mój mikrokontroler atmega 16 będzie masterem i sytuacja odpowiada tej opisanej na autokącik: master - programowana przeze mnie atmega16, slave - sonar
Postanowiłem wykorzystać znalezioną na elektrodzie bibliotekę do komunikacji po mojtwi.h (w załączniku). I tu rodzi się wątpliwość: funkcja i2c_start wymaga podania adresu - lecz właściwie co to za adres? To jest to adresowanie o którym mowa w autokąciku? Czy mam podać adres jaki wynika z dokumentacji sonaru (w moim przypadku zworki A0 A1 i A2 są rozwarte, więc adres 0x01)? Czy w ogóle muszę używać jakiś adresów jeśli do magistrali podpięte są tylko dwa urządzenia?
W tej chwili kod wygląda w ten sposób:
Dlaczego int spr=i2c_start(0x02);? Nie wiem
Po prostu zauważyłem, że wpisując jako ten adres 0x02 czujnik jakby wykonywał pomiar (zapala się dioda L2 co zgodnie z dokumentacją oznacza odebranie echa) jednak odebrane dane (wynik1 i wynik2) to liczby 2 i 2 a na wyjściu analogowym niezależnie od odległości od przeszkody wisi ciągle około 4,2V (dokumentacja przewiduje po pomiarze napięcie od 0 do 4V). Kolejną ciekawostką jest to, że dioda L2 zapala się "co drugi raz" - przytoczony fragment programu jest w pętli nieskończonej i obserwuje sobie na lcd wyniki - co drugą pętle zapala się D2. D1 w każdej pętli miga ułamek sekundy.
Gdy jako adres wpiszę inny parzysty (sprawdziłem 0x04, 0x06, 0x0a) sonar pali światłem ciągłym diodę L1 , L2 nigdy się nie zapala, natomiast wpisując adres nieparzysty program "zawiesza się" przy próbie wysłania pierwszego bajtu danych
nie wykonuje operacji po tej linii (sprawdzam gdzie się zwiesza wstawiając po każdej linii kodu związanej z i2c polecenia wyświetlenia unikalnego teksu na wyświetlacz).
Jakieś pomysły? Z góry dziękuję za pomoc i pozdrawiam.
Od dwóch dni próbuję dogadać się z ultradźwiękowym czujnikiem odległości "sonar MOBOT-US" firmy Wobit za pomocą interfejsu TWI.
Dokumentacja: http://www.mobot.pl/download/Instrukcja%20do%20sonaru.pdf
Zapoznanie się z interfejsem rozpocząłem od lektury kilku stron, między innymi http://www.autokacik.pl/i2c/ i przejrzenia przynajmniej 20. tematów na elektrodzie + analiza dołączanych działających plików, mam jednak nadal kilka wątpliwości.
Według załączonej dokumentacji czujnika aby dokonać najprostszego pomiaru należy wysłać do czujnika ramkę danych 0x10 0x01 (pomiar, auto). Następnie należy odczekać 200 ms i zarządzać odpowiedzi (wyniku) wysyłając bajt 0x20 i odebrać dwa bajty danych.
Zakładam że mój mikrokontroler atmega 16 będzie masterem i sytuacja odpowiada tej opisanej na autokącik: master - programowana przeze mnie atmega16, slave - sonar
Cytat:
wykonanie pomiaru:
ˇ mikrokontroler A (master) adresuje mikrokontroler B (slave)
ˇ mikrokontroler A (nadajnik-master) wysyła dane do mikrokontrolera B (odbiornik-slave)
ˇ mikrokontroler A kończy transmisję.
otrzymanie odpowiedzi:
ˇ mikrokontroler A (master) adresuje mikrokontroler B (slave)
ˇ mikrokontroler A (odbiornik-master) odbiera dane od mikrokontrolera B (nadajnik-slave)
ˇ mikrokontroler A kończy transmisję.
Postanowiłem wykorzystać znalezioną na elektrodzie bibliotekę do komunikacji po mojtwi.h (w załączniku). I tu rodzi się wątpliwość: funkcja i2c_start wymaga podania adresu - lecz właściwie co to za adres? To jest to adresowanie o którym mowa w autokąciku? Czy mam podać adres jaki wynika z dokumentacji sonaru (w moim przypadku zworki A0 A1 i A2 są rozwarte, więc adres 0x01)? Czy w ogóle muszę używać jakiś adresów jeśli do magistrali podpięte są tylko dwa urządzenia?
W tej chwili kod wygląda w ten sposób:
int spr=i2c_start(0x02);
itoa( spr, buffer, 10);
lcd_goto(1,2);
lcd_write_text(buffer);
spr=i2c_write(0x10);
itoa( spr, buffer, 10);
lcd_goto(1,2);
lcd_write_text(buffer);
spr=i2c_write(0x01);
itoa( spr, buffer, 10);
lcd_goto(1,2);
lcd_write_text(buffer);
i2c_stop();
_delay_ms(500);
spr=i2c_start(0x02);
itoa( spr, buffer, 10);
lcd_goto(1,2);
lcd_write_text(buffer);
spr=i2c_write(0x20);
itoa( spr, buffer, 10);
lcd_goto(1,2);
lcd_write_text(buffer);
spr=i2c_rep_start(0x02);
itoa( spr, buffer, 10);
lcd_goto(1,2);
lcd_write_text(buffer);
int wynik1 = i2c_readAck();
int wynik2 = i2c_readNak();
i2c_stop();
itoa( wynik1, buffer, 10);
lcd_goto(5,2);
lcd_write_text(buffer);
itoa( wynik2, buffer, 10);
lcd_goto(10,2);
lcd_write_text(buffer);
Dlaczego int spr=i2c_start(0x02);? Nie wiem
Gdy jako adres wpiszę inny parzysty (sprawdziłem 0x04, 0x06, 0x0a) sonar pali światłem ciągłym diodę L1 , L2 nigdy się nie zapala, natomiast wpisując adres nieparzysty program "zawiesza się" przy próbie wysłania pierwszego bajtu danych
spr=i2c_write(0x10);
nie wykonuje operacji po tej linii (sprawdzam gdzie się zwiesza wstawiając po każdej linii kodu związanej z i2c polecenia wyświetlenia unikalnego teksu na wyświetlacz).
Jakieś pomysły? Z góry dziękuję za pomoc i pozdrawiam.
