badworm
Guest
Mon Aug 13, 2007 12:51 am
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?
--
Pozdrawiam Bad Worm badworm[maupa]post{kopek}pl
IET10@WEiA-PG student
GG#2400455 ICQ#320399066
http://photobucket.com/albums/b252/badworm/
RobMac
Guest
Mon Aug 13, 2007 12:42 pm
badworm napisał(a):
Quote:
Coś mnie te potencjometry cyfrowe chyba wybitnie nie lubią

Po
nieudanej walce z AD5203 wziąłem się teraz za DS1844 ... Jakieś
sugestie gdzie może tkwić przyczyna niedziałania?
Hmmm, tak oglądam pdf-a, a linia PS prawidłowo ustawiona - wybrana
komunikacja po i2c?
--
RobMac
badworm
Guest
Mon Aug 13, 2007 3:44 pm
Dnia Mon, 13 Aug 2007 13:42:17 +0200, RobMac napisał(a):
Quote:
Hmmm, tak oglądam pdf-a, a linia PS prawidłowo ustawiona - wybrana
komunikacja po i2c?
Oczywiście.
--
Pozdrawiam Bad Worm badworm[maupa]post{kopek}pl
IET10@WEiA-PG student
GG#2400455 ICQ#320399066
http://photobucket.com/albums/b252/badworm/
RobMac
Guest
Mon Aug 13, 2007 5:21 pm
badworm napisał(a):
Quote:
Dnia Mon, 13 Aug 2007 13:42:17 +0200, RobMac napisał(a):
Hmmm, tak oglądam pdf-a, a linia PS prawidłowo ustawiona - wybrana
komunikacja po i2c?
Oczywiście.
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.
--
pozdr.
RobMac
MKi
Guest
Mon Aug 13, 2007 5:50 pm
Quote:
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)
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
MKi
Guest
Mon Aug 13, 2007 5:52 pm
.... 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
badworm
Guest
Mon Aug 13, 2007 6:42 pm
Dnia Mon, 13 Aug 2007 18:21:02 +0200, RobMac napisał(a):
Quote:
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.
To pierwsze - odczyt mnie nie interesuje.
Quote:
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.
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:
http://badworm.enetia.pl/i2c.c
A tutaj są pliki nagłówkowe:
http://badworm.enetia.pl/i2c.h
http://badworm.enetia.pl/harddef.h
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.
--
Pozdrawiam Bad Worm badworm[maupa]post{kopek}pl
IET10@WEiA-PG student
GG#2400455 ICQ#320399066
http://photobucket.com/albums/b252/badworm/
badworm
Guest
Mon Aug 13, 2007 8:21 pm
Dnia Mon, 13 Aug 2007 18:50:03 +0200, MKi napisał(a):
Quote:
Co to znaczy "nie chcą trybić"?
Brak ACK? Od razu, czy w którymś miejscu?
Brak reakcji zmiany potencjometru po poprawnej komunikacji?
Nie mam jak sprawdzić czy ACK jest wystawiane - po raz kolejny doskwiera
brak oscyloskopu cyfrowego albo analizatora stanów logicznych
Quote:
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,
To jedyny scalak na tej magistrali.
- 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),
Tutaj o adresie decydują tylko trzy wyprowadzenia, które są ściągnięte
do masy co uwzględniam przy obliczaniu adresu.
Quote:
- za słabe/mocne podciągnięcia do zasilania na SCL i SDA,
3,6k to chyba w miarę typowa wartość?
Quote:
- za niskie napięcie zasilania (niektóre scalaki działają
przy 3,3V, inne wymagają 5V).
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ć...
--
Pozdrawiam Bad Worm badworm[maupa]post{kopek}pl
IET10@WEiA-PG student
GG#2400455 ICQ#320399066
http://photobucket.com/albums/b252/badworm/
RobMac
Guest
Tue Aug 14, 2007 8:27 am
badworm napisał:
Quote:
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.
To pierwsze - odczyt mnie nie interesuje.
No to może warto sprawdzić! To, że nie zmienia ustawień nie znaczy
jeszcze, że nie ma komunikacji.
Quote:
Schemat:
VCC i PS do plusa zasilania(5V)
GND, A0, A1 i A2 do masy ...
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.
Quote:
// 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();
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)
Quote:
// 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;
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...
--
RobMac
badworm
Guest
Tue Aug 14, 2007 2:41 pm
Dnia Tue, 14 Aug 2007 09:27:55 +0200, RobMac napisał(a):
Quote:
badworm napisał:
No to może warto sprawdzić! To, że nie zmienia ustawień nie znaczy
jeszcze, że nie ma komunikacji.
Ok, podepnę LCD i zobaczę, co mi odczytuje.
Quote:
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.
Podpiąłem H0 do plusa, L0 do masy i efekt jest taki, że mam cały czas
około 2,5V na wyjściu :/
Quote:
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)
To 3F to jest wysłanie maksymalnej wartości po zerowego potencjometru
czyli suma logiczna 0x00 i 0x3F.
Quote:
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...
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.
--
Pozdrawiam Bad Worm badworm[maupa]post{kopek}pl
IET10@WEiA-PG student
GG#2400455 ICQ#320399066
http://photobucket.com/albums/b252/badworm/
MKi
Guest
Tue Aug 14, 2007 5:45 pm
badworm napisał(a):
Quote:
Dnia Mon, 13 Aug 2007 18:50:03 +0200, MKi napisał(a):
Co to znaczy "nie chcą trybić"?
Brak ACK? Od razu, czy w którymś miejscu?
Nie mam jak sprawdzić czy ACK jest wystawiane - po raz kolejny doskwiera
brak oscyloskopu cyfrowego albo analizatora stanów logicznych
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