THE DETONATOR

zdjecie

MAIN MENU
Opis urządzenia   Moduł programatora   Moduł wykonawczy   Zasilanie   Obsługa   PLIKI
Serce układu
Klawiatura
Wyświetlacz
Pamięć EEPROM
Sygnalizacja akustyczno-optyczna
Magistrala danych
Zatrzaski
Opis kanału modułu wykonawczego

Kod źródłowy programu



OPIS URZĄDZENIA

Detonator zamknięty jest w małej plastykowej obudowie, z przodu której znajduje się klawiatura i wyświetlacz. Z tyłu obudowy umieszczone są zaciski wyjściowe do których podłącza się ładunki wybuchowe, gniazdo zasilania typu "duży-jack" oraz bezpiecznik. Układ zasilany jest napięciem 12V zmiennym lub stałym (polaryzacja nie ma znaczenia). Urządzenie potrafi obsłużyć 16 ładunków jednocześnie, dlatego zacisków jest 32 (na każdy ładunek przypada przewód dwużyłowy). Zaciski pogrupowane są w pary (obok siebie), toteż ładunki podłącza się do dwóch kolejnych zacisków. Podczas aktywacji na zacisku pojawia się napięcie 12V. Takie parametry układu pozwalają użyć jako zapalnika miniaturowej żaróweczki ze stłuczoną bańką (jednak nienaruszonym żarnikiem).
U góry pulpitu znajdują się dwa rzędy diód sygnalizacyjnych. Każdy rząd zawiera 16 diód - każda reprezentuje odpowiednie wyjście. Diody zielone sygnalizują podłączenie zapalnika do zacisków, natomiast diody czerwone sygnalizują odpalenie ładunku.
Między dwoma rzędami diód znajduje się przełącznik z diodą LED. Jest to tzw. Uzbrojenie układu. Kiedy układ nie jest uzbrojony, nie świeci się dioda "ARMED", żadna sekwencja nie jest przekazana na wyjście - ładunki poprzez ten guzik są fizycznie odcięte od układu wykonawczego. Dopiero uzbrojenie układu pozwoli na dostarczenie napięcia do ładunków, powodując ich eksplozję...

Przełącznik ARMED umieszczony został w urządzeniu z dwóch powodów:
  • bezpieczeństwa - kiedy istnieje zagrożenie zdrowia czy życia podczas odtwarzanej już sekwencji wybuchów, zawsze możemy ją wyłączyć przełącznikiem ARMED. Wówczas urządzenie będzie kontynuowało odtwarzanie sekwencji, jednak nie będzie ona przekazana do zapalników.
  • możliwości przetestowania sekwencji przy podłączonych zapalnikach.
Od strony elektronicznej urządzenie podzielone jest na dwa bloki:
Programator służy do ustalania, zapamiętywania i odtwarzania żądanych sekwencji wyjściowych. Jest to cała "logika" urządzenia. Poprzez cienką tasiemkę informacje z programatora przekazywane są do modułu wykonawczego złożonego z 16 przekaźników wystawiających napięcie na zaciski wyjściowe. Ze względu na ograniczoną ilość portów zastosowanego mikrokontrolera, wyjścia podzielone są na dwie sekcje, po 8 bitów każda...
Taki podział blokowy umożliwia i znacznie ułatwia ewentualną rozbudowę czy modyfikację układu, a nawet pozwala na zastosowanie poszczególnych jego części w zupełnie innych urządzeniach.




MODUŁ PROGRAMATORA

SERCE UKŁADU

duuuzy obrazek
Rys1.1. Schemat modułu programatora

Rozpocznijmy omawianie układu od serca, czyli mikrokontrolera AT89C51 (U1)  on bowiem nadzoruje pracę całego urządzenia. W wewnętrznej pamięci FLASH procesora znajduje się program zarządzający klawiaturą, wyświetlaczami i zewnętrzną szeregową pamięcią EEPROM. Komunikacja z użytkownikiem odbywa się głównie za pomocą klawiatury i wyświetlaczy.
Kod źródłowy znajduje się tutaj. Wszelkie opisy programu mają postać komentarzy i zawarte są w pliku źródłowym. W dodatku C znajduje się pełna dokumentacja mikrokontrolera.
Bezpośrednio do portu P0 i bitów P2.6 i P2.7 podłączona jest magistrala danych urządzenia - przez nią wymieniane są dane między modułami programatora i wykonawczym. Magistralę fizycznie stanowi plastykowa tasiemka (FC-16) dostarczająca jednocześnie stabilizowane napięcie 5V dla programatora.



KLAWIATURA

Układ wyposażony jest w 16 przyciskową klawiaturę przeglądaną sekwencyjnie. Rozwiązanie to zostało wybrane ze względu na ograniczoną ilość portów zastosowanego mikrokontrolera, oraz łatwość obsługi. Sekwencyjne działanie klawiatury najlepiej będzie przedstawić na rysunku.

schemat klawiatury
Rys.1.2. Klawiatura przeglądana sekwencyjnie

Jak widać, w każdym rzędzie i w każdej kolumnie znajdują się po 4 przyciski, a więc łączna ich ilość daje liczbę 16 (4*4). Jest to rozwiązanie bardzo ergonomiczne, ponieważ zaoszczędzamy aż 12 linii portów I/O, w przypadku gdybyśmy chcieli podłączyć każdy guzik pojedynczo. W razie potrzeby zastosowania klawiatury 20-klawiszowej, wystarczyłoby dodać jeden rząd (lub kolumnę) przycisków...

Załóżmy, że na bit 0 portu 1 (P1.0) wystawiamy wartość logiczną 0. Odczytując  stan bitu P1.4 możemy sprawdzić czy guzik SW4 jest wciśnięty - jeśli jest wciśnięty stan 0 z bitu P1.0 zostanie "przeniesiony" na bit P1.4 poprzez zwarcie przyciskiem. Jeśli natomiast SW4 nie będzie wciśnięty, to na P1.4 będzie stan wysoki - wymuszony rezystorem R15.

Program obsługi klawiatury wykonuje odpowiednią pętlę, która najpierw zeruje bit P1.0, po czym sprawdza stan linii P1.4, P1.5, P1.6, P1.7 - jeśli na żadnej z nich nie będzie niskiego poziomu, ustawia bit P1.0 a zeruje P1.1 i znów sprawdza P1.4, ..,  P1.7, czynność powtarza. Jeśli któryś z guzików zostanie naciśnięty, procedura wpisze jego numer do odpowiedniej komórki pamięci. Jeśli procedura wyzeruje P1.3 lecz na liniach P1.4, .., P1.7 nie będzie stanu niskiego, znaczy to tyle, że żaden guzik nie został naciśnięty - wówczas ustawia P1.3 w stan wysoki i w zależności od potrzeby albo rozpoczyna swe działanie od początku, albo w odpowiedniej komórce umieszcza jakąś umowną wartość (na przykład 0).

Nasz program zawiera dwie procedury obsługi klawiatury. Pierwsza sprawdza stan klawiatury i umieszcza numer wciśniętego guzika w odpowiedniej komórce pamięci. Jeśli żaden przycisk nie jest wciśnięty funkcja zwraca wartość zero. Takie rozwiązanie jest bardzo przydatne, gdy chcemy tylko sprawdzić, który / czy guzik jest wciśnięty.

KEY_X1    EQU    P1.0
KEY_X2    EQU    P1.1
KEY_X3    EQU    P1.2
KEY_X4    EQU    P1.3
KEY_Y1    EQU    P1.4
KEY_Y2    EQU    P1.5
KEY_Y3    EQU    P1.6
KEY_Y4    EQU    P1.7
KEY_NUMBER    EQU    30H

GET_KEY:
    PUSH     ACC
    MOV    A,#1
    MOV    P1,#11111111B

    CLR    KEY_X1
    LCALL    GET_KEY_GET
    SETB    KEY_X1
    CLR    KEY_X2
    LCALL    GET_KEY_GET
    SETB    KEY_X2
    CLR    KEY_X3
    LCALL    GET_KEY_GET
    SETB    KEY_X3
    CLR    KEY_X4
    LCALL    GET_KEY_GET
    SETB    KEY_X4

GET_KEY_CHECK:
MOV    A,KEY_NUMBER
CJNE    A,#17,GET_KEY_END
MOV    KEY_NUMBER,#0
GET_KEY_END:
    POP    ACC
    RET

