Num PIC

dwupunktowy termometr z numitronami

i mikrokontrolerem w stylu retro



inżynieria na odwrót

    Uczono mnie tak, że zdroworozsądkowe, inżynierskie podejście polega na zidentyfikowaniu problemu czy zagadnienia, a potem na dobraniu środków aby ów temat skutecznie opracować. Tu będziemy mieli na opak - pojawiły się na horyzoncie środki, powstała wtenczas zagwozdka - jak je sensownie wykorzystać? Czyli nie, że dobieramy mikrokontroler optymalnie do wymagań i potrzeb, ale mamy megapocieszny MCU i zastanawiamy się - co fajnego można z nim zrobić? A okaz to zacny i w sumie w Polsce chyba rzadki, to PIC12C508/JW czyli układ ceramiczny i z kwarcowym oczkiem.

taki mały PIC

Poranny przegląd pudelkopodobnej prasówki oraz lokalnych portali handlowych to teraz stały element dnia pracy zdalnej, potem czas na logowanie do domeny i korporacyjny gruz. No i właśnie na jednej z aukcji na znanym portalu na literkę A wypatrzyłam śliczny zaiste układzik w ceramicznej obudowie DIP8. To starej daty, ubogi w zasoby mikrokontroler PIC12C508/JW, jedna sztuka komuś zbywała. Myśl, że ktoś mógłby ten układ kupić i nie byłabym to ja była na tyle natrętna, że pomimo średnio atrakcyjnej cenowo oferty po kilku dniach mogłam się nacieszać tym malcem u siebie. No wiem, robienie masy zdjęć układowi scalonemu tylko dlatego że jest CDIP to zakrawa na...ale proszę spojrzeć, jaki to ładny egzemplarz:





na próbę - sampelki

Wtedy właśnie powstało zagadnienie - do czego tek układzik (o ile okaże się żywy) mogę wykorzystać? Patrząc na notę katalogową, to za wiele on do zaoferowania nie ma, no może poza aparycją. Wtedy ponownie napatoczył mi się zdobyczny moduł wyświetlacza numitronowego, którym zabawiałam się jakiś czas temu, po testach jak działa został rzucony w kąt. I tu pomysł - a może (kolejny, o zgrozo) termometr, ale taki, że ma wszystko na wierzchu, szczególnie wyeksponowany ceramiczny procesorek? Ponieważ 12C508 nie przetwornika A/C jest konieczność dostawienia zewnętrznego układu wraz z osprzętem - źródłem napięcia referencyjnego. Pomiary w mieszkaniu i za oknem narzucają sensory temperatury mogące pracować przy ujemnych wartościach, takie kostki posiadają w Microchip. Finalnie powstał zatem cudak, z którego wyziera wręcz eklektyzm w doborze rozwiązań - mamy retro PIC 12C508 i lampowe wyświetlacze IV-9, mamy napięcie referencyjne MCP1541 oraz 12-bit konwerter ADC MCP3202 pracujący z termometrami MCP9700A, trzy ostatnie pozycje - wszystko z programu deweloperskich próbek. Aha, do sterowania numitronami - TLC5916 od Texas Instruments, oczywiście również próbki.

⇨ TLC5916 8-bit constant-current LED sink driver

⇨ MCP1541 4.096V Voltage Reference

⇨ MCP3202 12-Bit, 100kSPS, Dual Channel ADC

⇨ PIC12C5XX 8-Pin, 8-Bit CMOS Microcontrollers

⇨ PIC12F508

⇨ MCP9700A Low-Power Linear Active Thermistor IC



lampki numitron IV-9 (ИВ-9) - digital light & magic

O lampkach IV-9 wspominałam już na Forum, dla przypomnienia link do pisanki:
⇨ 10099-MBC9 MONOBOARDCOMPUTER 6809 - wiedźmy dłubanie nad uruchomieniem starocia
Warto też wskazać dane katalogowe: ⇨ IV-9 (ИВ-9) Numitron Tube





