Skocz do zawartości
Wrona

AS7263 - pomiar NIR - trzeba wyciągnać maksymalną częstotliwość

Pomocna odpowiedź

35 minut temu, ethanak napisał:

A to ciekawe bo nie ma prawa śmigać. Na pewno zegar I2C się przestawił na 400 MHz? Pokaż ten kawałek kodu w którym przestawiasz zegarek...

void setup()                                                                   
{
Wire.begin();
Wire.setClock(400000);
Serial.begin(115200); 
sensor.begin(Wire, GAIN, MEASUREMENT_MODE); 
lcd.begin(16,2);  
}

 

35 minut temu, ethanak napisał:

Bo skupiliśmy się na Arduino, pomiarach i prędkościach seriala... a kto odbiera wyniki tych pomiarów na tym serialu i czy naprawdę lecą one z pełną prędkością 24godziny na dobę? Bo jeśli potrzebne są wyniki pomiarów np. z kilku sekund raz na jakiś czas to można je sobie w jakiś sposób szybciutko pomierzyć i zbuforować, a potem w majestatycznym tempie przesłać do jakiegoś peceta (czy co tam potem te dane obrabia)...

Rozpatruje taką możliwość. Będzie tego od 50 do 100 tysięcy różnych pomiarów z kilku minut (mniej jeśli zamiast kilku będzie badanych tylko jeden kanał NIR). Przypuszczam jednak że znów pojawi się problem z pamięcią dynamiczną. 

Udostępnij ten post


Link to post
Share on other sites

Tak sobie pomyślałem, że na razie nie ma sensu zagrzebywać się w pisanie własnej biblioteki do wysyłania danych czy tworzenia tablic wyników wewnątrz programu, bo ... ze wszystkich prób wynika że obsługa Serial.print() i milis() to jedynie 0,007s czyli nie oszczędzę na tym. Nawet gdybym podołał zbyt ambitnemu jak na mnie zadaniu, napisania perfekcyjnego protokołu wysyłania danych to oszczędziłbym w super optymistycznym scenariuszu 0,005s a to się ma nijak do tego że sama funkcja takeMeasurements() połyka 0,052s a getCalibratedR() i inne kanały to po 0,031s. Do momentu aż tu nie znajdą się porządne oszczędności (o ile to w ogóle możliwe) to szukanie innych mija się z celem. Spróbuje powalczyć setIntegrationTime() bo tutaj zmiany od 0 do 255 niczego nie zmieniają  choć powinny w szerokim zakresie (sięgając prawie 1s). Dobrze myślę, czy już bredzę od tego ślęczenia przed monitorem?

Udostępnij ten post


Link to post
Share on other sites
24 minuty temu, Wrona napisał:

Dobrze myślę, czy już bredzę od tego ślęczenia przed monitorem?

Dobrze myślisz.

Mnie natomiast interesuje, dlaczego I2C działa dalej na 100 kHz. Ktoś coś wie na ten temat?

Udostępnij ten post


Link to post
Share on other sites

A ja chciałem z innej beczki. Zaglądając do biblioteki i danych katalogowych tego scalaka widzę, że:

  • Czas pomiaru (integracji) może być ustawiony w zakresie 1-255 i oznacza INT_T * 2.8ms, ale nie wolno ustawić INT_T=0.
  • Rzeczywisty pomiar wykonywany jest przez fukcję takeMeasurements(). Tam ustawiany jest tryb singleshot i program kręci się w pętli oczekiwania na gotowość wyników (bit w rejestrze AS726x_CONTROL_SETUP). Wyniki są dostępne poprzez kolejne wywołania funkcji getcośtam(). Czas wykonania takeMeasurements() zależy w oczywisty sposób od ustawionego wcześniej INT_T i od tego jaki tryb pomiaru został ustawiony. Istnieje odmiana funkcji pomiarowej korzystająca z wbudowanej diody LED: takeMeasurementsWithBulb(). Robi to samo to ta prostsza, ale włącza przed i wyłącza po pomiarze wbudowany w płytkę Sparkufun oświetlacz. Można ustawiać jego prąd 🙂 za pomocą: setBulbCurrent().
  • Fukcje z grupy getCalibratedcośtam() odczytują jedynie jakieś wartości kalibracyjne (nie wnikałem) i są czystym odczytem rejestrów I2C bez związku (także czasowgo) z aktualnymi pomiarami więc zawsze wykonują się tyle samo czasu i są rzecz jasna stosunkowo szybkie.