GET_KEY_GET:
    JNB    KEY_Y1,GET_KEY_GET_END_KEY
    INC    A
    JNB    KEY_Y2,GET_KEY_GET_END_KEY
    INC    A
    JNB    KEY_Y3,GET_KEY_GET_END_KEY
    INC    A
    JNB    KEY_Y4,GET_KEY_GET_END_KEY
    INC    A
    RET
GET_KEY_GET_END_KEY:
    MOV    KEY_NUMBER,ACC
    RET

Druga funkcja, zbudowana przy użyciu pierwszej, czeka na naciśnięcie guzika i dopiero wtedy powraca z wywołania.

WAIT_FOR_KEY:
    PUSH    ACC
WAIT_FOR_KEY_LOOP:
    LCALL    GET_KEY
    MOV    A,KEY_NUMBER
    CJNE    A,#0,WAIT_FOR_KEY_END
    LJMP    WAIT_FOR_KEY_LOOP
WAIT_FOR_KEY_END:
    POP    ACC
    RET



WYŚWIETLACZ

schemat wyswietlacza
Rys.1.3. Wyświetlacz multipleksowany

Detonator wyposażony jest w czterocyfrowy cyfrowy wyświetlacz numeryczny LED. Składa się on z czterech pojedyńczych wyświetlaczy siedmiosegmentowych (W1..W4) ze wspólną anodą. Jako dekoder BCD na 7 segmentów użyty został układ scalony 7447 (U3). Ponieważ dekoder ten potrafi obsłużyć tylko jeden wyświetlacz, konieczne było zastosowanie 4 tranzystorów i trybu multipleksowania.
Wyświetlacz multipleksowany może składać się z wielu pojedyńczych wyświetlaczy. Jeśli stosujemy wyświetlacze 7. segmentowe, to wszystkie mają równolegle podłączone segmenty a...g i dp (kropka). Takie rozwiązanie powoduje, że zapalenie segmentu a na pierwszym spowoduje zapalnie tegoż segmentu na wszystkich pozostałych. Osobno jednak sterowane są anody poszczególnych "cyfr" - co daje możliwość wyboru / uaktywnienia tylko wybranych wyświetlaczy.
Cała sekwencyjność polega na tym, że najpierw ustala się które segmenty mają świecić,  później włącza się odpowiedni wyświetlacz... najczęściej jest to robione po kolei / sekwencyjnie dla każdego wyświetlacza, i powtarzane bez przerwy - stąd nazwa.

Kolejne włączanie i wyłączanie poszczególnych "cyfr" potocznie  nazywane jest przemiataniem czy też odświeżaniem. Jeśli odstęp czasu pomiędzy zgaszeniem jednego wyświetlacza a włączeniem następnego jest wystarczająco mały (odświeżanie jest szybkie / duże), wówczas bezwładność oka ludzkiego sprawi, że obraz wszystkich cyfr złoży się w jeden.

Procedura obsługi wyświetlacza wysyła do układu 7447 (U) informacje, jaki znak ma być wyświetlony, po czym włącza pierwszą cyfrę wyświetlacza. Po odczekaniu określonego czasu "pozycja" pierwsza jest gaszona, a do układu 7447 trafia informacja o znaku dla drugiej "pozycji", po czym włączana jest cyfra druga wyświetlacza itd... Po zgaszeniu "pozycji" czwartej wyświetlana jest od nowa "pozycja" pierwsza.

W detonatorze wyświetlanie odbywa się w przerwaniu timera T0. Na początku ustawiamy odpowienie parametry timera i systemu przerwań.

LED_W1    EQU    P3.7
LED_W2    EQU    P3.6
LED_W3    EQU    P3.5
LED_W4    EQU    P3.4
LED_DIGIT1    EQU    38H
LED_DIGIT2    EQU    39H
LED_DIGIT3    EQU    3AH
LED_DIGIT4    EQU    3BH
TMOD_SET    EQU    00000001B

    MOV    TMOD,#TMOD_SET    ; tryb 1 T0 - licznik impulsów
    MOV    TL0,#0        ; wartości początkowe
    MOV    TH0,#0        ; rejstrów licznika

    SETB    EA            ; ogólne zezwolenie na przerwania
    SETB    ET0            ; zezwolenie na przerwanie T0


Obsługa przerwania T0 odbywa się pod adresem 0BH, tam następuje skok do odpowiedniej procedury:

    ORG    0BH
    LJMP    WRITE_LED

WRITE_LED:
    PUSH    ACC
    CLR    TR0
    MOV    ACC,#11110000B
WRITE_LED_1:
    CJNE    R7,#1,WRITE_LED_2
    ORL    LED_DIGIT1,A
    MOV    P3,LED_DIGIT1
    CLR    LED_W1
    LJMP    WRITE_LED_END
WRITE_LED_2:
    CJNE    R7,#2,WRITE_LED_3
    ORL    LED_DIGIT2,A
    MOV    P3,LED_DIGIT2
    CLR    LED_W2
    LJMP    WRITE_LED_END
WRITE_LED_3:
    CJNE    R7,#3,WRITE_LED_4
ORL    LED_DIGIT3,A
    MOV    P3,LED_DIGIT3
    CLR    LED_W3
    LJMP    WRITE_LED_END
WRITE_LED_4:
    CJNE    R7,#4,WRITE_LED_SET0
    ORL    LED_DIGIT4,A
    MOV    P3,LED_DIGIT4
    CLR    LED_W4
    LJMP    WRITE_LED_END
WRITE_LED_SET0:
    MOV    R7,#0
WRITE_LED_END:
    INC    R7
    POP    ACC
    MOV    TL0,#100
    MOV    TH0,#225
    SETB    TR0
    RETI

Jak widać, procedura za każdym razem wyświetla kolejną cyfrę - najpierw pierwszą, później drugą, trzecią, czwartą i od nowa. Wartości wyświetlane przechowywane są w komórkach wewnętrznej pamięci RAM, dla ułatwienia nazwanych LED_DIGIT1..LED_DIGIT4.
Na LED wyświetlane są zawsze dwie liczby dwucyfrowe - krok i opóźnienie. Procedura rozbija te liczby na cyfry i ładuje je do komórek LED_DIGIT1..LED_DIGIT4:

LED_PRINT_STEP_AND_DELAY:
    PUSH    ACC
    MOV    A,CURRENT_STEP
    MOV    B,#10
    DIV    AB
    MOV    LED_DIGIT4,A
    MOV    LED_DIGIT3,B
    MOV    A,CURRENT_DELAY
    MOV    B,#10
    DIV    AB
    MOV    LED_DIGIT2,A
    MOV    LED_DIGIT1,B
    POP    ACC
    RET

Włączenie wyświetlania odbywa się przez włączenie timera T0:
 SETB    TR0
Wyłączenie wyświetlania odbywa się po zatrzymaniu timera T0:
CLR    TR0



PAMIĘĆ EEPROM

Szeregowa pamięć EEPROM serii 24Cxx (U2), w jaką zostało wyposażone urządzenie, pozwala na zapisanie stukrokowej sekwencji wyjściowej. Oczywiście typ zastosowanej pamięci zwalnia użytkownika z obowiązku bateryjnego podtrzymania jej zawartości.
Pamięć ta podzielona jest przez producenta na "strony". Program urządzenia wykorzystuje ten podział przechowując w pierwszej (strona 0) czas opóźnienia do następnego kroku, zaś w drugiej (strona 1) stan zacisków wyjściowych. Przechowywana w pamięci wartość opóźnienia podczas odtwarzania sekwencji jest mnożona przez 100msek, zatem użytkownik ustawia opóźnienie w setnych częściach sekundy.

Zarówno zastosowana pamięć, jak i mikrokontroler są ośmiobitowe, dlatego też strona 1 przechowuje każdą sekwencję wyjściową w dwóch bajtach (dwa bajty po 8 bitów każdy). Widać zatem przyczynę podziału logicznego wyjścia na dwie sekcje. Wydawać by się mogło, że jest to wada. Tak jednak nie jest - gdybyśmy chcieli w przyszłości rozbudować urządzenie o dodatkowe wyjścia, wystarczy dodać sekcje reprezentowane przez jedną linię I/O mikrokontrolera każda, nie zaś całe 8 bitów, jak by to było w przypadku pojedynczych wyjść...

Bez modyfikacji oprogramowania jako zamiennik można zastosować pamięć 24C04, 24C08 czy 24C16, nie mniejsze, ponieważ tylko te pamięci posiadają odpowiedni podział na strony (mają ich dwie lub więcej). Kompletna dokumentacja układów znajduje się z dodatku D.

