Coś mnie te potencjometry cyfrowe chyba wybitnie nie lubią ;) Po nieudanej walce z AD5203 wziąłem się teraz za DS1844. Zapowiadał się ciekawie bo ma możliwość komunikacji poprzez 2-liniowy interfejs szeregowy kompatybilny z I2C(nigdzie nie ma na ten temat słowa w PDFie ale to zapewne wybieg w celu nie płacenia za licencję). Mam sprawdzone procedury komunikacyjne I2C w C dla AVR(z PCF8574 pięknie działają) ale z DS1844 nie chcą trybić(adres wysyłam dobry) :( Sprawdziłem na dwóch sztukach scalaka więc problem sprzętowy raczej odpada. W sieci znalazłem tylko tyle, że ludzie mieli już problemy ze skomunikowaniem się z tym scalakiem ale żadne rozwiązanie problemu się nie pojawiło. Jakieś sugestie gdzie może tkwić przyczyna niedziałania?
Co to znaczy "nie chcą trybić"? Brak ACK? Od razu, czy w którymś miejscu? Brak reakcji zmiany potencjometru po poprawnej komunikacji?
Nie znam tego DS1844 (aczkolwiek używam z powodzeniem termometru DS1731, ten sam producent, I2C powinno działać tak samo), ale moje problemy z I2C były wywoływane:
- dwa urządzenia z tym samym adresem,
- błędny adres (raz byłem na 200% pewien, że adres dobry, a okazało się że to scalak z innym adresem, bo miał na końcu symbolu malutkie "A", którego nie przyuważyłem),
- za słabe/mocne podciągnięcia do zasilania na SCL i SDA,
- za niskie napięcie zasilania (niektóre scalaki działają przy 3,3V, inne wymagają 5V).
... i jeszcze jedna przyczyna problemów z I2C: procesor był za szybki... (Czy też raczej urządzenie za wolne, bo funkcje były testowane na innym scalaku i wszystko działało.)
// Tekst informacyjny w górnej linii wyświetlacza lcd_str_P((prog_char*)PSTR("Dane z I0:")); lcd_command(LCDC_DDA | 64); // Konfiguracja przetwornika i2c_start(); // bajt adresowy, zapis i2c_send(0x50); // bajt kontrolny i2c_send(0x3F); i2c_send(0xFF); i2c_send(0x7F); i2c_send(0xBF); i2c_stop();
// Pobieranie danych for(;;) { /*lcd_command(LCDC_DDA | 64); // Odczyt danych i2c_start(); // bajt adresowy, odczyt i2c_send(0x91); // Pobranie i wyświetlenie danej lcd_dec(i2c_get(I2C_NACK)); // Przysłonięcie reszty napisu jeśli napis jest krótszy lcd_str_P((prog_char*)PSTR(" ")); i2c_stop();*/ //i2c_send(0xAA); }
return 0; }
Ze względu na objętość plik z funkcjami I2C wrzuciłem tutaj:
formatting link
tutaj są pliki nagłówkowe:
formatting link
Tak jak pisałem - te same procedury bez problemu działają dla PCF8574 więc nie wydaje mi się, żeby był w nich błąd.
No to może warto sprawdzić! To, że nie zmienia ustawień nie znaczy jeszcze, że nie ma komunikacji.
a Hx,Wx,Lx wpięte gdzieś, czy tylko tak w powietrzu mierzysz rezystancję multimetrem, o ile w ogóle tak się da mierzyć bez spolaryzowania. Może zrób z tego dzielnik napięcia i mierz napięcie na wyjściu.
Po tym fragmencie nic się nie zmienia? (o ile właśnie ds po włączeniu zasilania sam sobie takich właśnie wartości nie inicjuje - 3F)
no a tu wplatasz obsługę lcd w transmisję, wyczyść program z rzeczy zbędnych, zostaw tylko to co potrzebne do obsługi ds-a. Przy konfiguracji wpisuj inne wartości do kolejnych potencjometrów. Zobaczymy co dalej...
Dnia Tue, 14 Aug 2007 09:27:55 +0200, RobMac napisał(a):
Ok, podepnę LCD i zobaczę, co mi odczytuje.
Podpiąłem H0 do plusa, L0 do masy i efekt jest taki, że mam cały czas około 2,5V na wyjściu :/
To 3F to jest wysłanie maksymalnej wartości po zerowego potencjometru czyli suma logiczna 0x00 i 0x3F.
Wywaliłem obsługę LCD, sprawdziłem też wysyłanie osobno do każdego potencjometru(bo taką poradę dostałem od pewnej osoby z Elektrody, której udało się nawiązać komunikację z tym układem) - dalej nic.
Ale przecież... ACK odczytujesz z portu - procesorem. W procedurach, które podałeś w innej gałęzi wątka funkcja i2c_send zwraca Ci właśnie ACK!
Ja robię przy kłopotach z i2c tak:
Spróbuj najpierw, czy dostajesz w ogóle ACK po wysłaniu adresu. Nie wysyłaj nic innego, po prostu start, adres, odczyt ACK i stop. Wyświetl to ACK. Wg Twoich funkcji coś takiego:
i2c_start(); x = i2c_send(0x50); i2c_stop(); if (x == 1) lcd_str_P((prog_char*)PSTR("Brak ACK") ; else lcd_str_P((prog_char*)PSTR("Jest ACK") ;
Jeśli jest 1 (stan wysoki, brak ACK), spowalniaj transmisję wstawiając opóźnienia po każdej zmianie stanu SCL i SDA.
Jak dojdziesz do szybkości wolniejszej niż 1 Hz, zacznij szukać winnego w hardwarze.
Jeśli masz zero (czyli jest ACK) zacznij wysyłać polecenia zapisu i odczytu. Ustaw jakąś wartość suwaka i ją odczytaj. jest to samo? To I2c działa OK. wtedy dopiero przejdź do strony "potencjometrowej" układu.
Jak sprawdzasz, czy potencjometr jest nastawiony? Omomierzem? Jak już pisał Ci RobMac raczej podepnij H0 do napięcia +5, L0 do masy i badaj napięcie na W0. W każdym razie napięcie na H0 musi być wyższe, niż na L0, a całość musi mieścić się w przedziale -0,5 - Vcc+0,5V. Te wyprowadzenia nie mogą ot, tak sobie wisieć w powietrzu, niepołączone do masy układu.
IMHO potencjometry cyfrowe to są nie prawdziwe potencjometry, tylko programowalne dzielnik napięć...
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.