Także: pokaż jak wygląda Twój kompletny program, bo być może robisz coś nie tak np. w ogóle nie robisz pomiarów skoro czas pętli nie zależy od INT_T. Naprawdę warto czasem zajrzeć do datasheet i kodu biblioteki żeby zrozumieć.

https://pdf1.alldatasheet.com/datasheet-pdf/view/894935/AMSCO/AS7263.html

 

Udostępnij ten post


Link to post
Share on other sites
22 godziny temu, marek1707 napisał:
  • Czas pomiaru (integracji) może być ustawiony w zakresie 1-255 i oznacza INT_T * 2.8ms, ale nie wolno ustawić INT_T=0.

Tak wiem o tym. Ale moja wątpliwość nie dotyczyła powodów dla których ustawienie "1" nie skraca pomiaru tylko dlaczego "255" go nie przedłużało do prawie 1s. Rozgryzę to wkrótce.

 

22 godziny temu, marek1707 napisał:
  • Rzeczywisty pomiar wykonywany jest przez fukcję takeMeasurements(). Tam ustawiany jest tryb singleshot i program kręci się w pętli oczekiwania na gotowość wyników (bit w rejestrze AS726x_CONTROL_SETUP). Wyniki są dostępne poprzez kolejne wywołania funkcji getcośtam(). Czas wykonania takeMeasurements() zależy w oczywisty sposób od ustawionego wcześniej INT_T i od tego jaki tryb pomiaru został ustawiony. Istnieje odmiana funkcji pomiarowej korzystająca z wbudowanej diody LED: takeMeasurementsWithBulb(). Robi to samo to ta prostsza, ale włącza przed i wyłącza po pomiarze wbudowany w płytkę Sparkufun oświetlacz. Można ustawiać jego prąd 🙂 za pomocą: setBulbCurrent().
  • Fukcje z grupy getCalibratedcośtam() odczytują jedynie jakieś wartości kalibracyjne (nie wnikałem) i są czystym odczytem rejestrów I2C bez związku (także czasowgo) z aktualnymi pomiarami więc zawsze wykonują się tyle samo czasu i są rzecz jasna stosunkowo szybkie.

To wszystko też wiem. Nie wspominam o tym bo wszystkie te "bulby" są mi kompletnie nie potrzebne i z nich nie korzystam

 

22 godziny temu, marek1707 napisał:

Naprawdę warto czasem zajrzeć do datasheet i kodu biblioteki żeby zrozumieć.

https://pdf1.alldatasheet.com/datasheet-pdf/view/894935/AMSCO/AS7263.html

Zaskoczę Cię, wiec trzymaj się poręczy. Dlatego właśnie nie napisałeś niczego nowego czyli nic czego bym nie wiedział bo znam dokument do którego link podałeś.

Dzięki jednak za zainteresowanie. Dziś lub jutro będę eksperymentował z różnymi wariantami prostego kodu który nic innego prócz pomiarów nie będzie robił. Jeśli natknę się na jakiś problem i będę miał pytania to napisze.

Udostępnij ten post


Link to post
Share on other sites

Niestety nie mam poręczy, ale jakoś przeżyłem. We fragmencie jaki nam pokazałeś nie ma śladu funkcji robiącej rzeczywtsty pomiar więc trudno się domyślić, że robisz w pętli coś jeszcze. Jeżeli masz jakiś tajemniczy program którego timing jest zaskakujący, pokazujesz fragment innego a opisujesz działanie jeszcze czegoś innego, to ciężko się wczuć w Twoją sytuację i pomóc. Podsumowując: czy w pętli któa wykonuje się Twoim zdaniem za szybko jest wywołanie funkcji takeMeasurements()? Dlatego prosiłem o tekst programu co do którego działania masz wątpliwości - to jak obrazek, więcej wyjaśnia niż setki słów opisu i niejasnych odpowiedzi.

Udostępnij ten post


Link to post
Share on other sites

@marek1707  Trochę nie potrzebnie się nakręciłeś. Nie ma jakiegoś tajnego kodu który przed Toba ukrywam. Pokazałem prostą pętle którą cały czas modyfikuje by porównać uzyskiwane wyniki. Np. taki "eksperymencik".