Program urządzenia zwiera kilka procedur obsługujących szeregową pamięć EEPROM:

; deklaracja stałych i zmiennych
I2C_MEMORY_SDA    EQU    P2.4
I2C_MEMORY_SCL    EQU    P2.3
I2C_MEMORY_ADDR    EQU    31H
I2C_MEMORY_PAGE    EQU    32H
I2C_READ        EQU    33H
I2C_FAIL        EQU    34H
I2C_FAIL_COUNT    EQU    50
I2C_BYTE_COUNT    EQU    35H
I2C_MEMORY_CHIP_ADDR    EQU    0H
I2C_MEMORY_DATA    EQU    36H
I2C_MEMORY_DATA_ADDR    EQU    37H

Odczytuje bajt z aktualnego adresu w pamięci
I2C_MEMORY_READ_BYTE
zwraca wartość w:    I2C_MEMORY_DATA

Odczytuje bajt spod wskazanego adresu w pamięci:
I2C_MEMORY_ADDRESS_READ_BYTE
należy podać adres w:    I2C_MEMORY_DATA_ADDR
należy podać stronę w:    I2C_MEMORY_PAGE
zwraca wartość w:        I2C_MEMORY_DATA

Zapisuje bajt pod wskazany adres:
I2C_MEMORY_WRITE_BYTE
należy podać adres w:    I2C_MEMORY_DATA_ADDR
należy podać stronę w:    I2C_MEMORY_PAGE
należy podać daną w:    I2C_MEMORY_DATA

Zapisuje stronę danych:
I2C_MEMORY_PAGE_WRITE_FIRST
należy podać adres w:    I2C_MEMORY_DATA_ADDR
należy podać stronę w:    I2C_MEMORY_PAGE
należy podać pierwszą daną w:    I2C_MEMORY_DATA   

zaraz po czym należy wywoływać funkcję:
I2C_MEMORY_PAGE_WRITE_NEXT
należy podać następne dane w:    I2C_MEMORY_DATA

koniec zapisu do pamięci należy zakończyć funkcją:
I2C_MEMORY_PAGE_WRITE_END



SYGNALIZACJA AKUSTYCZNO-OPTYCZNA

Diody LED w znacznym stopniu ułatwiają programowanie urządzenia  odzwierciedlając stan zacisków wyjściowych. Świecenie jednej z ośmiu diód  ("1"-"8") oznacza aktywność odpowiedniego wyjścia sekcji wskazanej przez  diody "A" lub "B". Wyjście jest aktywne, gdy na zapalnik przekazane jest napięcie zdolne odpalić ładunek.

UWAGA!

Oczywiście podczas programowania sygnały z "diód" nie są przekazywane do modułu wykonawczego - są jedynie pomocą przy wizualizacji sekwencji wyjściowej. Faktem jest jednak, że diody te bezpośrednio odzwierciedlają stan portu P0, a zatem i magistralę między programatorem a modułem wykonawczym. Przypadkowy impuls ujemny na linii zegarowej jednego z zatrzasków mógłby uaktywnić wyjścia. Dlatego też układ powinien być wyłączony do momenty, gdy w pobliżu ładunków nie będzie znajdować się żadna osoba.
Ostatnim elementem informacyjnym modułu programatora jest buzzer piszczyk. Służy on do akustycznej komunikacji z użytkownikiem oraz sygnalizacji stanu pracy urządzenia.



MODUŁ WYKONAWCZY

duuuzy obrazek
Rys.2.1. Schemat ideowy modułu wykonawczego detonatora

Moduł wykonawczy składa się z następujących elementów:
  • 16 przekaźników
  • 16 czerwonych diod LED sygnalizujących odpalenie ładunku
  • 16 zielonych diod LED sygnalizujących podłączenie ładunku
  • przełącznika uzbrojenia układu



MAGISTRALA DANYCH

wyprowadzenia magistrali
Rys.2.2. Schemat wyprowadzeń magistrali danych

Moduł wykonawczy połączony jest z modułem programatora tasiemką     n-żyłową, stanowiącą swego rodzaju magistralę systemową. Takie rozwiązanie daje możliwość sprawnej wymiany, naprawy czy modernizacji urządzenia.

Na magistralę składają się:
  • 8 bitów danych o zaciskach wyjściowych danej sekcji (2, 4, 6, 8, 10, 12, 14, 16)
  • 2 bity wskazujące sekcję (11 - SEKCJA_A, 13 - SEKCJA_B)
  • 2 bity zasilające moduł programatora stabilizowanym napięciem 5V (15 - 5V, 1 - masa)



ZATRZASKI

schemat
Rys.2.3. Schemat ideowy układu połączenia zatrzasków

Dane magistrali o zaciskach wyjściowych podłączone są bezpośrednio do scalonych zatrzasków 74273 (U1 i U2).  Układy te, po otrzymaniu impulsu zegarowego, przepisują (binarny) stan wejść na wyjścia i podtrzymują je aż do otrzymania kolejnego. Dane na wejściach tych układów są wspólne (układy mają równolegle połączone wejścia). Zatrzaski zasilane są napięciem 5V z U3.

O tym, kiedy należy daną "zatrzasnąć" mówi programator poprzez dwa bity wskazujące sekcję - każdy bit oznacza jedną sekcję (podłączony jest do jednego zatrzasku). Tak więc uaktywnienie odpowiednich wyjść sprowadzi się do wystawienia danych na magistrali i  zatrzaśnięciu ich w odpowiednim zatrzasku.
W rzeczywistości sekwencja nie pojawia się na wszystkich wyjściach jednocześnie, lecz odpowiednio najpierw na sekcji numer 1, później 2. Opóźnienie to ma wartość kilku mikro / milisekund, więc praktycznie jest niezauważalne...

Programator wykonuje więc następujące kroki w celu uaktywnienia odpowiedniej sekwencji wyjściowej w module wykonawczym:
  • wystawia dane dla pierwszej sekcj na magistrali
  • zatrzaskuje dane w pierwszym zatrzasku (U1) ujemnym impulsem na nóżce CLK (11)
  • wystawia dane dla drugiej sekcj na magistrali
  • zatrzaskuje dane w drugim zatrzasku (U2) ujemnym impulsem na nóżce CLD (11)


bwód RC podłączony do nóżki CLR zatrzasku ma na celu wyzerowanie wszystkich jego wyjść zaraz po włączeniu zasilania. Kondensator C1/C2 podaje krótki impuls ujemny na wejścia CLR, rezystory R17/R18 utrzymują wysoki stan na tych wejściach. W przypadku niekasowania zatrzasków po włączeniu zasilania należy zastosować kondensatory elektrolityczne 0,47uF. Działanie tego obwodu jest krytyczne i zabezpiecza przed przypadkową aktywacją wyjść po włączeniu zasilania!



OPIS KANAŁU MODUŁU WYKONAWCZEGO

schemat
Rys.2.1. Schemat ideowy kanału wyjściowego

Jak widać na schemacie, wyjścia zatrzasków (U1 i U2) podłączone są przez tranzystory sterujące do przekaźników. Każdy zatrzask ma po 8 wyjść. Nazwijmy jedno takie wyjście kanałem. Każdy kanał składa się z przekaźnika kilku diod, rezystorów i tranzystora. Omówmy jego działanie na przykładzie kanału pierwszego.

Tranzystor T1 w takim układzie pełni rolę drivera mocy - aby zbytnio nie obciążać wyjść sterującego nim układu scalonego U1. Kiedy na jego bazie pojawi się stan wysoki, przejdzie w stan nasycenia i załączy przekaźnik. Dioda D1 włączona równolegle do przekaźnika w kierunku zaporowym, ma na celu wytłumienie wszelkich przepięć / impulsów wygenerowanych przez cewkę przekaźnika.

W urządzeniu zastosowany został tani przekaźnik dwupozycyjny na 12V. Do  środkowego styku podłączone jest jedno złącze zacisku wyjściowego. Kiedy przekaźnik jest włączany, zwiera styk środkowy do zasilania powodując aktywację zapalnika (żaróweczki), a więc detonację ładunku.
Domyślnie jednak, po włączeniu zasilania, przekaźnik ustawiony jest w pozycji "wyłączony"  zwierając do wyjścia zieloną diodę LED D33 i rezystor  R35. Dioda ta jest wyprowadzona na zewnątrz obudowy i sygnalizuje podłączenie ładunku wybuchowego do zacisków wyjściowych urządzenia - przewód wraz zapalnikiem  stanowią obwód elektryczny (rezystor),  który pozwala świecić diodzie. Oczywiście prąd świecenia diody musi być ograniczony rezystorem (R35), aby nie dopuścić do zaświecenia żaróweczki stanowiącej zapalnik - detonacji ładunku.
Stosowana żaróweczka nie może być na zbyt małe napięcie, gdyż prąd płynący przez R35 mógłby być wystarczający do powolnego rozgrzewania zapalnika...