Względem poprzedniego opisu wykonałam niewielkie usprawnienie, niezbędne w termometrowych zastosowaniach - wyświetlanie kropki dziesiętnej. Niestety radzieccy towarzysze z Komitetu Centralnego uznali obsługę punktów dziesiętnych za zbędną i drucik od tego segmentu został ucięty jakieś 2mm przy szkle lampy. Oj, długo ze sobą walczyłam, czy się za to w ogóle brać... W zamyśle, kropka potrzebna mi tylko na środkowej lampie, gdyby coś poszło nie tak i ona chrupnęła, musiałabym wykonać przeszczep którejś z bocznych, aby mieć ciągłe pole odczytowe. A lampek raptem 6+1, no stres był. Odnośnie samego przyczepienia drucika do kikutka wyprowadzenia - lutowanie odpadało, za blisko szkła. Na szczęście udało mi się wykoncypować takie podejście - z kawałka aluminiowej rurki do zaciskania kabli odcięłam nożem taką jakby tulejkę ~1mm długości, operacja odcinania - na gładkiej części małego wiertła. Nie ma ryzyka, że się rurka zmiażdży pod naciskiem, no i palce bezpieczne, a z tapeciakiem to trzeba uważać. I wspomniany kawalątek rurki nasunęłam na resztę wyprowadzenia wystającą ze szkła i wlutowany w płytkę przewód miedziany. Po arcydelikatnym zaciśnięciu szczypcami, w taki sposób aby siła w nie poszła niechcący w szkło, udało się uzyskać pewne i sądzę, że trwałe połączenie. No i kropka dziesiętna sobie jest.



biohazard - układ MCP9700A na świeżym powietrzu

Ponownie przywołam materiał z Forum, przygotowanie układu MCP9700 do pracy w plenerze było zagadnieniem samym w sobie.
Detale tu: ⇨ 10099-MBC9 MONOBOARDCOMPUTER 6809 - wiedźmy dłubanie nad uruchomieniem starocia





Na Meratroniku V640 jak i na Analog Discovery 2 mamy zaokienne ~534mV, co jakby nie kombinować daje pi razy drzwi temperaturę 3.5'C, raczej chłodno.



Czujnik ten siedzi na parapecie już blisko trzy lata, naszym ogrodowym srokom-rozbójniczkom się znudził (a był czas, że majstrowały przy nim), wiewiórkom także nie przeszkadza w hasaniu po parapecie, mierzy w porządku - cóż więcej chcieć?

moduł sterowania numitronami z układami TLC5916

Schemat ideowy modułu sterującego lampkami IV-9 bazujący na układach TLC5916 oraz jego płytkę drukowaną widzimy poniżej.





Kaskadowe połączenie układów TLC chyba nie wymaga specjalnych wyjaśnień, za to dwa słowa komentarza na temat wartości rezystorów 1k przy tych kostkach. Zerknijmy do dokumentacji układu, do rozdziału `10.1.2 Adjusting Output Current`. Dowiemy się, że układ ma możliwość kontrolowania prądu płynącego przez wyjścia, w szczególności jest on zależny od wprowadzonej do rejestru sterującego danej oraz od rzeczonego rezystora zewnętrznego. Zakładając wartość domyślną słowa sterującego prądem i przekształcając stosowne równanie mamy:

Rext = (15 * 1.25V)/IoutmA

Równanie wynika z krzywej jak na rysunku poniżej, a wartość I,R można szacunkowo dobrać zarówno graficznie jak i kalkulatorem.



Dla lampek IV-9 określono maksymalny prąd żarnika segmentu na około 19.5mA, tak zeznaje dokumentacja. Ja tę wartość asekurancko obniżyłam sobie do 18mA, w końcu nie wiem jakie przejścia ma za sobą mój modułek i jak bardzo był maltretowany. Testując lampki zauważyłam, że dla 18mA świecą bardzo ładnie i nie ma potrzeby ich dodatkowo nadwyrężać. A zatem podstawiając przyjęte 18mA do równania powyżej dostajemy rezystancję ~1k, taka właśnie figuruje na schemacie.

Sama realizacja sterownika to typowy domowy termotransfer z wykorzystaniem laserowego wydruku. Z odkryć - do oczyszczania laminatu używałam do tej pory pumeksu kosmetycznego w strumieniu letniej wody. Całkiem dobrym pomysłem okazało się dodanie pasty do szorowania `Ola`. Wykorzystanie jej w kuchni to masakra dla lśniących powierzchni, normalnie rysy zostawia. Ale do laminatu - idealnie, a kosztuje raptem kilka złotych.







