Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

UNI-T UT60E i LabView - ramka transmisji

04 Gru 2005 11:22 4798 4
  • Spec od car audio
    Kupiłem sobie miernik UNI-T UT60E w celu zabawy i nauki pod LabView. Niestety producent nie podał ramki transmisji danych. Udało mi się skomunikować i wygląda na to, że nie jest to ASCII a jakieś dane binarne jakby do drivera LCD. Może ktoś przerabiał ten temat i wie coś więcej, bo ja trochę się podłamałem - robienie z łańcucha danych konkretnych danych pomiarowych w tym przypadku to mi pod koszmar podchodzi.
  • Poziom 11  
    Tak jak napisałeś, jest to niemalże bezpośrednie wysłanie przez RS232 informacji dla wyświetlacza LCD, ale tego, który jest zainstalowany w mierniku. Producent w instrukcji obsługi błędnie podał informację o parametrach transmisji pisząc o 7 bitach danych i bicie kontroli parzystości (może tak było w jakiejś poprzedniej wersji miernika, bo w mojej wersji jest inaczej). Właściwe parametry transmisji dla UT60E zakupionego w grudniu 2006:
    - 2400 bps,
    - 8 bitów danych,
    - 1 bit stopu,
    - brak bitu parzystości,
    - brak kontroli przepływu.
    Ramka składa się z 14 bajtów (Uni-t UT60E może tylko wysyłaś, ponieważ fizycznie zainstalowana jest jedna dioda nadawcza), a charakterystyczne jest to, że każdy bajt jest "numerowany" na starszej czwórce bitów. Bajt pierwszy =1, drugi =2 itd. Odczytując z czternastobajtowego ciągu znak 6F do razu wiemy, że jest to bajt szósty, a np. B0 to bajt jedenasty. 8 bajtów od 2-giego do 9-tego przechowuje wartość poszczególnych cyfr widocznych na LCD, bajt pierwszy "mówi" np. o trybie pomiaru AUTO-MANUAL, a bajty od 10-go do 14-go informują o jednostce i pozostałych trybach pracy (np. pomiar względny z wyświetloną "deltą" na LCD).
    Jeśli temat dla kogoś nadal jest interesujący, proszę o inforację, a zamieszczę opis "odzyskania" wartości liczbowej z ciągu bajtów - po prostu nie chcę za bardzo się rozpisywać, jeśli nikomu to nie będzie służyło, lub już temat jest wyczerpany np. na innych forach (choć osobiście informacji takich nie znalazłem).
    Pozdrawiam
  • Spec od car audio
    Oczywiście, że dalej jestem zainteresowany tym tematem - co prawda odłożyłem miernik na bok i na razie się bawię kartą przetworników A/C i C/A ale dobrze byłoby mieć też mobilny przyrząd pomiarowy z działającym łączem do komputera.
  • Poziom 11  
    Jak już wspomniałem cyfry wyświetlane na LCD są wysyłane przez miernik na bajtach od 2-giego do 9-tego. Dla przesłania każdej cyfry potrzeba zatem 2 bajtów, ponieważ każdy z 14 bajtów przesyłanej ramki na starszych bitach jest numerowany od 1 do E (do 1 do 14 dziesiętnie). Dlatego w celu odzyskania "czystych" danych należy z bajtów usunąć numerację i sąsiadujące ze sobą bajty "skleić" jak pokazano na rysunku:

    UNI-T UT60E i LabView - ramka transmisji

    Cyfra pierwsza (na LCD od lewej), to zbitka młodszych części bajtów 2a i 3b - odpowiednio tworzą jeden bajt o wartości szesnastkowej $ab. Tak samo należy postępować z pozostałymi trzema cyframi. Uzyskane w ten sposób liczby (a właściwie ich reprezentacja bitowa) bezpośrednio "sterują" segmentami wyświetlacza LCD:

    $7D, $FD: z:=0;
    $05, $85: z:=1;
    $5B, $DB: z:=2;
    $1F, $9F: z:=3;
    $27, $A7: z:=4;
    $3E, $BE: z:=5;
    $7E, $FE: z:=6;
    $15, $95: z:=7;
    $7F, $FF: z:=8;
    $3F, $BF: z:=9;

    Dla przykładu cyfra "0": wartość szestnastkowo $7D odpowiada binarnej postaci b01111101, więc zgodnie z poniższym rysunkiem wysterowane zostaną segmenty (licząc bity od prawej do lewej): 1,3,4,5,6,7 ponieważ na tych pozycjach w reprezentacji bitowej występują jedynki.

    UNI-T UT60E i LabView - ramka transmisji

    Na ósmej pozycji w reprezentacji bitowej wystąpi "jedynka" jeśli wynik pomiaru jest ujemny (na LCD przed pierwszą cyfrą pojawi się wówczas "minus"). Jeśli na ósmej pozycji reprezentacji bitowej pojawi się "jedynka", a cyfra nie jest pierwsza, oznacza to wysterowanie przed nią znaku "przecinek". Dlatego kilka linijek wcześniej dla wszystkich cyfr przedstawiłem dwie wartości w kodzie szesnastkowym (pierwsza kolumna oznacza "czystą" cyfrę, druga kolumna oznacza cyfrę poprzedzoną "przecinkiem" lub "minusem" jeśli jest cyfrą pierwszą na LCD).

    Tyle o cyfrach. Bajt pierwszy (1x) zawiera informację o trybie pracy: Auto/Manual oraz AC/DC. Po usunięciu numeracji zostają cztery bity. Pierwszy (licząc od prawej) chyba zawsze ma wartość "1", drugi - jeśli jest "1", to pomiar przeprowadzono w trybie AUTO, jeśli "0", to w MANUAL. Bit trzeci przyjmuje wartość "1" zamiennie z bitem czwartym, czyli nigdy nie przyjmują wartości "1" jednocześnie i dlatego: jeśli trzeci bit jest "1", to pomar DC, a jeśli czwarty ma wartość "1", to pomiar AC (tak jak na wyświetlaczu).

    Ostatnie pięć bajtów przechowuje informacje o jednostkach (A,V,Hz,...) i o mnożnikach (k,M,m,...). Kombinacji jest bardzo dużo, więc analizować najłatwiej kombinacje wartości tych bajtów. Poniżej zamieszczam fragment działającego programu w Delphi, ponieważ "tłumaczenie" na język ludzki byłoby czasochłonne. Omówię tylko pierwszy przypadek:
    Jeśli czternasty bajt ma wartość $E8 i jednocześnie jedenasty bajt przyjmuje wartość $B8, to wiadomo, że wynik przesłany jest w "mili". A jaka wielkość fizyczna jest w tych "mili", to program sprawdza kilka wierszy niżej...

    // mnożniki

    if (ord(str[14])=$E8) and (ord(str[11])=$B8) then begin
    Label2.Caption:=Label2.Caption+'m';
    wynik2:=wynik2/1000;
    end;
    if (ord(str[14])=$E8) and (ord(str[10])=$A8) then begin
    Label2.Caption:=Label2.Caption+'µ';
    wynik2:=wynik2/1000000;
    end;
    if (ord(str[14])=$E8) and (ord(str[11])=$B2) then begin
    Label2.Caption:=Label2.Caption+'M';
    wynik2:=wynik2*1000000;
    end;
    if (ord(str[14])=$E8) and (ord(str[10])=$A2) then begin
    Label2.Caption:=Label2.Caption+'k';
    wynik2:=wynik2*1000000;
    end;

    // jednostki

    if (ord(str[14])=$E8) and (ord(str[13])=$D8) then begin
    Label2.Caption:=Label2.Caption+'A';
    jednostka:='A';
    end;
    if (ord(str[14])=$E8) and (ord(str[13])=$D4) then begin
    Label2.Caption:=Label2.Caption+'V';
    jednostka:='V';
    end;
    if (ord(str[14])=$E8) and (ord(str[13])=$D2) then begin
    Label2.Caption:=Label2.Caption+'Hz';
    jednostka:='Hz';
    end;
    if (ord(str[14])=$E1) and (ord(str[13])=$D0) then begin
    Label2.Caption:=Label2.Caption+'°C';
    jednostka:='°C';
    end;
    if (ord(str[14])=$E8) and (ord(str[12])=$C4) then begin
    Label2.Caption:=Label2.Caption+' Ohm';
    jednostka:=' Ohm';
    end;

    Mam nadzieję, że podane przeze mnie informacje przyczynią się do zrozumienia protokołu transmisji miernika UT60E i pomogą Wam w tworzeniu własnego oprogramowania.

    Pozdrawiam
  • Spec od car audio
    Wielkie dzięki. Opis praktycznie jak książkowy - gotowy do zastosowania. Co prawda ja potrzebuję zrobić to pod LabView ale teraz myślę, że dam radę. Jeszcze raz wielkie dzięki, myślę, że to się przyda nie tylko mi.