Dioda D17 i rezystor R19 włączone równolegle do przekaźnika PK1,  sygnalizują optycznie stan pracy zacisku wyjściowego urządzenia i są wyprowadzone na zewnątrz obudowy. Jeśli dioda świeci wyjście jest aktywne, przekaźnik jest włączony - na zapalnik podane jest napięcie.
Równolegle do każdego z zacisków wyjściowych urządzenia podłączony jest kondensator eliminujący ewentualne zakłócenia mogące się wyindukować w przewodach połączeniowych między detonatorem a ładunkami. Takie zakłócenia mógłby spowodować na przykład telefon komórkowy...



ZASILANIE AKUMLATOROWE

schemat
Rys.3.1. Schemat ideowy modułu testującego naładowanie akumlatorów

Ze względu na możliwość zastosowania w ciężkich warunkach, detonator wyposażony został w zasilanie bateryjne, na które składają się dwa akumlatory  bezobsługowe, o napięciu 6V i pojemności 1.2Ah każdy. Podłączone są one równolegle do kondensatorów filtrujących, zaraz za mostkiem Gretz'a, w module wykonawczym.
Ładowanie odbywa się automatycznie po podłączeniu zewnętrznego źródła zasilania, którego napięcie powinno wynosić około 14..15V. Przy takim zasilaniu niewskazane jest włączenie układu - uszkodzeniu mogą ulec przekaźniki.

Urządzenie wyposażone zostało w prosty układ sygnalizujący pełne naładowanie akumlatorów. W przypadku gdy akumlatory są rozładowane, naciśnięcie przycisku SW1 nie spowoduje świecenia diody D2.

Potencjometrem R3 ustawić możemy próg zadziałania sygnalizatora. W prototypie ustawiłem ten prog na ok 11.8V, co gwarantowało mi 6 minut nieprzerwanej pracy przy aktywnych wszystkich wyjściach. Stan, w którym napięcie akumlatorów było minimalnie niższe od napięcia progowego rozpoznawałem po krótkim mignięciu diody D2 po wciśnięciu SW1.



INSTRUKCJA OBSŁUGI

rysunek

Zaraz po włączeniu układ sygnalizuje gotowość do pracy sygnałem dźwiękowym. Pływające punkty świetlne w sekcji podglądu wyjść oznaczają, że użytkownik znajduje się w głównym menu, a układ czeka na wybór funkcji. Może to być:
  1. programowanie sekwencji wyjściowej
  2. automatyczne odtwarzanie sekwencji wyjściowej
  3. pół-automatyczne odtwarzanie sekwencji wyjściowek
  4. kasowanie pamięci
Wybór funkcji odbywa się poprzez naciśnięcie przycisku o odpowiednim numerze. Na pulpicie, dla ułatwienia umieszczona została ściąga określająca funkcje poszczególnych klawiszy. I tak jeśli chcemy skasować pamięć, naciskamy guzik 4...



PROGRAMOWANIE SEKWENCJI WYJŚCIOWEJ

Aby wejść w tryb programowania należy nacisnąć przycisk 1. Na wyświetlaczu LED pojawią się dwie liczby dwucyfrowe - aktualny krok (pozycja STEP) i opóźnienie do następnego kroku (pozycja DELAY).

Aby przejść do następnego/poprzedniego kroku należy nacisnąć przycisk odpowiednio UP lub DOWN.  Takie przejście nie spowoduje zapisania kombinacji do pamięci, a wszelkie zmiany zostaną stracone.

Aby zwiększyć/zmniejszyć opóźnienie do następnego kroku, należy przycisnąć odpowiednio klawisze + lub -. Opóźnienie podawane jest w setnych częściach sekundy - jeśli wybierzemy 10, to opóźnienie wyniesie jedną sekundę.

Wszelkie zmiany stanu zacisków odbywają się na zasadzie negacji. Na wyświetlaczu pomocniczym (OUTPUT PREVIEW) ukaże się kombinacja wyjść dla danego kroku. Aby zmienić stan danego wyjścia na przeciwny należy nacisnąć odpowiadający mu przycisk z zakresu 1..8. Ponieważ wyjścia podzielone są na dwie sekcje, zmiany sekcji należy dokonać przyciskiem A/B.

Aby zapamiętać ustawienia danego kroku w wewnętrznej pamięci, naciskamy przycisk OK. Program automatycznie przeskoczy do następnego kroku.

Aby powrócić do menu głównego naciskamy przycisk MENU



AUTOMATYCZNE ODTWARZANIE SEKWENCJI WYJŚCIOWEJ

Aby wejść w tryb automatycznego odtwarzania, należy w głównym menu nacisnąć przycisk 2
klawiszami UP lub DOWN należy wybrać ostatni krok odtwarzanej sekwencji i zatwierdzić klawiszem OK
układ zacznie wydawać sygnał ostrzegawczy i mrugać diodami sekcji OUTPUT PREVIEW - jeśli chcemy rozpocząć wykonanie sekwencji, naciskamy guzik LAUNCH przed rozpoczęciem wykonywania sekwencji zawsze mamy możliwość powrotu do menu głównego przyciskiem MENU pamiętać należy o uprzednim uzbrojeniu urządzenia oraz możliwości jego rozbrojenia w trakcie trwania sekwencji.



PÓŁAUTOMATYCZNE ODTWARZANIE SEKWENCJI WYJŚCIOWEJ

Tryb ten jest bardzo zbliżony do automatycznego odtwarzania. Tutaj użytkownik ręcznie wyzwala poszczególne sekwencje wyjściowe:
  • przyciskami 1..8 odtwarza sekwencje zapisane w pamięci urządzenia, w komórkach odpowiednio 1..8
  • przyciskiem UP lub DOWN uaktywnia zawartość kolejnej/poprzedniej komórki pamięci przekazując jej zawartość na zaciski wyjściowe.



KASOWANIE PAMIĘCI

Aby skasować całą zawartość pamięci w menu głównym, należy nacisnąć przycisk 4, a następnie zatwierdzić wybór naciskając OK. Opóźnienia przyjmują wówczas wartość 0, a zaciski wyjściowe stan nieaktywny.



Wskazówki dotyczące materiałów pirotechnicznych

Urządzenie na zaciskach wyjściowych w momencie aktywacji wystawia napięcie 12V. Pozwala to na zastosowanie zwykłej żarówki jako zapalnika. Najlepsze do tego celu są miniaturowe żaróweczki do podświetlania paneli w radiach samochodowych (zwykle na napięcia 3..12V). Aby spreparować zapalnik należy delikatnie stłuc bańkę żarówki nie naruszając żarnika.

blah

Taki zapalnik jest od razu gotowy do użycia - należy wcisnąć go do ładunku wybuchowego (oczywiście bardzo delikatnie, aby nie naruszyć żarnika). Jeśli stosujemy petardy zakupione w sklepie, zapalnik umieszczamy w miejscu pozostałym po "pierwotnym elemencie zapłonowym" (najczęściej uprzednio usuniętym loncie czy drasce). Zwrócić uwagę należy na budowę "standardowych" petard, które to składają się z ładunku inicjującego (najczęściej prochu) oraz właściwego ładunku wybychowego. Taka konstrucja wprowadza nieprzewidywalne opóźnienie detonacji w granicach ok 2..5 sekund. Fakt ten należy wziąć pod uwagę opracowując sekwencje wybuchów.

blah

Jeśli używamy ładunków własnej konstrukcji pamiętać należy, że im bardziej wytrzymała i szczelna obudowa, tym lepszy efekt pirotechniczny. Najlepiej gdy używamy ładunków złożonych z jednej substancji, o niskiej temperaturze zapłonu (wystarczająco niskiej na odpalenie żażącym włóknem żarówki, lecz nie nazbyt niskiej ze względów bezpieczeństwa).

Jeśli potrzbujemy odpalić ładunek posiadający lont, możemy to zrobić w następujący sposób:

rysunek



CeDeROM i MOS-FET
KSZAK 2k2