Płytka rozmiarami i otworami mocującymi dedykowana jest modułkowi sowieckich numitronów, będzie siedziała za tyle, na słupkach dystansowych.

planowanie ma przyszłość

Widok miliarda punktów lutowniczych na tyle płytki budził pewną konsternacją, no ale jak chcę mieć to trzeba to jakoś ugryźć. Po pierwsze oczyściłam końcówki lutownicze z resztek poucinanych kabelków. Były już ponumerowane, więc o tyle mniej dziubaniny. Następne zadanie to identyfikacja, który drucik należy do którego segmentu i udokumentowanie tego na kawałku kartki. Przydaje się tu lusterko, bo można operować na zadku modułu, widząc co się dzieje z lampą na przodzie. Oczywiście, należ brać poprawkę na lustrzane odbicie, ale jakoś się udało. Powstała kartka-ściągawka, na której miałam rozpisane wyprowadzenia i lampki i sterownika TLC5916, tak jak to będę widziała podczas krosowania modułów. No i jazda.





połączenie modułu lamp i sterownika

Przygotowałam bukiet 6 x 7 cieńszych przewodów oraz kilka grubszych do podłączenia zbiorczych końcówek lamp IV-9, potem lutowanie. Wielkim ułatwieniem była ta rosyjska numeracja lakierem na tyle jak i zachowana w niej konsekwencja. Lutowałam jak automat, sztuka po sztuce, dość żmudna to praca, ale jakoś poszło.







testowe uruchomienie

Tu chronologię opisu nieco zaburzę, ponieważ pierwsze testy tak naprawdę były sporo wcześniej. Przede wszystkim mikroprocesor w testowej instalacji to PIC12F508 (z Flash), próbeczka oczywiście i z możliwością reprogramowania w układzie moim ulubionym PICKIT3. Na zdjęciach widzimy też kostkę UCY7400, już tłumaczę co się wydarzyło. Jak wrócimy na chwilę do schematu układu sterowania lampami, to widzimy, że linie CLK i LE wszystkich układów TLC5916 są połączone. Zerkając choćby pobieżnie w dokumentację do rodziny PIC12F widzimy, że ma on wystarczającą wydajność prądową aby taką girlandę wejść wysterować, uznałam, że wszystko jest ok. A tu guzik. Za linię sterującą sygnałami CLK przyjęłam pierwotnie GP1/ICSPCLK mikrokontrolera, no bo w końcu jak clock to clock. Tylko że podczas programowania w układzie to PICKIT3 jest źródłem sygnału zegarowego, nie PIC! I biedny PICKIT nie dość, że musiał taktować PIC-a to jeszcze całą bandę wejść CLK kostek sterujących do lamp. No brawo JA!. Chwilę dłuższą nad tym się głowiłam, ponieważ układ nie chciał się programować i aby nie robić demolki w kleconym na kolanie programie - odseparowałam girlandę CLK i PIC-a właśnie dwoma NAND-ami z układu 7400. Takie sposoby babuni, na szybko, aby nie stopować prac. Potem dopiero nastąpiła przekładanka funkcji poszczególnych pinów PIC-a i CLK przypisałam do wyprowadzenia nie mającego nic wspólnego z programatorem. Ot, przygoda taka, ale uczy że parametrów elektrycznych takiego wielowejścia nie wolno lekceważyć.





Oczywiście pamiątkowy filmik z testu jednego elementu kaskady układów TLC, prosty licznik. Te lampki na żywo są po prostu genialne.



sprawdzenie większej całości

Konieczny był kompleksowy test połączeń, przy takiej ilości drucików jednak łatwo się merdnąć. Najprostszy teścik to wsunięcie na wyświetlacz wszystkich cyferek po kolei, przy okazji poukładałam sobie w programie stałe odpowiadające za kształt potrzebnych mi znaków. Oczywiście zaświeciła się także kropeczka dziesiętna - to ten maleńki świetlisty pazurek pod cyfrą 2, pięknie. Ze spraw nie tyle niepokojących co raczej - godnych atencji to pobór prądu przez normalnie pracujący wyświetlacz. Normalnie czyli ani nie na maks, ani na min, tylko z taką typową liczbową zawartością. Pobór prądu dochodzi do 800mA (przy 5V), to trzeba mieć na uwadze dobierając zasilacz oraz...przewody zasilające zabawkę. Przy takich prądach spadki napięcia na cherlawych linkach mogą mi się odbić czkawką na pomiarach, no tak.