#include <Wire.h>                                                               
#include <AS726X.h>                                                            

AS726X sensor;                                                                  
                                         
byte GAIN = 3;                                                             
byte MEASUREMENT_MODE = 2;                                              
byte czasNIR = 1;                                        

unsigned long start ="0";

void setup()                                                                   
{
Wire.begin();                                                                   
Wire.setClock(400000);
Serial.begin(115200);                                                            
sensor.begin(Wire, GAIN, MEASUREMENT_MODE);                                     
sensor.setIntegrationTime(czasNIR);
start = millis();
Wire.setClock(400000);
Serial.println(((millis()-start)/1000.0), 3);  
sensor.takeMeasurements();                                                       
Serial.print(((millis()-start)/1000.0), 3);
Serial.print('\t'); Serial.println(sensor.getTemperature());
Serial.print(((millis()-start)/1000.0), 3);
Serial.print('\t'); Serial.println(sensor.getCalibratedR());                   
Serial.print(((millis()-start)/1000.0), 3);
Serial.print('\t'); Serial.println(sensor.getCalibratedS());                                              
Serial.print(((millis()-start)/1000.0), 3);
Serial.print('\t'); Serial.println(sensor.getCalibratedT());                                              
Serial.print(((millis()-start)/1000.0), 3);
Serial.print('\t'); Serial.println(sensor.getCalibratedU());                                              
Serial.print(((millis()-start)/1000.0), 3);
Serial.print('\t'); Serial.println(sensor.getCalibratedV());                                              
Serial.print(((millis()-start)/1000.0), 3);
Serial.print('\t'); Serial.println(sensor.getCalibratedW());                                              
Serial.println(((millis()-start)/1000.0), 3);
Wire.setClock(100000);
start = millis();
Serial.println(((millis()-start)/1000.0), 3);  
sensor.takeMeasurements();                                                       
Serial.print(((millis()-start)/1000.0), 3);
Serial.print('\t'); Serial.println(sensor.getTemperature());
Serial.print(((millis()-start)/1000.0), 3);
Serial.print('\t'); Serial.println(sensor.getCalibratedR());                   
Serial.print(((millis()-start)/1000.0), 3);
Serial.print('\t'); Serial.println(sensor.getCalibratedS());                                              
Serial.print(((millis()-start)/1000.0), 3);
Serial.print('\t'); Serial.println(sensor.getCalibratedT());                                              
Serial.print(((millis()-start)/1000.0), 3);
Serial.print('\t'); Serial.println(sensor.getCalibratedU());                                              
Serial.print(((millis()-start)/1000.0), 3);
Serial.print('\t'); Serial.println(sensor.getCalibratedV());                                              
Serial.print(((millis()-start)/1000.0), 3);
Serial.print('\t'); Serial.println(sensor.getCalibratedW());                                              
Serial.println(((millis()-start)/1000.0), 3);
}

void loop()                                                                     
{
}

Jak widzisz nic specjalnego tam nie ma.

Pozwoliło mi to natomiast określić ile mogę "wyciągnąć" z mojego układu. Wiem już nie ma znaczenia czyli prędkość "seriala" to 9600 czy 115200. Wiem już że prawidłowo działa funkcja sensor.setIntegrationTime(); i faktycznie podanie tam 255 lub 0 daje odczyty co około 1,4 czyli 2*0,7s (gdy byte GAIN ustawiam na 2 lub 3) co dokładnie zgadza się z nota katalogową. To co daje zauważalne oszczędności to ustawienie zegara I2C na 400000 i to jest nowość której wczoraj nie udało się osiągnąć a dziś już tak (dzięki Ci @ethanak ). 

Oczywiste jest, że nie ma znaczenia czy wszystko jest w "setup" (jak powyżej) czy w "loop". Jednak najważniejsze jest, że nie ma znaczenia czy pomiar jest realizowany przez powyższy kod czy pętle pomiarową wsadzę do jakiegoś większego ze swoich kilku projektów. Wniosek jest taki że, pozostała część kodu nie ma znaczenia więc wklejanie tu kilkanaście razy dłuższego kodu, podczas gdy kwestia dotyczy jego maleńkiego fragmentu mija się z celem, bo mało kto ma czas by czytać moje koderskie wypociny, które nic nie wnoszą do problemu. 