DETONATOR
THE DETONATOR

zdjecie

MAIN MENU
Opis urządzenia   Moduł programatora   Moduł wykonawczy   Zasilanie   Obsługa   PLIKI
Serce układu
Klawiatura
Wyświetlacz
Pamięć EEPROM
Sygnalizacja akustyczno-optyczna
Magistrala danych
Zatrzaski
Opis kanału modułu wykonawczego

Kod źródłowy programu



OPIS URZĄDZENIA

Detonator zamknięty jest w małej plastykowej obudowie, z przodu której znajduje się klawiatura i wyświetlacz. Z tyłu obudowy umieszczone są zaciski wyjściowe do których podłącza się ładunki wybuchowe, gniazdo zasilania typu "duży-jack" oraz bezpiecznik. Układ zasilany jest napięciem 12V zmiennym lub stałym (polaryzacja nie ma znaczenia). Urządzenie potrafi obsłużyć 16 ładunków jednocześnie, dlatego zacisków jest 32 (na każdy ładunek przypada przewód dwużyłowy). Zaciski pogrupowane są w pary (obok siebie), toteż ładunki podłącza się do dwóch kolejnych zacisków. Podczas aktywacji na zacisku pojawia się napięcie 12V. Takie parametry układu pozwalają użyć jako zapalnika miniaturowej żaróweczki ze stłuczoną bańką (jednak nienaruszonym żarnikiem).
U góry pulpitu znajdują się dwa rzędy diód sygnalizacyjnych. Każdy rząd zawiera 16 diód - każda reprezentuje odpowiednie wyjście. Diody zielone sygnalizują podłączenie zapalnika do zacisków, natomiast diody czerwone sygnalizują odpalenie ładunku.
Między dwoma rzędami diód znajduje się przełącznik z diodą LED. Jest to tzw. Uzbrojenie układu. Kiedy układ nie jest uzbrojony, nie świeci się dioda "ARMED", żadna sekwencja nie jest przekazana na wyjście - ładunki poprzez ten guzik są fizycznie odcięte od układu wykonawczego. Dopiero uzbrojenie układu pozwoli na dostarczenie napięcia do ładunków, powodując ich eksplozję...

Przełącznik ARMED umieszczony został w urządzeniu z dwóch powodów:
  • bezpieczeństwa - kiedy istnieje zagrożenie zdrowia czy życia podczas odtwarzanej już sekwencji wybuchów, zawsze możemy ją wyłączyć przełącznikiem ARMED. Wówczas urządzenie będzie kontynuowało odtwarzanie sekwencji, jednak nie będzie ona przekazana do zapalników.
  • możliwości przetestowania sekwencji przy podłączonych zapalnikach.
Od strony elektronicznej urządzenie podzielone jest na dwa bloki:
Programator służy do ustalania, zapamiętywania i odtwarzania żądanych sekwencji wyjściowych. Jest to cała "logika" urządzenia. Poprzez cienką tasiemkę informacje z programatora przekazywane są do modułu wykonawczego złożonego z 16 przekaźników wystawiających napięcie na zaciski wyjściowe. Ze względu na ograniczoną ilość portów zastosowanego mikrokontrolera, wyjścia podzielone są na dwie sekcje, po 8 bitów każda...
Taki podział blokowy umożliwia i znacznie ułatwia ewentualną rozbudowę czy modyfikację układu, a nawet pozwala na zastosowanie poszczególnych jego części w zupełnie innych urządzeniach.




MODUŁ PROGRAMATORA

SERCE UKŁADU

duuuzy obrazek
Rys1.1. Schemat modułu programatora

Rozpocznijmy omawianie układu od serca, czyli mikrokontrolera AT89C51 (U1)  on bowiem nadzoruje pracę całego urządzenia. W wewnętrznej pamięci FLASH procesora znajduje się program zarządzający klawiaturą, wyświetlaczami i zewnętrzną szeregową pamięcią EEPROM. Komunikacja z użytkownikiem odbywa się głównie za pomocą klawiatury i wyświetlaczy.
Kod źródłowy znajduje się tutaj. Wszelkie opisy programu mają postać komentarzy i zawarte są w pliku źródłowym. W dodatku C znajduje się pełna dokumentacja mikrokontrolera.
Bezpośrednio do portu P0 i bitów P2.6 i P2.7 podłączona jest magistrala danych urządzenia - przez nią wymieniane są dane między modułami programatora i wykonawczym. Magistralę fizycznie stanowi plastykowa tasiemka (FC-16) dostarczająca jednocześnie stabilizowane napięcie 5V dla programatora.



KLAWIATURA

Układ wyposażony jest w 16 przyciskową klawiaturę przeglądaną sekwencyjnie. Rozwiązanie to zostało wybrane ze względu na ograniczoną ilość portów zastosowanego mikrokontrolera, oraz łatwość obsługi. Sekwencyjne działanie klawiatury najlepiej będzie przedstawić na rysunku.

schemat klawiatury
Rys.1.2. Klawiatura przeglądana sekwencyjnie

Jak widać, w każdym rzędzie i w każdej kolumnie znajdują się po 4 przyciski, a więc łączna ich ilość daje liczbę 16 (4*4). Jest to rozwiązanie bardzo ergonomiczne, ponieważ zaoszczędzamy aż 12 linii portów I/O, w przypadku gdybyśmy chcieli podłączyć każdy guzik pojedynczo. W razie potrzeby zastosowania klawiatury 20-klawiszowej, wystarczyłoby dodać jeden rząd (lub kolumnę) przycisków...

Załóżmy, że na bit 0 portu 1 (P1.0) wystawiamy wartość logiczną 0. Odczytując  stan bitu P1.4 możemy sprawdzić czy guzik SW4 jest wciśnięty - jeśli jest wciśnięty stan 0 z bitu P1.0 zostanie "przeniesiony" na bit P1.4 poprzez zwarcie przyciskiem. Jeśli natomiast SW4 nie będzie wciśnięty, to na P1.4 będzie stan wysoki - wymuszony rezystorem R15.

Program obsługi klawiatury wykonuje odpowiednią pętlę, która najpierw zeruje bit P1.0, po czym sprawdza stan linii P1.4, P1.5, P1.6, P1.7 - jeśli na żadnej z nich nie będzie niskiego poziomu, ustawia bit P1.0 a zeruje P1.1 i znów sprawdza P1.4, ..,  P1.7, czynność powtarza. Jeśli któryś z guzików zostanie naciśnięty, procedura wpisze jego numer do odpowiedniej komórki pamięci. Jeśli procedura wyzeruje P1.3 lecz na liniach P1.4, .., P1.7 nie będzie stanu niskiego, znaczy to tyle, że żaden guzik nie został naciśnięty - wówczas ustawia P1.3 w stan wysoki i w zależności od potrzeby albo rozpoczyna swe działanie od początku, albo w odpowiedniej komórce umieszcza jakąś umowną wartość (na przykład 0).

Nasz program zawiera dwie procedury obsługi klawiatury. Pierwsza sprawdza stan klawiatury i umieszcza numer wciśniętego guzika w odpowiedniej komórce pamięci. Jeśli żaden przycisk nie jest wciśnięty funkcja zwraca wartość zero. Takie rozwiązanie jest bardzo przydatne, gdy chcemy tylko sprawdzić, który / czy guzik jest wciśnięty.

KEY_X1    EQU    P1.0
KEY_X2    EQU    P1.1
KEY_X3    EQU    P1.2
KEY_X4    EQU    P1.3
KEY_Y1    EQU    P1.4
KEY_Y2    EQU    P1.5
KEY_Y3    EQU    P1.6
KEY_Y4    EQU    P1.7
KEY_NUMBER    EQU    30H

GET_KEY:
    PUSH     ACC
    MOV    A,#1
    MOV    P1,#11111111B

    CLR    KEY_X1
    LCALL    GET_KEY_GET
    SETB    KEY_X1
    CLR    KEY_X2
    LCALL    GET_KEY_GET
    SETB    KEY_X2
    CLR    KEY_X3
    LCALL    GET_KEY_GET
    SETB    KEY_X3
    CLR    KEY_X4
    LCALL    GET_KEY_GET
    SETB    KEY_X4

GET_KEY_CHECK:
MOV    A,KEY_NUMBER
CJNE    A,#17,GET_KEY_END
MOV    KEY_NUMBER,#0
GET_KEY_END:
    POP    ACC
    RET

