Port WaveForms SDK na Pascal
Digital I/O - dostęp bezpośredni

część 8

podstawowe informacje o urządzeniu i sterowanie zasilaczem
cykliczna akwizycja danych i histereza triggera
UART - Digital I/O i obsługa protokołów
I2C - Digital I/O i obsługa protokołów
SPI - Digital I/O i obsługa protokołów (mostek Wheatstone'a)
SPI - Digital I/O i obsługa protokołów (pomiar Iadj w LM317)
Digital I/O - ROM Mode, przerzutnik RS i dekoder do rosyjskiej VFD
Digital I/O - bezpośredni dostęp, wyświetlacz HDSP-2111 i termometr MCP9700
Analog OUT - woltomierz True RMS z przetwarzaniem sygnału

☘☘☘☘☘☘☘☘
wyświetlacz HDSP-2111 i termometr MCP9700

Temat bezpośredniego dostępu do cyfrowych wejść-wyjść Analog Discovery 2 jest całkiem prosty i w sumie to mogłabym jakieś większe pisanie o tym odpuścić. Przykład hurtowego odczytu Digital I/O mieliśmy w poprzednim odcinku, zapis jest analogiczny. No ale zapis ów to też jedyna w swoim rodzaju okazja do prezentacji kolejnego cudaka z moich drobnych zbiorów - alfanumerycznego wyświetlacza HDSP-2111 - a zatem...

zapis do I/O

Jak wiemy puderniczka AD2 posiada 16 wyprowadzeń cyfrowych, które zależnie od konfiguracji mogą pełnić rolę wejść lub wyjść. O kierunku przepływu danych decyduje szesnastobitowa liczba podana jako parametr wywołania funkcji FDwfDigitalIOOutputEnableSet, bity słowa ustawione na 1 konfigurują port do pracy jako wyjście, podanie 0 ustawia port jako wejście. Jeżeli nasza aplikacja tego wymaga, możemy oczywiście zadziałać precyzyjnie - wywołaniem funkcji FDwfDigitalOutEnableSet konfigurujemy jeden wybrany port AD2. Analogicznie do poprzedniej inwokacji - true ustawi kanał na wyjście, wartość false na wejście.

Zapis fizycznej danej odbywa się funkcją FDwfDigitalIOOutputSet, kolejnym bitom szesnastobitowego słowa odpowiadają stany, które zostaną ustawione na fizycznych wyjściach AD2. Tu nie ma żadnego buforowania, należy oczekiwać że nowe stany będą efektywnie dostępne na wyjściach zaraz po zwróceniu sterowania przez wspomnianą funkcyjkę. I to w zasadzie koniec podstaw teoretycznych.

HDSP-2111

Po drobnej dawce koniecznych przynudzeń zabieramy się za zabawę! Zatem proszę, oto mimo że plastikowy to zajesympatyczny wyświetlacz typu HDSP-2111, a właściwe takie dwa. Oba z czasów prospery firmy Hewlett-Packard i datowane na rok '93. No i jeden to pamiątka z irlandzkiego zmywaka, a drugi to owoc regularnego polowania na Wolumen, widzimy je na zdjęciu poniżej.



Dane katalogowe znajdziemy bez trudności w sieci: ➮ https://datasheet.octopart.com/HDSP-2111-Avago-datasheet-7272882.pdf

Pierwsze próby zasilenia zestawu układów na płytce stykowej może nie należały do szczególnie mądrych, ale efekt bardzo mi przypominał zachowanie pokładowej Matki z frachtowca Nostromo w filmie Alien.



Drugi filmik, w analogicznych klimatach pokazuje wrażliwość modułów na zakłócenia od strony zasilania. Wszelkie meszki i inne efekty specjalnie zniknęły jak ręką odjął po zablokowaniu zasilania 5V małym kondensatorem 10uF.



Skoro ten model wyświetlaczy nadaje się do ładnego składania w dłuższe linijki (horizontal stacking) to nie omieszkałam z tego faktu skorzystać i finalny schemat połączeń widzimy na rysunku:



Na schemacie widzimy też fragmenty dokumentacji, bo podłączenie wyświetlacza nie jest tak do końca typowe. Już wyjaśniam: wyszłam z założenia, że priorytetem ma być łatwość wpisywania nowego tekstu do pamięci wyświetlacza, zatem adresację w obrębie jednego modułku zapewniają mi linie A2...A0 połączone z wyprowadzeniami DIO-2...DIO-0 Analog Discovery 2. Selekcją wyświetlaczy zajmuje się negowana po drodze linia DIO-3, która odpowiednio steruje sygnałami /CE modułów. W ten sposób mam liniowo adresowalny, szasnastoznakowy bufor tekstowy. Linie A4 wyświetlaczy mają stale stan H, a spięte razem linie A3 pozwalają mi wybrać, czy wpisuje dane do pamięci tekstu, czy podaję słowo sterujące modułem. Finalna instalacja zaraz przed testami:



A tu weryfikacja połączeń i zachowania wyświetlacza sterowanych na piechotę aplikacją WaveForms. Taki już zwyczaj sobie wypracowałam - zanim zacznę dziergać swoje bazgroły w Pascal to sprawdzenie sprzętu zewnętrznym, wiarygodnym (no..niech tam) oprogramowaniem.



No cóż, chyba nie do końca udało się wycelowanie, który modułek jest pierwszy, a który drugi w kolejności adresacji, stąd drobne poprawki.



Nadający się do prezentacji program znajdziemy w lokalizacji ➮ https://github.com/bienata/AnalogDiscovery2/blob/master/dio_hdsp2111_1/dio_hdsp2111_1.lpr

Efekt działania poniżej:




Dwa aspekty dostępu do wyświetlaczy - dane/polecenie pokrywają kolejno: zestaw stałych i następujące procedurki:

// dio_hdsp2111_1.lpr
WR_HI : dword = $8000;
WR_LO : dword = $0000;
SEL_DATA : dword = $1000;
SEL_CTRL : dword = $0000;
A3_HI : dword = $0800;
A3_LO : dword = $0000;

// dio_hdsp2111_1.lpr
procedure Hdsp2111CharAt( c : char; n : integer );
var
   addr_char : dword;
begin
  addr_char := dword( n shl 8 ) + ord(c);
  FDwfDigitalIOOutputSet( hAd2, WR_HI + SEL_DATA + addr_char );
  FDwfDigitalIOOutputSet( hAd2, WR_LO + SEL_DATA + addr_char );
  FDwfDigitalIOOutputSet( hAd2, WR_HI + SEL_DATA + addr_char );
end;

procedure Hdsp2111Text( s : string );
var i : integer;
begin
  for i := 1 to length(s) do
  begin
    hdsp2111CharAt( s[ i ], i-1 );
  end;
end;

// dio_hdsp2111_1.lpr
procedure Hdsp2111Brightness( b : byte );
var
   brightness : byte;
begin
  brightness := ($7-b) and $07; // na wszelki wypadek
  FDwfDigitalIOOutputSet( hAd2, WR_HI + SEL_CTRL + A3_LO + brightness);
  FDwfDigitalIOOutputSet( hAd2, WR_LO + SEL_CTRL + A3_LO + brightness);
  FDwfDigitalIOOutputSet( hAd2, WR_HI + SEL_CTRL + A3_HI + brightness);
  FDwfDigitalIOOutputSet( hAd2, WR_LO + SEL_CTRL + A3_HI + brightness);
  FDwfDigitalIOOutputSet( hAd2, WR_HI + SEL_CTRL + A3_HI + brightness);
end;

W wysokopoziomowego punktu widzenia - możemy pisać sobie teksty, możemy zmieniać jasność napisów, wszystko to w całkiem wygodny sposób:

//dio_hdsp2111_1.lpr
const
  msg : array [0..4] of string = (
     'to jest test    ', '    wyswietlacza', '*** HDSP2111 ***',
     '  tasza was here', 'hello  microgeek'
  );
  repeat
  for i := 0 to length( msg )-1 do
  begin
      Hdsp2111Text ( msg [i] );
      for b := 0 to 7 do
      begin
            hdsp2111brightness ( b );
            delay( 100 );
      end;
      delay( 500 );
      for b := 7 downto 0 do
      begin
            hdsp2111brightness ( b );
            delay( 100 );
      end;
  end;
  until false;

Działający programik demonstracyjny widzimy też na filmiku:



Przy okazji - proszę zwrócić uwagę na wskazówkę amperomierza z zasilaczu, gdy programowo zmieniam jasność wyświetlaczy - zakres zmian poboru prądu jest dość znaczny i chcąc docelowo wykorzystać te układy, trzeba się liczyć z zapasem dedykowanej im mocy zasilania.



No i oczywiście ponownie temat zakłóceń - te modułki wymagają jednak bardzo czystego zasilania, czasem na matrycy potrafią pojawić się niespodziewane śmiećki - na filmie widać to wyraźnie.

a za oknem -5

Kolejna zabawka, będąca niejako efektem naturalnej ewolucji programu to model prostego zaokiennego termometru na bazie kostki MCP9700. Mój układzik od prawie roku siedzi na parapecie, w nocniku powstałym na okazję wpisu (na Forum) ➮ Zaziębieniomagedon

Instalacja taka jak na zdjęciu, weryfikacja odczytów przy pomocy V640@0.5VDC:



Cały programik pracujący jako pogodynka mamy tu: ➮ https://github.com/bienata/AnalogDiscovery2/blob/master/dio_hdsp2111_2/dio_hdsp2111_2.lpr

I może dwa słowa - napięcie wyjściowe z MCP9700 mierzę sobie via Analog In, kanałem pierwszym, ale nie tak jak to było robione przy potencjometrze, jednostkowymi odczytami. Tum razem postanowiłam wykorzystać możliwość sekwencyjnej akwizycji danych (tryb oscyloskopowy) i serię pomiarów wykonywaną z zadanym kwantem czasu pakuje sobie automatycznie do zmiennoprzecinkowego buforka. Znając jego rozmiar można bardzo łatwo wyliczyć wartość średnią serii. Konfigurację kanału do ciągłej akwizycji danych wykonuję kawalątek kodu jak poniżej:

// dio_hdsp2111_2.lpr
  //AnalogIn, kanal 1
  FDwfAnalogInChannelEnableSet ( hAd2, 0, true );
  FDwfAnalogInChannelOffsetSet( hAd2, -1, 0.0 ); // offset 0mV
  FDwfAnalogInChannelRangeSet( hAd2, -1, 5.0 );   // zakres 5Vpp
  FDwfAnalogInFrequencySet( hAd2, 10E+3 ); // fs=10kHz
  FDwfAnalogInBufferSizeSet( hAd2, MAX_SAMPLES ); // buforek 100 sampli
  FDwfAnalogInTriggerAutoTimeoutSet( hAd2, 0.1 );     // autotrigger na ON
  FDwfAnalogInTriggerSourceSet( hAd2, trigsrcNone );        

a same odczyty, uśrednianie i konwersję napięcia z offsetem na temperaturę i jej prezentację wraz z wiatraczkiem po prawo realizuje taka oto nieskończona pętelka:

// dio_hdsp2111_2.lpr
const   MAX_SAMPLES = 100;
var     samplesBuff : array [0..MAX_SAMPLES-1] of double;
const   rot : array [0..3] of string = ( '-', '\', '|', '/' );
repeat
     FDwfAnalogInConfigure ( hAd2, false, true );
     repeat
        FDwfAnalogInStatus( hAd2, true, @status );
        Delay (1);
     until status = stsDone;
     FDwfAnalogInStatusData( hAd2, 0, @samplesBuff, MAX_SAMPLES );
     T := 0.0;
     for i := 0 to MAX_SAMPLES-1 do T := T + samplesBuff[ i ];
     T := (T/MAX_SAMPLES - 0.500 (* dV MCP9700 *))/0.01 (* 10mV/C *);
     Hdsp2111Text ( LeftStr('za oknem ' + FormatFloat ('##.#', T) + '''C' + rot[r], 16) );
     delay (500);
     r := (r+1) and $3;
  until false;

Filmik z działającym na żywo termometrem możemy obejrzeć poniżej:



I tym prostym sposobem mam już z głowy większość zagadnień dotyczących cyfrowego bloku w Analog Discovery 2. Jest chyba jasne, że z wykorzystaniem niskopoziomowych funkcji możemy z tym małym pudełkiem robić cokolwiek chcemy, włącznie z nauką skakania przez kijek. Druga refleksja taka, że łączenie funkcjonalności analogowych i cyfrowych, jak w tym właśnie przypadku, otwiera drogę do całkiem ciekawych eksperymentów, gdzie AD2 jest traktowane jako dostępna przez USB cyfrowo-analogowa karta pomiarowa. Zapominamy na chwilę o lansowanych przez sprzedawców określeniach - oscyloskop, generator, analizator stanów. Jeżeli zachodzi kompromis natury: oczekiwane parametry/funkcje vs cena, z tego punktu widzenia Analog Discovery 2 niczym nie różni się od modułów DAQ typu LabJack czy USB-4716 od Advantech. Reszta to kwestia oprogramowania i wsparcia jakie daje dostawca w formie developerskiego SDK dla produktu, tu AD2 wypada IMHO całkiem dobrze.

#slowanawiatr, styczeń 2019

 tasza  2004-2021 | archiwum kabema 2021