Wracając do meritum. Jako że jest to moja pierwsza tak poważna próba analizy problemu w informatyce (choć nie widziałem zapewne prawdziwych problemów z jakimi stykają się programiści) to wysnuwam pewne wnioski i proszę tylko o opinie czy są słuszne. Mianowicie ... manipulując bitem w funkcji sensor.setIntegrationTime(bit) osiągam dla bit=255, czas trwania funkcji sensor.takeMeasurements() na poziomie 1,47s. Teoretycznie powinienem dla podanej wartości bit=1 osiągać 0,0055s a osiągam obecnie 0,033 (wynik już po odjęciu obsługi Serial.print() i millis()). Wnioskuje więc że być może te brakujące 0,0275s to czas na obsługę biblioteki czujnika. Czy to słuszny kierunek myślenia? 

Na razie zrobię wersje kodu który poda wyniki czasu dla każdego z wariantów integracji od 1 do 255 i zobaczę jak wyniki teoretyczne rozbiegają się z rzeczywistymi jakie osiągam.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

E tam, niespecjalnie nakręcam przez Forum, mam inne źródełka adrenalinki. Wiesz, są tu różni ludzie i czasem ktoś zwyczajnie nie chce pokazać swojego kodu mimo tego, że pyta o pewne jego szczegóły - jestem przywyczajony - co nie znaczy, że rozumiem. A jak bardzo to pomaga w analizie? Daleko szukać, przykład z Twojego podwórka: piszesz o pomiarze czasu. Wydawałoby się, że mierzysz (wciągasz millis()) tuż przed i tuż po wywołaniu fukcji. Pojechałeś jednak z automatu nie zauważając, że coś takiego:

Serial.println(((millis()-start)/1000.0), 3);

jest następującą sekwencją operacji:

  1. odczyt millis()
  2. odejmowanie 32-bitowe
  3. konwersja na float
  4. dzielenie float
  5. konwersja float na string
  6. dodanie końcowych znaków CR/LF
  7. wysłanie tego przez serial (nawet jeśli to tylko załadowanie kilku znaków do buforaa przecież pewności nie masz, czy akurat nie jest już zapchany)

Tak więc to wszystko musisz dodać do zmierzonego czasu. Bardziej precyzyjnym pomysłem byłoby:

uint32_t przed = millis();
sensor.takeMeasurements();
uint32_t po = millis();
Serial.println(((po-przed)/1000.0), 3);

Wtedy masz pewność, że oprócz testowanej fukcji nic więcej między chwilami łapania czasu się nie wydarzyło. 

Jeśli tylko nam o tym opowiadasz to zwykle musimy zakładać, że robisz to naprawdę dobrze albo ciagniemy za język o dodatkowe wyjaśnienia. Kod rozwiewa wszelkie wątpliwości (i być może zasiewa kolejne..).

Oczywiście generalnie masz rację, czas transmisji I2C dodaje się do czasu wykonania tym bardziej, że przecież procesor dowiaduje się o zakończeniuu procesu pomiaru poprzez odczyt rejestru. Tak więc w najgorszym wpadku będzie to cała ramka adresowania i odczytu rejestru stanu plus kolejne ramki odczytujące wyniki.

Integracja w przetwornikach tego typu służy zwiększaniu czułości  i ew. usuwaniu zakłóceń synchronicznych. Jeśli w tej swojej aplikacji whcodzisz na obszary czasów z jakiegoś powodu niedopuszczalnie długich, to jedynym wyjściem jest zwiększenie mocy promieniowania padającego na powierzchnię fotodiody. Czy możesz to coś jaśniej oświetlać? Czy raczej mierzysz coś, co samo jest źródłem promieniowania i nic więcej nie wyciśniesz? Może zwiększenie temperatury? A może zmiana odległości? Albo jakaś optyka?  Chociaż z tym to zawsze gorzej, bo to jednak jakaś spektrometria a materiały mają współczynniki załamania zależne od długości fali.. No i jeśli podczerwień to zaraz jakieś dziwne materiały na soczewki 😞

 Opowiedz coś więcej o tym co mierzysz 🙂 