GET_KEY_GET:
    JNB    KEY_Y1,GET_KEY_GET_END_KEY
    INC    A
    JNB    KEY_Y2,GET_KEY_GET_END_KEY
    INC    A
    JNB    KEY_Y3,GET_KEY_GET_END_KEY
    INC    A
    JNB    KEY_Y4,GET_KEY_GET_END_KEY
    INC    A
    RET
GET_KEY_GET_END_KEY:
    MOV    KEY_NUMBER,ACC
    RET

Druga funkcja, zbudowana przy użyciu pierwszej, czeka na naciśnięcie guzika i dopiero wtedy powraca z wywołania.

WAIT_FOR_KEY:
    PUSH    ACC
WAIT_FOR_KEY_LOOP:
    LCALL    GET_KEY
    MOV    A,KEY_NUMBER
    CJNE    A,#0,WAIT_FOR_KEY_END
    LJMP    WAIT_FOR_KEY_LOOP
WAIT_FOR_KEY_END:
    POP    ACC
    RET



WYŚWIETLACZ

schemat wyswietlacza
Rys.1.3. Wyświetlacz multipleksowany

Detonator wyposażony jest w czterocyfrowy cyfrowy wyświetlacz numeryczny LED. Składa się on z czterech pojedyńczych wyświetlaczy siedmiosegmentowych (W1..W4) ze wspólną anodą. Jako dekoder BCD na 7 segmentów użyty został układ scalony 7447 (U3). Ponieważ dekoder ten potrafi obsłużyć tylko jeden wyświetlacz, konieczne było zastosowanie 4 tranzystorów i trybu multipleksowania.
Wyświetlacz multipleksowany może składać się z wielu pojedyńczych wyświetlaczy. Jeśli stosujemy wyświetlacze 7. segmentowe, to wszystkie mają równolegle podłączone segmenty a...g i dp (kropka). Takie rozwiązanie powoduje, że zapalenie segmentu a na pierwszym spowoduje zapalnie tegoż segmentu na wszystkich pozostałych. Osobno jednak sterowane są anody poszczególnych "cyfr" - co daje możliwość wyboru / uaktywnienia tylko wybranych wyświetlaczy.
Cała sekwencyjność polega na tym, że najpierw ustala się które segmenty mają świecić,  później włącza się odpowiedni wyświetlacz... najczęściej jest to robione po kolei / sekwencyjnie dla każdego wyświetlacza, i powtarzane bez przerwy - stąd nazwa.

Kolejne włączanie i wyłączanie poszczególnych "cyfr" potocznie  nazywane jest przemiataniem czy też odświeżaniem. Jeśli odstęp czasu pomiędzy zgaszeniem jednego wyświetlacza a włączeniem następnego jest wystarczająco mały (odświeżanie jest szybkie / duże), wówczas bezwładność oka ludzkiego sprawi, że obraz wszystkich cyfr złoży się w jeden.

Procedura obsługi wyświetlacza wysyła do układu 7447 (U) informacje, jaki znak ma być wyświetlony, po czym włącza pierwszą cyfrę wyświetlacza. Po odczekaniu określonego czasu "pozycja" pierwsza jest gaszona, a do układu 7447 trafia informacja o znaku dla drugiej "pozycji", po czym włączana jest cyfra druga wyświetlacza itd... Po zgaszeniu "pozycji" czwartej wyświetlana jest od nowa "pozycja" pierwsza.

W detonatorze wyświetlanie odbywa się w przerwaniu timera T0. Na początku ustawiamy odpowienie parametry timera i systemu przerwań.

LED_W1    EQU    P3.7
LED_W2    EQU    P3.6
LED_W3    EQU    P3.5
LED_W4    EQU    P3.4
LED_DIGIT1    EQU    38H
LED_DIGIT2    EQU    39H
LED_DIGIT3    EQU    3AH
LED_DIGIT4    EQU    3BH
TMOD_SET    EQU    00000001B

    MOV    TMOD,#TMOD_SET    ; tryb 1 T0 - licznik impulsów
    MOV    TL0,#0        ; wartości początkowe
    MOV    TH0,#0        ; rejstrów licznika

    SETB    EA            ; ogólne zezwolenie na przerwania
    SETB    ET0            ; zezwolenie na przerwanie T0


Obsługa przerwania T0 odbywa się pod adresem 0BH, tam następuje skok do odpowiedniej procedury:

    ORG    0BH
    LJMP    WRITE_LED

WRITE_LED:
    PUSH    ACC
    CLR    TR0
    MOV    ACC,#11110000B
WRITE_LED_1:
    CJNE    R7,#1,WRITE_LED_2
    ORL    LED_DIGIT1,A
    MOV    P3,LED_DIGIT1
    CLR    LED_W1
    LJMP    WRITE_LED_END
WRITE_LED_2:
    CJNE    R7,#2,WRITE_LED_3
    ORL    LED_DIGIT2,A
    MOV    P3,LED_DIGIT2
    CLR    LED_W2
    LJMP    WRITE_LED_END
WRITE_LED_3:
    CJNE    R7,#3,WRITE_LED_4
ORL    LED_DIGIT3,A
    MOV    P3,LED_DIGIT3
    CLR    LED_W3
    LJMP    WRITE_LED_END
WRITE_LED_4:
    CJNE    R7,#4,WRITE_LED_SET0
    ORL    LED_DIGIT4,A
    MOV    P3,LED_DIGIT4
    CLR    LED_W4
    LJMP    WRITE_LED_END
WRITE_LED_SET0:
    MOV    R7,#0
WRITE_LED_END:
    INC    R7
    POP    ACC
    MOV    TL0,#100
    MOV    TH0,#225
    SETB    TR0
    RETI

Jak widać, procedura za każdym razem wyświetla kolejną cyfrę - najpierw pierwszą, później drugą, trzecią, czwartą i od nowa. Wartości wyświetlane przechowywane są w komórkach wewnętrznej pamięci RAM, dla ułatwienia nazwanych LED_DIGIT1..LED_DIGIT4.
Na LED wyświetlane są zawsze dwie liczby dwucyfrowe - krok i opóźnienie. Procedura rozbija te liczby na cyfry i ładuje je do komórek LED_DIGIT1..LED_DIGIT4:

LED_PRINT_STEP_AND_DELAY:
    PUSH    ACC
    MOV    A,CURRENT_STEP
    MOV    B,#10
    DIV    AB
    MOV    LED_DIGIT4,A
    MOV    LED_DIGIT3,B
    MOV    A,CURRENT_DELAY
    MOV    B,#10
    DIV    AB
    MOV    LED_DIGIT2,A
    MOV    LED_DIGIT1,B
    POP    ACC
    RET

Włączenie wyświetlania odbywa się przez włączenie timera T0:
 SETB    TR0
Wyłączenie wyświetlania odbywa się po zatrzymaniu timera T0:
CLR    TR0



PAMIĘĆ EEPROM

Szeregowa pamięć EEPROM serii 24Cxx (U2), w jaką zostało wyposażone urządzenie, pozwala na zapisanie stukrokowej sekwencji wyjściowej. Oczywiście typ zastosowanej pamięci zwalnia użytkownika z obowiązku bateryjnego podtrzymania jej zawartości.
Pamięć ta podzielona jest przez producenta na "strony". Program urządzenia wykorzystuje ten podział przechowując w pierwszej (strona 0) czas opóźnienia do następnego kroku, zaś w drugiej (strona 1) stan zacisków wyjściowych. Przechowywana w pamięci wartość opóźnienia podczas odtwarzania sekwencji jest mnożona przez 100msek, zatem użytkownik ustawia opóźnienie w setnych częściach sekundy.

Zarówno zastosowana pamięć, jak i mikrokontroler są ośmiobitowe, dlatego też strona 1 przechowuje każdą sekwencję wyjściową w dwóch bajtach (dwa bajty po 8 bitów każdy). Widać zatem przyczynę podziału logicznego wyjścia na dwie sekcje. Wydawać by się mogło, że jest to wada. Tak jednak nie jest - gdybyśmy chcieli w przyszłości rozbudować urządzenie o dodatkowe wyjścia, wystarczy dodać sekcje reprezentowane przez jedną linię I/O mikrokontrolera każda, nie zaś całe 8 bitów, jak by to było w przypadku pojedynczych wyjść...

Bez modyfikacji oprogramowania jako zamiennik można zastosować pamięć 24C04, 24C08 czy 24C16, nie mniejsze, ponieważ tylko te pamięci posiadają odpowiedni podział na strony (mają ich dwie lub więcej). Kompletna dokumentacja układów znajduje się z dodatku D.