nocna jazda

Tu kilka późno wieczornych zdjęć tych cudnych wyświetlaczy, w międzyczasie ewoluował program sterujący, wzbogacenie o pełną obsługę przetwornika MCP3202 dało możliwość przetestowania jak mogłoby wyglądać -50'C za oknem, w końcu zima za pasem.





Element obowiązkowy czyli filmiki. Cały czas kombinowałam, jak ładnie przełączać się pomiędzy ekranikami temperatury zewnętrznej i wewnętrznej. Tu mamy po prostu wygaszanie jednego pomiaru, chwila przerwy i pojawia się drugi pomiar. Wada taka, że są lampki, które nie będą zbyt często pracowały np. ta od znaku minus, skrajna lewa. Inne znowu będą na stałe świeciły to samo - czyli 'C. A tu trzeba życia, przecież ruch to zdrowie.

 

modułek procesora PIC i ADC

Uporządkowanie druciaka części sterującej skutkuje schematem jak poniżej, nadziubałam się przy nim więc dwa zdania komentarza. Przetwornik MCP3202 komunikuje się via czteroprzewodowe SPI z mikrokontrolerem PIC, wybieranie ADC-ka jest via linię GP1/MCP3202_CS. Źródłem zasilania jak i jednocześnie napięciem referencyjnym jest kostka MCP1541, produkująca na wyjściu teoretycznie 4.096V. Piszę teoretycznie, ponieważ deklarowana dokładność ±1% tego napięcia dopuszcza rozrzut, mój egzemplarz ma akurat 4.06V co mieści się w normie. Pobór prądu przez przetwornik ADC (nawet w stanie aktywności) jest na poziomie kilkuset uA, zasilanie go wprost z Uref jest dopuszczalne, a nawet wskazywane przez notę katalogową (pdf do MCP1541, 4.2 Typical Application Circuits, FIGURE 4-4 ADC Reference Circuit).

Dwa kanały przetwornika to dwa zapięte układy MCP9700A, wyjścia zablokowane małymi kondensatorkami. Po pierwsze filtrują sporo śmiecia, przewody w sumie długie, a w okolicy sporo elektroniki u mnie pracuje. No i wprowadzają pewną inercję w pomiarach, akurat w przypadku temperatury uważam to za dopuszczalne, wyniki nie wierzgają tak po wyświetlaczu. Sam procesor pracuje w minimalistycznym układzie aplikacyjnym, taktuje sam siebie wewnętrznym oscylatorem.



Nie przewidziałam grzebyka dla PICKIT3 do programowania w systemie, taka optymalizacja. Docelowa kostka PIC12C508 będzie zaprogramowana na zewnątrz, w chińskim programatorku z ALI, a wszelkie testy i radosna deweloperka póki co na płytce stykowej. No i zawsze mam możliwość nasadzenia na PIC-a w DIP8 klipsa pomiarowego i podłączenia w ten sposób programatora.



modułek procesora PIC - realizacja

Płytka MCU i ADC jest zupełnie niewielka i wymiarami dostosowana do przestrzeni jaką miałam pomiędzy sześcioma lampami po lewej i skrajną prawą, jakieś 50x30mm. Intencyjnie płytka jest tam, ponieważ od frontu będzie ładnie widać ceramicznego PIC-a z kwarcowym oczkiem, a to główny cel tej zabawki. Reszta pracy to jak zwykle domowy laserowy termotransfer. Sygnaturka się nie zmieściła, zaryzykowałam zatem wyskrobanie jej rylcem na tonerze i możliwe, że nawet jakoś to wyszło.









Nieco dyskusyjna jest sprawa grzebyków do przyłączania czujników temeratury jak i modułu wyświetlaczy. Miałam do wyboru dwa konkurencyjne warianty - igiełki proste i kątowe. Stanęło na prostych, a życie pokaże czy to był dobry wybór, ewentualnie się przelutuje na inne. PIC testowo włożony w płytkę, choć tylko do zdjęcia to wygląda szpanersko. Czuć tę technikę mikroprocesorową normalnie, ale super!





program na jednej kartce