Edytowano przez marek1707
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@marek1707 Dzięki. W swoich analizach czasu uwzględniam poprawkę na te opóźnienia wynikające z obliczeń milisekund bo mam je też "zwymiarowane". Jednak na wszelki wypadek spróbuje to zrobić tak jak mi podpowiedziałeś i zobaczę czy wychodzi jakaś różnica. Raz jeszcze dzięki. 

Będzie to pomiar dla przepływającego płynu. Jeśli mi braknie fotonów to spróbuje z diodą NIR o wyższej mocy a mam do wyboru 1W lub 3W a może i 10W (nie sprawdzałem czy są takie w zakresie NIR) więc na razie o to się nie boje. 

Edytowano przez Wrona

Udostępnij ten post


Link to post
Share on other sites

Tak łatwo Ci nie odpuszczę 😉 bo temat wydaje mi się ciekawy. Jeżeli możesz, to napisz proszę:

Jakich diod używasz, bo jednak zwykle są to dość wąskie spektralnie nadajniki a tu mamy detektor szerokopasmowy dodatkowo z podziałem na podpasma więc dochodzą sprawy kalibracji itp a przede wszystkim dobrego pokrycia stosunkowo szerokiego zakresu. O ile powszechne są białe diody (różnie tam z ich widmem bywa - jedne mają raczej ciągłe a inne tylko kilka prążków robiących od biedy za biały), o tyle o diodach pracujących w bliskiej podczerwieni nie słyszałem by dawały coś więcej niż jedną "górkę" w konkretnym miejscu. Ciekaw jestem producenta i typów. Albo chociaż czy są to specjalne diody do tego zastosowania, czy używasz typowych LEDów (albo źródła łączonego z kilku struktur).

Czy mierzysz w świetle przechodzącym? Czy jest to ciecz w przepływająca ciągle w jakiejś rurce czy raczej stojąca w zbiorniku?

Co tak naprawdę chcesz uzyskać? Czy detekcję zanieczyszczeń (jakich, w czym?) czy raczej ocenę składu jakiejś mieszaniny płynów czy może detekcję stężenia jakiejś jednej substancji (np. cukru itp?) rozpuszczonej w płynie. Pytam z czystej ciekawości, do czego ta metoda (i ten chip) może się nadać. Robię wiele systemów pomiarowych, nigdy nie wiadomo.. No i jakich dokładności pomiaru oczekujesz.

Jeśli pracujesz w trybie transmisji (a nie np. odbicia od powierzchni) przez płyn, to czy np. przez odpowiednią modyfikację kształtu ścianek zbiornika nie mógbyś uzyskać efektu naturalnej soczewki skupiającej - coś jak szklanka z wodą. Wtedy bez specjalnej, dodatkowej optyki mógłbyś znacznie zwiększyć moc odbieranego promieniowania i skrócić czas pomiaru. Zwiększanie mocy nadawanej wydaje się jakieś.. trywialne i nie zawsze możliwe: np. zasilanie odległego czujnika z baterii o ograniczonej pojemności/wymiarach, wpływ promieniowania na badany obiekt, podgrzewanie itp).

Jakie ch-ki kierunkowe mają używane oświetlacze LED? Czy producent jakoś to kształtuje, czy diody są raczej dookólne (powiedzmy 120 czy 160°) a o zwierciadła/soczewki musisz zadbać sam?

W zakresie światła i podczerwieni, w metodach NDIR (np. CO2)  stosuje się także specjalne żarówki. Czy rozpatrywałeś takie źródło i dlaczego odpadło?

Jak kalibrujesz swój emiter? Czy masz jakiś pomiar odniesienia po stronie "wejściowej"?

Czy jest to jednorazowe urządzenie badawcze (gdzie uruchmianie, testowanie i kalibracja mogą trwać dowolnie długo a wręcz nigdy się nie skończyć), czy raczej próbujesz zaprojektować komercyjny produkt z planami na produkcję?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@marek1707 