Program urządzenia zwiera kilka procedur obsługujących szeregową pamięć EEPROM:

; deklaracja stałych i zmiennych
I2C_MEMORY_SDA    EQU    P2.4
I2C_MEMORY_SCL    EQU    P2.3
I2C_MEMORY_ADDR    EQU    31H
I2C_MEMORY_PAGE    EQU    32H
I2C_READ        EQU    33H
I2C_FAIL        EQU    34H
I2C_FAIL_COUNT    EQU    50
I2C_BYTE_COUNT    EQU    35H
I2C_MEMORY_CHIP_ADDR    EQU    0H
I2C_MEMORY_DATA    EQU    36H
I2C_MEMORY_DATA_ADDR    EQU    37H

Odczytuje bajt z aktualnego adresu w pamięci
I2C_MEMORY_READ_BYTE
zwraca wartość w:    I2C_MEMORY_DATA

Odczytuje bajt spod wskazanego adresu w pamięci:
I2C_MEMORY_ADDRESS_READ_BYTE
należy podać adres w:    I2C_MEMORY_DATA_ADDR
należy podać stronę w:    I2C_MEMORY_PAGE
zwraca wartość w:        I2C_MEMORY_DATA

Zapisuje bajt pod wskazany adres:
I2C_MEMORY_WRITE_BYTE
należy podać adres w:    I2C_MEMORY_DATA_ADDR
należy podać stronę w:    I2C_MEMORY_PAGE
należy podać daną w:    I2C_MEMORY_DATA

Zapisuje stronę danych:
I2C_MEMORY_PAGE_WRITE_FIRST
należy podać adres w:    I2C_MEMORY_DATA_ADDR
należy podać stronę w:    I2C_MEMORY_PAGE
należy podać pierwszą daną w:    I2C_MEMORY_DATA   

zaraz po czym należy wywoływać funkcję:
I2C_MEMORY_PAGE_WRITE_NEXT
należy podać następne dane w:    I2C_MEMORY_DATA

koniec zapisu do pamięci należy zakończyć funkcją:
I2C_MEMORY_PAGE_WRITE_END



SYGNALIZACJA AKUSTYCZNO-OPTYCZNA

Diody LED w znacznym stopniu ułatwiają programowanie urządzenia  odzwierciedlając stan zacisków wyjściowych. Świecenie jednej z ośmiu diód  ("1"-"8") oznacza aktywność odpowiedniego wyjścia sekcji wskazanej przez  diody "A" lub "B". Wyjście jest aktywne, gdy na zapalnik przekazane jest napięcie zdolne odpalić ładunek.

UWAGA!

Oczywiście podczas programowania sygnały z "diód" nie są przekazywane do modułu wykonawczego - są jedynie pomocą przy wizualizacji sekwencji wyjściowej. Faktem jest jednak, że diody te bezpośrednio odzwierciedlają stan portu P0, a zatem i magistralę między programatorem a modułem wykonawczym. Przypadkowy impuls ujemny na linii zegarowej jednego z zatrzasków mógłby uaktywnić wyjścia. Dlatego też układ powinien być wyłączony do momenty, gdy w pobliżu ładunków nie będzie znajdować się żadna osoba.
Ostatnim elementem informacyjnym modułu programatora jest buzzer piszczyk. Służy on do akustycznej komunikacji z użytkownikiem oraz sygnalizacji stanu pracy urządzenia.



MODUŁ WYKONAWCZY

duuuzy obrazek
Rys.2.1. Schemat ideowy modułu wykonawczego detonatora

Moduł wykonawczy składa się z następujących elementów:
  • 16 przekaźników
  • 16 czerwonych diod LED sygnalizujących odpalenie ładunku
  • 16 zielonych diod LED sygnalizujących podłączenie ładunku
  • przełącznika uzbrojenia układu



MAGISTRALA DANYCH

wyprowadzenia magistrali
Rys.2.2. Schemat wyprowadzeń magistrali danych

Moduł wykonawczy połączony jest z modułem programatora tasiemką     n-żyłową, stanowiącą swego rodzaju magistralę systemową. Takie rozwiązanie daje możliwość sprawnej wymiany, naprawy czy modernizacji urządzenia.

Na magistralę składają się:
  • 8 bitów danych o zaciskach wyjściowych danej sekcji (2, 4, 6, 8, 10, 12, 14, 16)
  • 2 bity wskazujące sekcję (11 - SEKCJA_A, 13 - SEKCJA_B)
  • 2 bity zasilające moduł programatora stabilizowanym napięciem 5V (15 - 5V, 1 - masa)



ZATRZASKI

schemat
Rys.2.3. Schemat ideowy układu połączenia zatrzasków

Dane magistrali o zaciskach wyjściowych podłączone są bezpośrednio do scalonych zatrzasków 74273 (U1 i U2).  Układy te, po otrzymaniu impulsu zegarowego, przepisują (binarny) stan wejść na wyjścia i podtrzymują je aż do otrzymania kolejnego. Dane na wejściach tych układów są wspólne (układy mają równolegle połączone wejścia). Zatrzaski zasilane są napięciem 5V z U3.

O tym, kiedy należy daną "zatrzasnąć" mówi programator poprzez dwa bity wskazujące sekcję - każdy bit oznacza jedną sekcję (podłączony jest do jednego zatrzasku). Tak więc uaktywnienie odpowiednich wyjść sprowadzi się do wystawienia danych na magistrali i  zatrzaśnięciu ich w odpowiednim zatrzasku.
W rzeczywistości sekwencja nie pojawia się na wszystkich wyjściach jednocześnie, lecz odpowiednio najpierw na sekcji numer 1, później 2. Opóźnienie to ma wartość kilku mikro / milisekund, więc praktycznie jest niezauważalne...

Programator wykonuje więc następujące kroki w celu uaktywnienia odpowiedniej sekwencji wyjściowej w module wykonawczym:
  • wystawia dane dla pierwszej sekcj na magistrali
  • zatrzaskuje dane w pierwszym zatrzasku (U1) ujemnym impulsem na nóżce CLK (11)
  • wystawia dane dla drugiej sekcj na magistrali
  • zatrzaskuje dane w drugim zatrzasku (U2) ujemnym impulsem na nóżce CLD (11)


bwód RC podłączony do nóżki CLR zatrzasku ma na celu wyzerowanie wszystkich jego wyjść zaraz po włączeniu zasilania. Kondensator C1/C2 podaje krótki impuls ujemny na wejścia CLR, rezystory R17/R18 utrzymują wysoki stan na tych wejściach. W przypadku niekasowania zatrzasków po włączeniu zasilania należy zastosować kondensatory elektrolityczne 0,47uF. Działanie tego obwodu jest krytyczne i zabezpiecza przed przypadkową aktywacją wyjść po włączeniu zasilania!



OPIS KANAŁU MODUŁU WYKONAWCZEGO

schemat
Rys.2.1. Schemat ideowy kanału wyjściowego

Jak widać na schemacie, wyjścia zatrzasków (U1 i U2) podłączone są przez tranzystory sterujące do przekaźników. Każdy zatrzask ma po 8 wyjść. Nazwijmy jedno takie wyjście kanałem. Każdy kanał składa się z przekaźnika kilku diod, rezystorów i tranzystora. Omówmy jego działanie na przykładzie kanału pierwszego.

Tranzystor T1 w takim układzie pełni rolę drivera mocy - aby zbytnio nie obciążać wyjść sterującego nim układu scalonego U1. Kiedy na jego bazie pojawi się stan wysoki, przejdzie w stan nasycenia i załączy przekaźnik. Dioda D1 włączona równolegle do przekaźnika w kierunku zaporowym, ma na celu wytłumienie wszelkich przepięć / impulsów wygenerowanych przez cewkę przekaźnika.

W urządzeniu zastosowany został tani przekaźnik dwupozycyjny na 12V. Do  środkowego styku podłączone jest jedno złącze zacisku wyjściowego. Kiedy przekaźnik jest włączany, zwiera styk środkowy do zasilania powodując aktywację zapalnika (żaróweczki), a więc detonację ładunku.
Domyślnie jednak, po włączeniu zasilania, przekaźnik ustawiony jest w pozycji "wyłączony"  zwierając do wyjścia zieloną diodę LED D33 i rezystor  R35. Dioda ta jest wyprowadzona na zewnątrz obudowy i sygnalizuje podłączenie ładunku wybuchowego do zacisków wyjściowych urządzenia - przewód wraz zapalnikiem  stanowią obwód elektryczny (rezystor),  który pozwala świecić diodzie. Oczywiście prąd świecenia diody musi być ograniczony rezystorem (R35), aby nie dopuścić do zaświecenia żaróweczki stanowiącej zapalnik - detonacji ładunku.
Stosowana żaróweczka nie może być na zbyt małe napięcie, gdyż prąd płynący przez R35 mógłby być wystarczający do powolnego rozgrzewania zapalnika...