Na początku miałam autentycznie szczere chęci nabazgrać to w assemblerze, ale wizja dzieleń i konwersji binarnej wyniku na wsad dla wyświetlacza szybko mnie z tego wyleczyły. Samoudręczenie też ma swoje granice. Program sterujący powstał zatem w C, konsekwencją jest...pewien niedosyt tak zwanych bajerów, które miałam w planach, a które się nie zmieściły do zabawki ze względu na ograniczenia w rozmiarze pamięci kodu.
W wielkim skrócie działa to wszystko tak, że w nieskończonej pętli odczytywany jest przetwornik ADC, podawany jest na zmianę numer kanału 0 i 1. Pobrana z MCP3202 wartość liczbowa jest przerabiana na ludzką postać dla wyświetlacza, numer kanału prezentuje na skrajnej prawej lampce, 0 - jak zero lub Outdoor, I jak jeden ewentualnie Indoor, łatwo zapamiętać. Kod zakłada odejmowanie stałęj wartości offzetu 500mV aby uzyskać realną wartość temperatury, wynik wyliczany jest z dokładnością do 1/10 stopnia. No przy MCP9700A co ma ±2% to duży bajer powiem szczerze. Ale fajnie wygląda.
Zmiana zawartości wyświetlacza jest tak fikuśna jak pozwolił kompilator z włączoną optymalizacją. Pomiar pojawia się na wyświetlaczach tak po prostu, ale znika jakby wypychany przez puste miejsca, wyjeżdza z wyświetlaczy. To zapewnia, że wszystkie lampki i ich wszystkie segmenty są w użyciu, nierównomiernie wprawdzie, ale jednak.
Dodatkowa ciekawostka - w tym układzie bez żadnych zmian w kodzie będzie mógł pracować biedniejszy braciszek 12-bitowego MCP3202, a mianowicie MCP3002, który to ma 10-bit. Już tłumaczę, najpierw o 12-bitowym koleżce.
Z dokumentacji wynika, że DigitalOutputCode = 4096 * VIN / VDD, dla Uref (czyli VDD) równego 4.096V dostajemy równiutko 1 bit wyniku to 1 mV. Czyli przy tak właśnie dobranym Uref jak sobie wykoncypowałam tutaj, ADC zwraca mi wartość wprost w miliwoltach, nie potrzeba żadnych dodatkowych dziwnych przeliczeń. Dla przetwornika MCP3002 powyższe równanie będzie operowało stałą 1024 w liczniku co daje zmianę 1 bit co 4mV. Sztuczka polega za to na tym, że jeden i drugi przetwornik po wystawieniu swojej deklarowanej ilości bitów na linię DOUT resztę dopełnia bitami o wartości zero, ile byśmy mu taktów zegara nie podali. Więc dla stałej ilości iteracji (tu:12) przetworniczek MCP3202 zwróci wynik jak nakazano w kwitach, a przetwornik MCP3002 zwróci jak umie - wyśle swoje 10 bitów, dwa pozostałe dopełni zerami. Technicznie oznacza to pomnożenie wypracowanej przez niego wartość o 4 (przesunięcie bitowe w lewo o 2 bity). I stąd możlwość podmiany kostek przy już zaprogramowanym MCU. Jedyne co, to ostatnia cyfra wyniku będzie nam kicała modulo 4, a ona i tak jest bardziej gadżetem niż wiążącą wartością. Wspominam o tym tak profilaktycznie, może na inne okazje się komuś przyda, ważne jest tylko skonfigurowanie komunikacji z ADC na MSB First - to bit MSBF w czterobitowym słowie sterującym wysyłanym do kostki przy każdej konwersji.

// main.c
#pragma config OSC = IntRC
#pragma config WDT = OFF 
#pragma config CP = OFF 
#pragma config MCLRE = OFF 

#include < xc.h >
#define _XTAL_FREQ 4000000
// przypisanie funkcji do GPIO - w miare zgodnie ze schematami
#define CLOCK_OUT   GP5 
#define DATA_OUT    GP0
#define TLC5916_LE  GP2
#define MCP3202_CS  GP1
#define DATA_IN     GP4

#define SEG_A   0x01
#define SEG_B   0x02
#define SEG_C   0x04
#define SEG_D   0x08
#define SEG_E   0x10
#define SEG_F   0x20
#define SEG_G   0x40
#define SEG_K   0x80