Dużo ciekawych pytań ale jeszcze za wcześnie na rzeczowe odpowiedzi. Czy moduł czujnika się sprawdzi w praktyce to się dopiero okaże, a jeśli zawiedzie to zacznie się szukanie czegoś innego. Jak konfiguracje kanału pomiaru i oświetlacza będzie się sprawować najlepiej to też pokażą testy praktyczne. Co do „komercyjny” czy „planami na produkcje” to jest to dla mnie obce środowisko. Brzydzę się tą sferą co nie znaczy że ją potępiam u innych osób. Tak jak ktoś brzydzący się pająków nie musi potępiać arachnologów. Pewnie gdybym coś sensownego i naprawdę nowatorskiego wymyślił to bym się tym dzielił na lewo i prawo (może tylko bym zadbał by żaden niegodziwiec sam nie mógł tego opatentować). Jednak nie zanosi się na wielkie odkrycie a jedynie dłubie sobie coś tam na warsztacie, co na nobla nie zasługuje, ale mnie się przyda.  Nie ma więc tzw. „dedlajnu”. Coś zrobię i jak nie zadział to skombinuje coś inaczej a jak zadziała to może rozwinę  projekt o nowe funkcjonalności. Bez ciśnienia w gaciach 😊

Skoro masz doświadczenie z systemami pomiaru to mam pytanie odnośnie projektu rozłożonego na innym stole w warsztacie. Do różnych układów pomiarowych przydałby się czujnik CO2. Z tego co zauważyłem czujniki CO są stosunkowo tanie a te do CO2 znacznie droższe. Poleciłbyś coś konkretnego do CO2 żeby mi gładko pracowało w Arduino i by taki gamoń jak ja dał sobie z tym radę (gotowa biblioteka). Zakres pomiaru miałby dotyczyć poziomu CO2 naturalnego dla świeżego powietrza  tj. 0,03% i układ miałby dokonywać głównie pomiaru jego wzrostu w pomieszczeniu.

Udostępnij ten post


Link to post
Share on other sites

Hm, cóż, trudno, chyba więcej się nie dowiemy. Wbrew pozorom na technikaliach nie zależało mi tak bardzo jak na odpowiedzi na proste pytanie: co mierzysz, tj. jaką wielkość fizyczną (skład ogólny, zawartość % jakiegoś konkretnego składnika, itp) przekładasz na obraz w tym czujniku. 

Co do czujników CO2. Generalnie dzielą się na niedziałające zabawki oraz na profesjonalne czujniki z zakresami i rozdzielczościami nadającymi sie do pracy w normalnym powietrzu. Ja od dawna używam tu czujników f-my E+E Elektronik Gmbh. Zrobiłem na nich wiele układów pomiarowych - stacjonarnych i przenośnych, bateryjnych. Działają rewelacyjnie i przez te wszystkie lata nie miałem z nimi kłopotów. Mają co prawda trochę "odjechany" interfejs I2C (znaczy niezgodny z ogólnie przyjętym standardem znaczenia bajtów), ale po pierwszym zdziwieniu (i zrozumieniu) da się to podłączyć i używać. Najwięcej doświadczeń mam z EE893, ale próbowałem też innych. Ostatnio na ich stronie pojawiły się nowe konstrukcje - tych nie testowałem. Zakres 2000 lub 5000 nadaje się idealnie do domu lub firmy, ogólnie do pomieszczeń gdzie są ludzie. Te wyższe to już jakiś przemysł, gdzie CO2 może być z jakiegoś powodu więcej, ale wtedy to już maski itp bo >2500 wyraźnie spoowaaalniaa myśleenieeee. Właśnie EE893 pracuje u mnie w domu. Odpalany co kilka minut (oszczędność zasilania, nie trzeba częściej) daje wykres idealnie pokazujący np. jakość wentylacji grawitacyjnej w budynku (daje radę z 2 osobami w pokoju, ale 3 to już wyraźna równia pochyła), idealnie pokazuje "co piszczy" w odległej kuchni i czy impreza planszówkowa nie przerodziła się już w próbę zanurzeniową niesprawnego U-boota.. Mam coś do tego na Ardunio i chyba ogólnie w C na AVR także. Wadą pochodną od dziwnego protokołu jest konieczność powieszenia czujnika na zupełnie osobnej gałęzi I2C 5V więc jeśli już coś tam masz innego a procesor nie ma drugiego MASTER'a I2C, to multiplekser analogowy będzie jak znalazł 🙂 

EE893.pdf E893_E2-Interface-CO2.pdf EE893_EE892_handling_instr.pdf EE893 Utilising the E2 Interface.pdf

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...