Dioda D17 i rezystor R19 włączone równolegle do przekaźnika PK1,  sygnalizują optycznie stan pracy zacisku wyjściowego urządzenia i są wyprowadzone na zewnątrz obudowy. Jeśli dioda świeci wyjście jest aktywne, przekaźnik jest włączony - na zapalnik podane jest napięcie.
Równolegle do każdego z zacisków wyjściowych urządzenia podłączony jest kondensator eliminujący ewentualne zakłócenia mogące się wyindukować w przewodach połączeniowych między detonatorem a ładunkami. Takie zakłócenia mógłby spowodować na przykład telefon komórkowy...



ZASILANIE AKUMLATOROWE

schemat
Rys.3.1. Schemat ideowy modułu testującego naładowanie akumlatorów

Ze względu na możliwość zastosowania w ciężkich warunkach, detonator wyposażony został w zasilanie bateryjne, na które składają się dwa akumlatory  bezobsługowe, o napięciu 6V i pojemności 1.2Ah każdy. Podłączone są one równolegle do kondensatorów filtrujących, zaraz za mostkiem Gretz'a, w module wykonawczym.
Ładowanie odbywa się automatycznie po podłączeniu zewnętrznego źródła zasilania, którego napięcie powinno wynosić około 14..15V. Przy takim zasilaniu niewskazane jest włączenie układu - uszkodzeniu mogą ulec przekaźniki.

Urządzenie wyposażone zostało w prosty układ sygnalizujący pełne naładowanie akumlatorów. W przypadku gdy akumlatory są rozładowane, naciśnięcie przycisku SW1 nie spowoduje świecenia diody D2.

Potencjometrem R3 ustawić możemy próg zadziałania sygnalizatora. W prototypie ustawiłem ten prog na ok 11.8V, co gwarantowało mi 6 minut nieprzerwanej pracy przy aktywnych wszystkich wyjściach. Stan, w którym napięcie akumlatorów było minimalnie niższe od napięcia progowego rozpoznawałem po krótkim mignięciu diody D2 po wciśnięciu SW1.



INSTRUKCJA OBSŁUGI

rysunek

Zaraz po włączeniu układ sygnalizuje gotowość do pracy sygnałem dźwiękowym. Pływające punkty świetlne w sekcji podglądu wyjść oznaczają, że użytkownik znajduje się w głównym menu, a układ czeka na wybór funkcji. Może to być:
  1. programowanie sekwencji wyjściowej
  2. automatyczne odtwarzanie sekwencji wyjściowej
  3. pół-automatyczne odtwarzanie sekwencji wyjściowek
  4. kasowanie pamięci
Wybór funkcji odbywa się poprzez naciśnięcie przycisku o odpowiednim numerze. Na pulpicie, dla ułatwienia umieszczona została ściąga określająca funkcje poszczególnych klawiszy. I tak jeśli chcemy skasować pamięć, naciskamy guzik 4...



PROGRAMOWANIE SEKWENCJI WYJŚCIOWEJ

Aby wejść w tryb programowania należy nacisnąć przycisk 1. Na wyświetlaczu LED pojawią się dwie liczby dwucyfrowe - aktualny krok (pozycja STEP) i opóźnienie do następnego kroku (pozycja DELAY).

Aby przejść do następnego/poprzedniego kroku należy nacisnąć przycisk odpowiednio UP lub DOWN.  Takie przejście nie spowoduje zapisania kombinacji do pamięci, a wszelkie zmiany zostaną stracone.

Aby zwiększyć/zmniejszyć opóźnienie do następnego kroku, należy przycisnąć odpowiednio klawisze + lub -. Opóźnienie podawane jest w setnych częściach sekundy - jeśli wybierzemy 10, to opóźnienie wyniesie jedną sekundę.

Wszelkie zmiany stanu zacisków odbywają się na zasadzie negacji. Na wyświetlaczu pomocniczym (OUTPUT PREVIEW) ukaże się kombinacja wyjść dla danego kroku. Aby zmienić stan danego wyjścia na przeciwny należy nacisnąć odpowiadający mu przycisk z zakresu 1..8. Ponieważ wyjścia podzielone są na dwie sekcje, zmiany sekcji należy dokonać przyciskiem A/B.

Aby zapamiętać ustawienia danego kroku w wewnętrznej pamięci, naciskamy przycisk OK. Program automatycznie przeskoczy do następnego kroku.

Aby powrócić do menu głównego naciskamy przycisk MENU



AUTOMATYCZNE ODTWARZANIE SEKWENCJI WYJŚCIOWEJ

Aby wejść w tryb automatycznego odtwarzania, należy w głównym menu nacisnąć przycisk 2
klawiszami UP lub DOWN należy wybrać ostatni krok odtwarzanej sekwencji i zatwierdzić klawiszem OK
układ zacznie wydawać sygnał ostrzegawczy i mrugać diodami sekcji OUTPUT PREVIEW - jeśli chcemy rozpocząć wykonanie sekwencji, naciskamy guzik LAUNCH przed rozpoczęciem wykonywania sekwencji zawsze mamy możliwość powrotu do menu głównego przyciskiem MENU pamiętać należy o uprzednim uzbrojeniu urządzenia oraz możliwości jego rozbrojenia w trakcie trwania sekwencji.



PÓŁAUTOMATYCZNE ODTWARZANIE SEKWENCJI WYJŚCIOWEJ

Tryb ten jest bardzo zbliżony do automatycznego odtwarzania. Tutaj użytkownik ręcznie wyzwala poszczególne sekwencje wyjściowe:
  • przyciskami 1..8 odtwarza sekwencje zapisane w pamięci urządzenia, w komórkach odpowiednio 1..8
  • przyciskiem UP lub DOWN uaktywnia zawartość kolejnej/poprzedniej komórki pamięci przekazując jej zawartość na zaciski wyjściowe.



KASOWANIE PAMIĘCI

Aby skasować całą zawartość pamięci w menu głównym, należy nacisnąć przycisk 4, a następnie zatwierdzić wybór naciskając OK. Opóźnienia przyjmują wówczas wartość 0, a zaciski wyjściowe stan nieaktywny.



Wskazówki dotyczące materiałów pirotechnicznych

Urządzenie na zaciskach wyjściowych w momencie aktywacji wystawia napięcie 12V. Pozwala to na zastosowanie zwykłej żarówki jako zapalnika. Najlepsze do tego celu są miniaturowe żaróweczki do podświetlania paneli w radiach samochodowych (zwykle na napięcia 3..12V). Aby spreparować zapalnik należy delikatnie stłuc bańkę żarówki nie naruszając żarnika.

blah

Taki zapalnik jest od razu gotowy do użycia - należy wcisnąć go do ładunku wybuchowego (oczywiście bardzo delikatnie, aby nie naruszyć żarnika). Jeśli stosujemy petardy zakupione w sklepie, zapalnik umieszczamy w miejscu pozostałym po "pierwotnym elemencie zapłonowym" (najczęściej uprzednio usuniętym loncie czy drasce). Zwrócić uwagę należy na budowę "standardowych" petard, które to składają się z ładunku inicjującego (najczęściej prochu) oraz właściwego ładunku wybychowego. Taka konstrucja wprowadza nieprzewidywalne opóźnienie detonacji w granicach ok 2..5 sekund. Fakt ten należy wziąć pod uwagę opracowując sekwencje wybuchów.

blah

Jeśli używamy ładunków własnej konstrukcji pamiętać należy, że im bardziej wytrzymała i szczelna obudowa, tym lepszy efekt pirotechniczny. Najlepiej gdy używamy ładunków złożonych z jednej substancji, o niskiej temperaturze zapłonu (wystarczająco niskiej na odpalenie żażącym włóknem żarówki, lecz nie nazbyt niskiej ze względów bezpieczeństwa).

Jeśli potrzbujemy odpalić ładunek posiadający lont, możemy to zrobić w następujący sposób:

rysunek



CeDeROM i MOS-FET
KSZAK 2k2