#define CHAR_MINUS  SEG_G
#define CHAR_DEG    (SEG_A|SEG_B|SEG_F|SEG_G)
#define CHAR_C      (SEG_A|SEG_D|SEG_E|SEG_F)
#define CHAR_0      (SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F)
#define CHAR_1      (SEG_B|SEG_C) 	  	  	  	 
#define CHAR_2      (SEG_A|SEG_B|SEG_D|SEG_E|SEG_G)
#define CHAR_3      (SEG_A|SEG_B|SEG_C|SEG_D|SEG_G)
#define CHAR_4      (SEG_B|SEG_C|SEG_F|SEG_G)
#define CHAR_5      (SEG_A|SEG_C|SEG_D|SEG_F|SEG_G)
#define CHAR_6      (SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G)
#define CHAR_7      (SEG_A|SEG_B|SEG_C)
#define CHAR_8      (SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G)
#define CHAR_9      (SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G)

void sendByte( unsigned char byte ) {
    unsigned char b = byte;
    signed char n = 8;
    while ( n-- ) {
        DATA_OUT =  ( b & 0x80 ) != 0;
        CLOCK_OUT = 1;
        CLOCK_OUT = 0;        
        b = b << 1;        
    }
}

#define SEND_BIT(b)     DATA_OUT=b;CLOCK_OUT=1;CLOCK_OUT=0;    
unsigned short getADC(unsigned char channel) {
    unsigned short adcVal = 0;
    unsigned char n;
    MCP3202_CS = 0;        // wybierz ADC
    SEND_BIT( 1 );          // start bit
    SEND_BIT( 1 );          // SGL = 1
    SEND_BIT( channel );    // 0 lub 1 - kanaly
    SEND_BIT( 1 );          // MSBF
    for ( n = 0; n < 12; n++) {
        adcVal = adcVal << 1;
        CLOCK_OUT = 1;
        CLOCK_OUT = 0;    
        adcVal = adcVal | DATA_IN;
    }
    MCP3202_CS = 1;        // zwolnij ADC
    return adcVal;
}

void main(void) { 
    const unsigned char displayChars[ 10 ] = { 
        CHAR_0, CHAR_1, CHAR_2, CHAR_3, CHAR_4,
        CHAR_5, CHAR_6, CHAR_7, CHAR_8, CHAR_9
    };    
    signed short adcValue;
    unsigned char digit;
    unsigned char channel = 0;
    unsigned char blank = 0;
    
    OPTION = 0x00;
    TRIS = 0x10; // oooioooo 
    CLOCK_OUT = 0;
    DATA_OUT = 0;
    TLC5916_LE = 0;
    MCP3202_CS = 1;
    
    while ( 1 ) {  
        blank ^= 1;
        if ( blank ) {
            adcValue = getADC( channel ) - 500; // tu mamy napiecie w mV        
            channel ^= 1;
            if ( adcValue < 0 ) {
                adcValue = -1*adcValue;            
                sendByte ( CHAR_MINUS );            
            }
            else {
                sendByte ( 0x00 );                        
            }                
            digit = adcValue / 100;    
            sendByte ( displayChars[ digit ] );        
            adcValue = adcValue % 100;    
            digit = adcValue / 10;     
            sendByte ( displayChars[ digit ] | 0x80 );    
            digit = adcValue % 10;
            sendByte ( displayChars[ digit ] );        
            sendByte ( CHAR_DEG );        
            sendByte ( CHAR_C );
            sendByte ( channel ? CHAR_1 : CHAR_0 );        
            TLC5916_LE = 1;
            TLC5916_LE = 0;
            __delay_ms( 3000 );                                             
        }
        else {
            digit = 7;            
            while ( digit-- ) {
                sendByte ( 0x00 );                
                TLC5916_LE = 1;
                TLC5916_LE = 0;
                __delay_ms( 200 );                                 
            }  
        }        
    }
    return;
}

No, przyznam - dawno nie zdarzyło mi się tak dopychać kolanem kodu w procesorze, oj dawno. Niewiele co z pamięci programu zostało, z pamięci danych w sumie też. Ale najważniejsze, że programik całkiem sympatycznie działa.



w poszukiwaniu absolutnego zera

Tego typu sprawdzenia to właściwie powinnam wykonać przez zaprogramowaniem układu z oczkiem, no ale ja wszystko na odwrót ostatnio robię...Mając taki MCP9700A czy to ze skelpu czy z próbek warto dowiedzieć się jakie on rzeczywiste wartości zwraca, jak dany egzemplarz naprawdę mierzy. Testy z wrzątkiem uznałam za nieco ryzykowne no i poza zakresem pracy tych układów, żadnego termostatu sensownego w domu nie mam. Pozostał test w zero stopni, dośc prosty do przeprowadzenia, choć pewe ceregiele były konieczne. Takie szkolne doświadczenie z fizyki.
Na początek przedstawiam moją gromadkę zdobycznych, archiwalnych termometrów. To fajny, starej daty szkolny sprzęt, są i rtęciowe i alkoholowe. Niestety jeden z czerwonych ma przerwę w słupku cieczy pomiarowej, to będzie do ogarnięcia w wolnej chwili, a testy robiłam na rtęciowym -20..+100'C z działką 1'C.





Zamysł taki miałam, że zabezpieczony przez wilgocią czujnik włożę do pojemnika z wodą i kostkami lodu, taka mieszanka powinna utrzymać przez dłuższą chwilę całkiem wiarygodne zero stopni. Oczywiście fizyce należy nieco pomóc, stąd komora kriogeniczna w postaci plastikowego opakowania po sałatce i małego ręcznika frote jako izolacji cieplnej. W to opakowanie idzie drugie pudełko - już na chłodziwo. No i do środka lód z zamrażarki plus schłodzona wcześniej woda.





Lodowa zupka wraz z instalacją testową przezentuje się dość interesująco, do zabezpieczenia MCP9700A wykorzystałam zwykły woreczek na strunę, całość wraz z termometrem wciśnięta pod lód.





No i powiem szczerze, byłam niemile zaskoczona. Tyle czarowania, chłodzenia a tu minimalne odczyty na poziomie 1.7`C. Aż Meratronikiem neonowym zmierzyłam napięcie na przetworniku, no ale autentycznie ~517...519mV uparcie pokazywał, to przekłada się na mniej niż dwa stopnie, ale do zera jednak sporo. Co to jest?!



Olśnienie przyszło po dłuższej chwili, tak, że musiałam dołożyć nowego lodu. Przecież te grubaśnie (oczywiście subiektywnie patrząc) druciory przylutowane do wyprowadzeń MCP9700A dostarczają mi pasożytnicze (że tak ujmę) ciepło bokiem!. Linkę sygnałową wzięłam nieco grubszą, w pokoju w sumie mam całkiem ciepło, te miedziane wąsy podgrzewały mi kostkę, widać na tyle skutecznie, że aż tak wykrzywiło oczekiwany wynik.

Rozwiązanie proste - jak najwięcej tej linki też wsadzić pod lód, aby była schłodzona, całość od góry uszczelniłam jeszcze wełnianym szalem. No i voila! Kontrolne zero wygląda jak zero, tu jest dobrze.



Od razu zrobiło się lepiej czyli chłodniej, finalnie udało mi się zmusić MCP9700A do pokazania 0.2'C, a biorąc pod uwagę, że to ekonomiczny układ i w warunkach mocno prowizorycznych - wynik uważam za zadowalający. Powstaje zagadnienie, czy powinnam uwzględnić ten okruszek w programie i korygować wskazania na wyświetlaczu. No cóż, układ już zaprogramowany, od nowa kasować i programować kostki to mi się nie uśmiecha, wiec pytanie jest retoryczne, chociaż...



Gdyby jednak komuś przyszło do głowy z aptekarską dokładnością traktować odczyty to można zastosować takie podejście jak poniżej. Wiadomo, że MCP9700A ma niby 500mV offsetu napięciowego ustalające jego sztuczne zero `C. I to 500mV trzeba odjąć od wyniku z przetwornika przed dalszą obróbką numeryczną. No to odejmujemy nie równe 500, ale wartość zwiększoną/zmniejszoną o korektę wymaganą dla indywidualnie przebadanego egzemplarza układu scalonego. Na podobnej zasadzie można program łatwo dostosować do pracy i z MCP9700A i z LM35, gdzie także jest 10 mV/C, ale nie ma tego 0.5V przesunięcia. Po prostu wpisujemy 0 ewentualnie drobną (niestety działającą tylko w górę) korektę.

   const unsigned short correction [ 2 ] = { 
        500 + 15, /* korekcja dla czujnika outdoor, który zawyża, obniżamy temp. o 1.5'C czyli 15mV */
        500 - 10  /* korekcja dla czujnika indoor, który zaniża, podwyższamy temp. o 1.0'C  czyli 10mV */
    };
    // adcValue = getADC( channel ) - 500; // tu mamy napiecie w mV        
    adcValue = getADC( channel ) - correction [ channel ]; // tu mamy napiecie w mV z korekcją        

