potencjometry cyfrowe - podejście drugie

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?

Reply to
badworm
Loading thread data ...

badworm napisał(a):

Hmmm, tak oglądam pdf-a, a linia PS prawidłowo ustawiona - wybrana komunikacja po i2c?

Reply to
RobMac

Dnia Mon, 13 Aug 2007 13:42:17 +0200, RobMac napisał(a):

Oczywiście.

Reply to
badworm

badworm napisał(a):

No to może uściślij "procedury komunikacyjne ... nie chcą trybić". Rozumiem, że:

1 - wysyłanie danych nie powoduje zmiany rezystancji. 2 - nie możesz niczego odczytać z ds-a.

Moze wrzucisz gdzieś kawałek schematu w którym to pracuje i te procedury, które nie trybią, bo na razie to wróżenie z fusów.

Reply to
RobMac

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).

Pozdrowienia, MKi

Reply to
MKi

... 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.)

Pozdrowienia, MKi

Reply to
MKi

Dnia Mon, 13 Aug 2007 18:21:02 +0200, RobMac napisał(a):

To pierwsze - odczyt mnie nie interesuje.

Schemat: VCC i PS do plusa zasilania(5V) GND, A0, A1 i A2 do masy SDA i SCL podciągnięte 3,6k do plusa, do płytki z prockiem podłączone

10cm kawałkiem skręconego przewodu dwużyłowego 100nF ceramiczny zapięty na minimodule(przejściówce SOIC-DIP) ze scalakiem SDA podłączone do PB5 SCL podłączone do PB4 Procek to MEGA8(DIP), kwarc 6MHz

main.c: #include <avr\io.h>

#include <stdio.h>

#include <inttypes.h>

#include <avr\pgmspace.h>

#include "harddef.h" #include "delay.h" #include "makra.h" #include "i2c.h" #include "lcd.h"

int main(void) { // Inicjacja PORTB = 1<<I2C_SDA | 1<<I2C_SCL; DDRB = 1<<I2C_SCL; DDRC = 1<<LCD_E | 1<<LCD_RS | 0x0F<<LCD_D4; lcd_init(); // Koniec inicjacji

// 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.

Reply to
badworm

Dnia Mon, 13 Aug 2007 18:50:03 +0200, MKi napisał(a):

Nie mam jak sprawdzić czy ACK jest wystawiane - po raz kolejny doskwiera brak oscyloskopu cyfrowego albo analizatora stanów logicznych :(

To jedyny scalak na tej magistrali.

Tutaj o adresie decydują tylko trzy wyprowadzenia, które są ściągnięte do masy co uwzględniam przy obliczaniu adresu.

3,6k to chyba w miarę typowa wartość?

Zalecane 5V i tyle mam(no, ciut więcej).

PS. Aż się chyba przeproszę z Bascomem i w nim spróbuję kawałek kodu wyrzeźbić... :|

Reply to
badworm

badworm napisał:

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...

Reply to
RobMac

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.

Reply to
badworm

badworm napisał(a):

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ęć...

Pozdrowienia, MKi

Reply to
MKi

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.