Skocz do zawartości

Używanie I2cwrite w bascom


Cire

Pomocna odpowiedź

Witajcie,

Mam problem z poprawnym zapisem.

w C jest tak:

Wire.beginTransmission(0x70);
Wire.write(1 << 2);
Wire.endTransmission();

W bascom mam przykład w którym pod adres 0x68 do rejestru 25 wpisuję 1

I2cstart
I2cwbyte &HD0
I2cwbyte 25
I2cwbyte &B00000000
I2cstop

ale nic z tego nie rozumiem. Może ktoś wytłumaczyć ?

Generalnie potrzebuję wysłać 2 pod adres 0x70 i nie mam pomysłu.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

ale nic z tego nie rozumiem. Może ktoś wytłumaczyć ?

I2cstart - wysłanie startu na magistralę

I2cwbyte &HD0 - wysłanie liczby podanej szesnastkowo

I2cwbyte 25 - wysłanie liczby podanej dziesiętnie

I2cwbyte &B00000000 - wysłanie liczby podanej dwójkowo

I2cstop - wysłanie stopu

Generalnie potrzebuję wysłać 2 pod adres 0x70 i nie mam pomysłu.

mając przykład wyżej zrobienie twojego nawet dla blondynki nie powinno być problemem

I2cstart

I2cwbyte &H70

I2cwbyte 2

I2cstop

Link do komentarza
Share on other sites

Chyba jednak nie tak. Zauważ, że o ile w bibliotece Wire masz osobną funkcję do adresowania modułu slave (beginTransmission), o tyle w BASCOM'ie nie - korzystasz tu ze standardowego write. A adres urządzenia wysyła się inaczej niż bajty danych, bo na jego LSB jest bit kierunku dalszej części ramki. Dlatego chcąc wysłać cośtam do modułu 0x70, w wire będzie to po prostu (pomijam start i stop):

Wire.beginTransmission(0x70);
Wire.write(cośtam);

a w BASCOM'ie adres trzeba przesunąć w lewo (pomnożyć przez 2):

I2cwbyte &HE0
I2cwbyte cośtam

I stąd w pierwszym poście Cire adresując moduł 0x68 mamy:

I2cwbyte &HD0

Gdybyśmy mieli potem czytać dane, trzeba oprócz mnożenia przez 2 dodać jedynkę. To wszystko jest w oficjalnym helpie:

http://avrhelp.mcselec.com/index.html?using_the_i2c_protocol.htm

Warto spojrzeć jak są zdefiniowane adresy czujnika DS1624 w tamtejszym przykładzie.

Link do komentarza
Share on other sites

Chyba jednak nie tak

Chyba jednak tak.

Wiele projektów w Bascomie zrobiłem z i2c (pamięci, zegary, żyroskopy, akcelerometry, termometry) i nigdy nie używałem polecenia Wire.beginTransmission

Co do adresu to zawsze brałem z pdf'a i nic przez 2 nie mnożyłem.

Link do komentarza
Share on other sites

I słusznie 🙂 Bo biblioteka Wire jest dla Arduino. Gdybyś jej używał na tych samych scalakach i tych samych datasheet'ach, musiałbyś.. dzielić skoro u Ciebie było OK, bo ona oczekuje adresu 7-bitowego. Przykład? Pierwszy z brzegu, ze strony:

https://www.arduino.cc/en/Tutorial/DigitalPotentiometer

Masz tam adres potencjometru: 0x2C - z takim argumentem wywołane jest Wire.beginTransmission(). W Twoim BASCOM'ie musiałbyś użyć 0x58 do zapisu i 0x59 do odczytu, bo tak naprawdę wygląda ten bajt na szynie I2C, rozumiesz?

Nie przesuwałeś wołając BASCOM'owe I2cwbyte()? To super. Ktoś zrobił to za Ciebie.

1. Nie ma umowy co do podawania adresów modułów w danych katalogowych. Jedna firma pisze: adres czujnika to 1000100 i wtedy, gdy policzysz bity i wyjdzie 7 to masz pewność, że podali samo pole adresu, bez bitu R/W. Inni z kolei mają dwa adresy: do zapisu 10111110 a do odczytu 10111111 i wtedy wiadomo, że to pełny bajt wysyłany po START. A jeszcze inni wypisują dwie cyfry szesnastkowe np. 0x28 i bądź tu mądry: adres jest już z przesunięciem i bitem R/W=0 na LSB czy nie? Najlepiej gdy jest pokazany przykładowy sygnał na liniach SCL/SDA - wtedy od razu widać o co chodzi.

2. Nie ma też umowy co do podawania adresu modułu podczas korzystania z bibliotek. Niestety raz jedni programiści cierpią a raz drudzy. Bo jedna biblioteka pobiera adres 7-bitowy i go przesuwa dodając "wewnętrznie" bit kierunku (np. wire) a inna bierze co dostała i radośnie wysyła (BASCOM). Żaden sposób nie jest lepszy od drugiego, ale trzeba wiedzieć z jakiego się korzysta.

Jeden sposób podawania adresu w datasheet działa wprost w jednych bibliotekach a nie działa w drugich i na odwrót. Jeśli masz szczęście, nic nie musisz robić. Jeśli nie, trzeba wniknąć, bo nie widać modułu slave. To tyle.

Link do komentarza
Share on other sites

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.