PIC z oczkiem - programowanie

Utrwalenie pracowicie wydzierganego programu w zdobycznym PIC12C508A to były egzorcyzmy same w sobie. Najpierw trzeba kostkę skasować, tak jak typowy staroświecki EPROM. Mam ku temu wypatrzoną na warszawskiej Olimpii lampę typu słoneczko elektryczne. To grzałki wraz z promiennikiem UV, całość niewielkiej mocy i w sumie bezpieczna. W maksymalnie 20 minut z odległości około 20 cm jest w stanie wyczyścić każdy EPROM, oczywiście trzeba uważać, aby się nie naświetlić, ponieważ solarium to jest raczej marne. Rozruch lampki dla testu, po dłuższym leżakowaniu wygląda tak:



Kasowanie dla bezpieczeństwa domowników na balkonie, procesor wpięty w gąbkę do czyszczenia grotu w Elwiku, tam jednak jest dość ciepło i inny materiał mógłby się podsmażyć. No i ponad kwadrans opalania na świeżym powietrzu.





Samo zaprogramowanie układu, to już banał, choć emocje też były - w końcu w tym momencie mogło się okazać, że zakupiony cudny układzik jest tylko martwym kawałkiem cementu. Ale nie był na szczęście, kostka odpowiedziała a blank check potwierdził skuteczność naświetlania. Pogramowanie również wyśmienicie się udało.



tajemniczy blask (po raz trzeci)

No i właściwie to prace można by uznać za zakończone - cel osiągnęłam. Pociesznie migający termometr na retro lampkach i MCU z oczkiem usadowiony w kącie, na parapecie. Razem z Lucyferkiem (który i tak się ostatnio kurzył) dogadują się znakomicie, te 0.8A poboru prądu dla toru 5V regulowanego Diabołka nie jest problemem i całość pracuje ciągle już od kilku dni bez przerwy.



I jeszcze filmiki wykonane w międzyczasie, -38'C to efekt specjalny zaraz po podłączeniu czujników do nowej płytki, pierwsze uruchomienie. Po prostu sprawdzane omomierzem kondensatorki nabrały ładunku, póki to się nie ustabilizowało w układzie - wskazania były...niecodzienne.

 

No i na koniec ciekawostka, w sumie nie na temat, ale w jakiś sposób dotycząca powyższych prac. Zauważyłam, że po ustawieniu na maks. napięcia w torze regulowanym Lucyferka odczyt napięcia zaczyna skakać pomimo braku obciążenia. Dociążony za to był tor 5V. Podłączyłam UM-110, którym się aktualnie nacieszam i dopiero gibania wskazówki nasunęły mi myśl skąd się to bierze. Zauważyłam, że wskazówka pływa spójnie ze zmianami na wyświetlaczu. Im mniej segmentów się świeciło, tym szła wyżej. Dla, że tak ujmę - pełnego - wyświetlacza, napięcie przysiadało. No i przyczyną jest dociążenie transformatora z moim zasilaczu. Tor 5V ma przed LM7805 jeszcze spory zapas napięcia, tam na mostku Graetza jest jakieś 10V i nawet nieco przyduszone dawało stabilizatorowi te minimalne 3V różnicy napięć wymaganej do sensownej pracy. Tor regulowany z L200 już takiego zapasu nie miał. Napięcie za jego prostownikiem spada na tyle dużo, że gdy życzę sobie 27-28V na wyjściu, to biedne L200 nie ma skąd tego wziąć, daje co może - i to własnie geneza tych zmian odczytu napięcia. Ot, takie małe dochodzenie moje, wszelkie czary ja uznaję w życiu ale nie w elektronice. Tu się musi wszystko logicznie spinać, a przynajmniej takie sprawiać wrażenie.





#slowanawiatr, październik-listopad 2020

Natasza Biecek 2004-2020/~, e-mail