[AD2][Pascal] Digital I/O - bezpośredni dostęp | wyświetlacz HDSP-2111 i termometr MCP9700 | WaveForms SDK | cz.5

Tutaj umieszczamy tematy związane z językami programowania niepasującymi do innych działów.
Regulamin forum
Temat prosimy poprzedzić nazwą języka umieszczonego w nawiasach kwadratowych np. [Pascal].
Awatar użytkownika
tasza
Expert
Expert
Posty: 901
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

[AD2][Pascal] Digital I/O - bezpośredni dostęp | wyświetlacz HDSP-2111 i termometr MCP9700 | WaveForms SDK | cz.5

Postautor: tasza » sobota 12 sty 2019, 19:17

♬ ☘ Moja muzyka do kodowania ♬ ♬ ♬ ☘
♫ ♩ ♪ Abraxas ⚡ ☘ ⚡ z albumu Centurie - Pokuszenie ♫ ♪ ♩
https://youtu.be/NKm2nuuuXHQ



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.

000_hdsp.jpg


Dane katalogowe znajdziemy bez trudności w sieci: :arrow: https://datasheet.octopart.com/HDSP-211 ... 272882.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.

https://youtu.be/h01ldGBYJzs

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.

https://youtu.be/SMKbxw_rt6s

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:

001_sch_disp_info.png


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:

002_IMG_4969.JPG


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.

003_hdsp_2.jpg


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.

004_hdsp_3.jpg


Nadający się do prezentacji program znajdziemy w lokalizacji :arrow: https://github.com/bienata/AnalogDiscov ... 2111_1.lpr

Efekt działania poniżej:

005_hdsp.jpg

006_hdsp.jpg


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

dio_hdsp2111_1.lpr pisze:

Kod: Zaznacz cały

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 pisze:

Kod: Zaznacz cały

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 pisze:

Kod: Zaznacz cały

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 pisze:

Kod: Zaznacz cały

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:

https://youtu.be/To5aSPMrNL4

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.

https://youtu.be/XgsPs4hOW4U

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. O tym arcyfajnym wynalazku firmy Microchip możemy poczytać w temacie :arrow: Tania alternatywa dla LM35, mój układzik od prawie roku siedzi na parapecie, w nocniku powstałym na okazję wpisu :arrow: Zaziębieniomagedon

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

007_za_oknem.jpg


Cały programik pracujący jako pogodynka mamy tu: :arrow: https://github.com/bienata/AnalogDiscov ... 2111_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 pisze:

Kod: Zaznacz cały

  //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 pisze:

Kod: Zaznacz cały

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:

https://youtu.be/TKFIu0gYgXE

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

ps.
dziś chyba mija drugi rok grafomanii mej na tym forum...ale się zeszło, o rany.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
___________________________________________ ____ ___ __ _ _ _ _
J​eżeli dadzą ci papier w linie, pisz w poprzek. Juan Ramón Jiménez

Awatar użytkownika
wojtek
Geek
Geek
Posty: 1959
Rejestracja: piątek 04 wrz 2015, 09:03
Lokalizacja: JO90JK

Re: [AD2][Pascal] Digital I/O - bezpośredni dostęp | wyświetlacz HDSP-2111 i termometr MCP9700 | WaveForms SDK | cz.5

Postautor: wojtek » sobota 12 sty 2019, 19:42

no co tu komentować ;) po prostu :like:
73 Wojtek

Awatar użytkownika
gaweł
Expert
Expert
Posty: 665
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [AD2][Pascal] Digital I/O - bezpośredni dostęp | wyświetlacz HDSP-2111 i termometr MCP9700 | WaveForms SDK | cz.5

Postautor: gaweł » niedziela 13 sty 2019, 23:34

tasza pisze:dziś chyba mija drugi rok grafomanii mej na tym forum...ale się zeszło, o rany.

Z okazji drugich urodzin cały świat, łącznie z Mleczną Drogą, życzy Ci powodzenia :) .
Do życzeń jest dołączone zielsko.
kwiaty.jpg
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse


Wróć do „Inne języki programowania”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości