2010.05_Antyirytator GSM.pdf

(267 KB) Pobierz
451452014 UNPDF
Do czego to służy?
Chciałbym zaproponować Czytelnikom budo-
wę prostego układu kontrolującego połączenia
w sieci GSM. Jest to propozycja dla wszyst-
kich zmęczonych odpuszczaniem „strzałek” i
odbieraniem połączeń od uciążliwych telemar-
keterów. Urządzenie ma pamięć przeznaczoną
na 20 numerów, którym można przypisać
różne działanie ze strony układu. Istnieje moż-
liwość automatycznego odrzucania połączeń z
wybranego numeru, automatycznego odbie-
rania połączeń (niech płacą i się wściekają)
bądź automatycznego odpuszczania „strzałek”
(dla uciążliwych znajomych). Oprócz
tego urządzenie zostało wyposażone
w przekaźnik, więc może pełnić inną
przydatną funkcję – włączać dowolne
urządzenie po puszczeniu sygnału z
zaprogramowanego numeru.
Układ nie jest skomplikowany.
Mogą go wykonać również mniej
zaawansowani Czytelnicy. W Elportalu
dostępny jest kod wynikowy, który
wystarczy tylko wgrać do mikrokontro-
lera. W razie problemów można popro-
sić o pomoc bardziej doświadczonego
kolegę. Udostępniony jest też pełny
kod źródłowy, który pozwoli dokładnie
prześledzić sposób pracy urządzenia i
nanieść na niego własne modyfikacje.
Oprócz opisywanego układu, nie-
zbędny jest jeszcze telefon komórkowy
pracujący jako klasyczny modem AT
oraz przewód łączący go z kompute-
rem przez port RS232. Próby zostały
przeprowadzone na modelach firmy
Siemens: C35i oraz C60. Inne nie były
testowane, więc nie wiem, jak będą się
sprawować w tej roli...
Jak to działa?
Schemat urządzenia został przedstawiony
na rysunku 1 . Zasilacz składa się z ele-
mentów, których numer sygnatury roz-
poczyna się od cyfry 1 (F11, U11, C12,
C14, etc.). Napięcie zasilające powinno
wynosić około 12V. W roli U13 zamiast
sugerowanego s78DL33 można użyć
każdego innego stabilizatora dostarczającego
napięcie 3,3V, uwzględniając układ wyprowa-
dzeń. Układ MAX232 (U21) jest odpowiedzial-
ny za konwersję napięć RS232 na TTL/CMOS.
Zasilanie go napięciem 5V może spowodować
pojawienie się na wejściach uK napięć wyższych
niż dopuszczalne 3,3V, co mogłoby doprowadzić
do uszkodzenia mikrokontrolera. W związku z
tym dodane zostały rezystory R22 i R23. Sercem
jest mikrokontroler AVR – ATmega88. Stabilne
źródło sygnału zegarowego jest wymagane z
uwagi na asynchroniczny port szeregowy.
Oprogramowanie
Oprogramowanie w wersji źródłowej jest
dostępne w Elportalu. Składa się ono z kilku
klas. Pierwszą jest keyboard . Stan przycisków
jest przeglądany podczas każdorazowego
wywołania funkcji składowych tej klasy: up ,
down, right, left czy offRelay . Funkcja zwraca
wtedy informację o naciśnięciu przycisku i
zapamiętuje, że taka informacja została poda-
na. Wykorzystany sposób obsługi klawiatury
zapewnia prawidłowe działanie i nigdy nie
wstrzymuje pracy programu.
D11
1N4007
+12V
F11
0.14A
U11
LM7809
+9V
U12
LM7805
+5V
U13
s78DL33
+3.3V
Z11
+12V
IN OUT
GND
IN OUT
GND
IN OUT
GND
C11
100n
C12
100u
C13
100n
C14
100u
C15
100n
C16
100u
C17
100n
C18
100u
Rys. 1
U21
MAX232
+5V
16
JP31
NOKIA LCD
VCC
C21
1u
1
C23 1u
+3.3V
+3.3V
C1+
2
CLK
SDIN
DC
SCE
CLR
V+
1 2
3 4
5 6
7 8
9 10
+9V
3
C25
4.7u
C26
100n
C31
100n
C1-
6
V-
C22
1u
4
R21
390
C2+
C24 1u
JP21
GMS
5
15
C2-
GND
C32
10u
+3.3V
4
R 22 10 k
13
12
RxD
3
14 R1in
R1out
11
2
T1out
T1Iin
R 23 10 k
R31
1k
TxD
JP32
AVR ISP
1
1
2
3
4
5
6
RESET
+3.3V
RESET
SCK
MISO
MOSI
U41
ATMEGA88
RxD
30
PD0/RXD
TxD
31
32
PD1/TXD
JP33
KEYS
PD2/INT0
REL
1
PD3/OC2B/INT1
2
KEY_UP
KEY_DOWN
KEY_LEFT
KEY_RIGHT
KEY_RELAY
PD4/XCK/T0
6
CLR
SCE
DC
9
23
KEY_UP
KEY_DOWN
KEY_LEFT
KEY_RIGHT
KEY_RELAY
PD5/OC0B/T1
PC0/ADC0
5
10
24
PD6/OC0A/AIN0
PC1/ADC1
4
11
25
PD7/AIN1
PC2/ADC2
3
26
PC3/ADC3
2
SDIN
CLK
12
27
PB0/CLKO/ICP1
PC4/ADC4/SDA
1
13
28
PB1/OC1A
PC5/ADC5/SCL
14
19
PB2/SS/OC1B
ADC6
MOSI
15
22
PB3/OC2A/MOSI
ADC7
MISO
16
+12V
PB4/MISO
SCK
17
18
PB5/SCK
AVCC
+3.3V
X1
X2
7
20
Z31
REL
PB6/XTAL1/TOSC1
AREF
8
21
D31
1N4007
PB7/XTAL2/TOSC2
GND
REL31
X1
C44
22p
+3.3V
+3.3V
+3.3V
R 32 1k
REL
T31
BC547
+12V
Q41
11.0592MHz
C41
100n
C42
100n
C43
100n
C33
100n
54
X2
C45
22p
Antyirytator GSM
U21
MAX232
54
451452014.081.png 451452014.092.png 451452014.103.png 451452014.114.png 451452014.001.png 451452014.012.png 451452014.023.png 451452014.034.png 451452014.035.png 451452014.036.png 451452014.037.png 451452014.038.png 451452014.039.png 451452014.040.png 451452014.041.png 451452014.042.png 451452014.043.png 451452014.044.png 451452014.045.png 451452014.046.png 451452014.047.png 451452014.048.png 451452014.049.png 451452014.050.png 451452014.051.png 451452014.052.png 451452014.053.png 451452014.054.png 451452014.055.png 451452014.056.png 451452014.057.png 451452014.058.png 451452014.059.png 451452014.060.png 451452014.061.png 451452014.062.png 451452014.063.png 451452014.064.png 451452014.065.png 451452014.066.png 451452014.067.png 451452014.068.png 451452014.069.png 451452014.070.png 451452014.071.png 451452014.072.png 451452014.073.png 451452014.074.png 451452014.075.png 451452014.076.png 451452014.077.png 451452014.078.png 451452014.079.png 451452014.080.png 451452014.082.png 451452014.083.png 451452014.084.png 451452014.085.png 451452014.086.png 451452014.087.png 451452014.088.png 451452014.089.png 451452014.090.png 451452014.091.png 451452014.093.png 451452014.094.png 451452014.095.png 451452014.096.png 451452014.097.png 451452014.098.png 451452014.099.png 451452014.100.png 451452014.101.png 451452014.102.png 451452014.104.png 451452014.105.png 451452014.106.png 451452014.107.png 451452014.108.png 451452014.109.png
Klasa lcd3310 obsługuje wyświetlacz z
telefonu Nokia 3310. Konstruktor odpowia-
da za przygotowanie wyświetlacza do pracy.
Funkcje write_cmd oraz write_char umożli-
wiają zapis, odpowiednio, polecenia sterujące-
go lub danych obrazu. Najważniejszą funkcją
jest jednak write umożliwiająca zapisanie cią-
gów tekstowych do wyświetlacza i obsługująca
proste polecenia sterujące zaczynające się zna-
kiem @. Po nim należy podać numer linii, do
której mają być zapisywane znaki, bądź literę
c , aby wyczyścić zawartość całego ekranu.
W pliku chargen.h umieszczono definicje
znaków. Chcąc oszczędzić miejsce w pamię-
ci, zdecydowałem się pominąć część znaków,
więc możliwe jest zapisanie cyfr, dużych liter
oraz niektórych znaków.
Do komunikacji z komórką wykorzysta-
na została klasa usart . Spełnia ona funk-
cję buforowanego portu szeregowego. Klasa
ta umożliwia również wygodne przesyłanie
poleceń do komórki. Odpowiednie komen-
dy AT umożliwiają nawiązanie połączenia,
odrzucenie połączenia lub dzwonienie pod
wybrany numer. Do testów została dodana
także funkcja softRS232write , której głów-
nym zadaniem było przesyłanie informacji
na terminal uruchomiony na komputerze.
Pozwoliło to na sprawniejsze wyszukiwanie
błędów w oprogramowaniu. Funkcja ta obec-
nie nie jest używana.
Podstawę pracy urządzenia stanowi baza
numerów i przypisanych do nich działania
takie jak: nie rób nic, odbierz połączenie,
odrzuć połączenie, odpuść strzałkę czy włącz
przekaźnik . Nie bardzo podobał mi się pomysł
żonglowania luźno powiązanym zbiorem
danych, więc przygotowałem klasę-pojemnik
do przechowywania potrzebnych informacji.
Jest nią klasa numbers i tablica numb prze-
chowująca numer telefonu w postaci ciągu
znaków ASCII oraz zmienna opt , która zapa-
miętuje informację o akcji, jaka ma być pod-
jęta dla danego numeru. Zmienna opt może
przyjmować z góry określone wartości, które
są reprezentowane przez stałe zawarte w pliku
nagłówkowym. Pewną ciekawostką są dwa
konstruktory. Pierwszy z nich nie przyjmuje
żadnych argumentów i tworzy numer „pusty”,
czyli taki, w którym nie są przechowywane
żadne informacje. Drugi konstruktor przyj-
muje dwa parametry: numer telefonu oraz
wartość określającą rodzaj akcji. Kopiuje on
numer do poszczególnych pól tablicy i zapi-
suje działanie przypisane do tego numeru.
Pozwala to na szybkie stworzenie nowego
obiektu i wstawienie go do rejestru.
Do klasy numbers dodane zostały funkcje
pomocnicze, które ułatwiają sprawne zarzą-
dzanie połączeniami. Możliwe jest porów-
nywanie dwóch numerów z wykorzystaniem
funkcji cmp , która przyjmuje jako argument
obiekt klasy numbers . Pozwala to prowadzić
sprawniejsze przeszukiwanie rejestru. Oprócz
tego dodane zostały funkcje prevOption oraz
nextOption dokonują zmiany aktualnej akcji
na inną. Funkcja print pozwala zaprezento-
wać użytkownikowi zebrane numery razem z
akcjami, jakie są do nich przypisane. W argu-
mencie podawana jest tablica, w której zapi-
sywany zostanie wynik: kolejne cyfry numeru
i po dwukropku opcja jako dwuliterowy ciąg
znaków (szczegóły za chwilę). Podobną rolę
spełnia getNumber , z tą różnicą, że zwracany
jest wskaźnik do przechowywanego numeru,
ale bez żadnych dodatkowych informacji i
znaków formatujących (takich jak literowe
oznaczenie podejmowanej akcji).
Korzystne było utworzenie funkcji isEmp-
ty pozwalającej sprawdzić, czy dany obiekt
klasy numbers przechowuje jakieś informacje,
czy nie. Jest to przydatne podczas poszukiwa-
nia wolnego miejsca w rejestrze do zapisania
nowego numeru.
Do zarządzania połączeniami powstała
klasa callmgr i najważniejsza funkcja doWork ,
która musi być wywoływana okresowo, aby
sprawdzić, czy w buforze nie znajduje się
informacja o nowym połączeniu.
Włączony telefon komórkowy przesy-
ła ciąg znaków „RING”, gdy ktoś próbuje
się dodzwonić. Brakuje jednak informacji
o numerze telefonu, z którego dokonywane
jest połączenie. Trzeba wysłać odpowiednią
komendę AT poprzez port szeregowy – listing
1 . Polecenie jest bardzo proste: at+clip=1 ,
z tym że tworzona jest również tablica ent ,
która odpowiada za przesłanie znaków końca
linii (enter). Są one wysyłane przed i po pole-
ceniu, żeby zakończyć ewentualne, poprzed-
nie komendy i zaakceptować bieżącą. Kod
ten jest umieszczony wewnątrz konstruktora
klasy.
Od tej pory informacja o nadchodzącym
połączeniu będzie zawierać ciąg postaci:
+CLIP: xxxxxxxxx,yyy
gdzie xxxxxxxxx oznacza numer, z którego
wykonywane jest połączenie, a yyy dodat-
kowy parametr. Zadaniem funkcji doWork
będzie zatem poszukiwanie znaku dwukrop-
ka, po którym spodziewamy się otrzymać
numer osoby dzwoniącej. Po jego znalezieniu
pobierana jest z bufora klasy usart reszta
znaków i usuwany jest potencjalny prefiks
+48. Sam ciąg znaków reprezentujący numer
telefonu zostaje skopiowany do bufora pod-
ręcznego klasy callmgr .
Jeżeli zdarzy się tak, że
dzwoniąca osoba ma
numer zastrzeżony, to
otrzymany ciąg tekstowy
będzie miał postać:
+CLIP: ,
czyli żaden numer
nie zostanie przesłany. W takim przypadku
oprogramowanie zapisze arbitralnie wybrany
przeze mnie ciąg trzech zer, który informuje,
że osoba dzwoniąca ma ukryty numer. Po
zakończeniu pobierania numeru ustawiona
//konstruktor
callmgr :: callmgr (){
//uaktywnij pokazywanie numeru
char ent [ 3 ] = { 0x0D , 0x0A } ;
char cmd [] = { “at+clip=1” } ;
port . write ( ent ) ;
port . write ( cmd ) ;
port . write ( ent ) ;
}
zostaje flaga isSthToDo informująca, że ode-
brano nowe połączenie i należy je obsłużyć.
Klasa callmgr zawiera trzy funkcje odpo-
wiedzialne za zarządzanie nadchodzącymi
połączeniami:
- acceptCall – odbiera połączenie,
- terminateCall – odrzuca połączenie,
- answerCall – dzwoni pod numer podany w
argumencie funkcji.
Ich działanie sprowadza się do przesła-
nia odpowiedniej komendy AT do komórki
poprzez klasę usart . Należy zwrócić szcze-
gólną uwagę na polecenie dotyczące oddzwa-
niania – listing 2 . Po numerze telefonu MUSI
znaleźć się średnik, aby nawiązać połączenie
głosowe. Bez tego telefon odeśle informację
o błędzie i żadne połączenie nie zostanie
wykonane.
Kopiowanie do bufora podręcznego daje
możliwość odczytania ostatniego numeru, z
którego ktoś dzwonił. Służy do tego funk-
cja getLastCall zwracająca właśnie zawartość
lokalnego bufora, w którym przechowywany
jest ostatnio odebrany numer. Warto zauważyć,
że nie ma bezpośredniego dostępu do flagi isS-
thToDo i należy korzystać z funkcji isNewCall .
Pomijając kwestie przypadkowego zmienienia
jej wartości, można tu zawrzeć prostą sztucz-
kę: zerować ją przy każdym odczycie. Jest to
wygodne, bo nie trzeba o tym pamiętać i tym
samym zapobiega się kilkakrotnemu podjęciu
akcji dla tego samego połączenia.
Za zarządzanie wszystkimi numera-
mi odpowiedzialna jest klasa numbreg .
Przechowuje ona tablicę obiektów num-
bers , w której zawarte są odebrane numery
i przypisane do nich działania. W jej wnę-
trzu umieszczony jest obiekt klasy callmgr ,
który służy do obsługi telefonu komórko-
wego. Najważniejszą funkcją jest ponownie
doWork odpowiedzialna za bieżącą obsługę
połączeń i działań użytkownika. Pierwszym
krokiem podejmowanym wewnątrz tej funkcji
jest wywołanie doWork należącego do klasy
callmgr. Następnie sprawdzane jest, czy poja-
wiło się nowe połączenie za pomocą isNew-
Call . Jeżeli sytuacja taka miała miejsce, to
rozpoczyna się poszukiwanie numeru osoby
dzwoniącej na liście uprzednio zdefiniowa-
nych (tablica reg ). Przeszukiwanie kończy
się z chwilą znalezienia pasującego wpisu lub
dotarcia do pierwszego
pustego pola. Miejsce
to jest zapamiętywa-
ne w zmiennej i . Gdy
wyszukiwanie da nega-
tywny wynik następuje
ponowne przeszukanie
//odpuszcza sygnal
void callmgr :: answerCall ( char * number ){
//odpusc strzalke na ostatni numer
char ent [ 3 ] = { 0x0D , 0x0A } ;
char cmd [] = { “atd” } ;
port . write ( ent ) ;
port . write ( cmd ) ;
port . write ( number ) ;
port . write ( “;” ) ;
port . write ( ent ) ;
}
Listing 2
Elektronika dla Wszystkich Maj 2010
Maj 2010
55
Listing 1
Elektronika dla Wszystkich
55
451452014.110.png 451452014.111.png
tablicy, ale już pod kątem wpisu, który ma
domyślną akcję nie rób nic. Jeżeli to działanie
się powiedzie, to wpis ten jest kasowany. Gdy
nie uda się spełnić żadnego z tych warunków
nadchodząca rozmowa zostanie zignorowa-
na.
eraseEEPROM – kasuje
całą pamięć EEPROM
Warto mieć świadomość,
że zapis pojedynczego bajtu
(razem z czasem kasowania)
zajmuje około 3,4ms. Jest to
szczególnie uciążliwe, gdy
potrzeba zapisać większą
ilość danych, bo czas oczeki-
wania będzie znaczący.
Główny program, zawar-
ty w pliku main.cpp przed-
stawiono na listingu 3 (w
Elportalu) . Na początku
dołączane są pliki nagłów-
kowe bibliotek. Warto zwró-
cić uwagę na dziwną funkcję
SIGNAL , która w rzeczy-
wistości jest uchwytem dla
przerwania. Po jego wystą-
pieniu wywoływany jest
kod wewnątrz tej funkcji, a
jej argument określa źródło
przerwania. W tym wypadku
jest tylko jedno przerwanie
od portu szeregowego, które
jest wywoływane po odebra-
niu nowego znaku. Polecenie port.interrupt()
wywołuje mechanizm odpowiedzialny za
umieszczenie znaku w buforze odbiorczym i
zwiększenie licznika znaków do odczytu.
Dalej następuje konfiguracja portów I/O do
obsługi przekaźnika oraz przeznaczonych do
obsługi zworki włączającej dodatkową linię w
LCD. Przed główną pętlą umieszczony został
fragment kodu odpowiadający za kasowanie
pamięci EEPROM. Jego rola sprowadza się
do zapytania, czy dokonać kasowania, prze-
prowadzić je, gdy jest taka potrzeba, lub po
odczekaniu 3 sekund przejść dalej.
Rola pętli głównej sprowadza się do
wywołania funkcji doWork klasy numbreg ,
sprawdzenia, czy nałożona jest zworka,
wyświetlenia linii z numerami i ich opisem
oraz reagowania na naciśnięcie klawiszy.
Montaż i uruchomienie
Układ można zmontować na płytce druko-
wanej pokazanej na rysunku 2 . Urządzenie
zostało umieszczone w obudowie KM-49.
Pewien kłopot jest z zamocowaniem płyt-
ki drukowanej. Została ona „ściśnięta”
pomiędzy tulejkami prowadzącymi śruby
mocujące obudowę. W efekcie obudo-
wa trochę odstaje, ale całość trzyma się
solidnie.
Warto wspomnieć, że jakość sprze-
dawanych na Allegro wyświetlaczy jest
różna. Kiedyś kupione wyświetlacze pra-
cowały prawidłowo, ostatnio nabyte już
nie. Problem polegał na wycinaniu paru
pierwszych linii, co uniemożliwiało pra-
widłowe wyświetlenie tekstu w pierwszej
linii. Nie było już czasu na zakup nowego
egzemplarza, więc zdecydowałem się nie
używać pierwszej linii. Jest to
o tyle pożądane, że Czytelnicy
powielający urządzenie mogą
również trafić na wyświetlacze
gorszej jakości. W oprogramo-
waniu jest jednakże pewna furtka
– nałożenie zworki na piny SCK
oraz MISO złącza JP32 włącza
normalnie nieużywaną linię.
Szczęśliwcy, którym nie trafi się
wadliwy egzemplarz LCD, mogą
używać wszystkich linii.
Zamiast zaproponowanej kla-
wiatury złożonej z przycisków,
można się pokusić o zakup joysti-
cka do telefonu komórkowego i
używanie go zamiast przycisków.
Po włączeniu zasilania, poja-
wi się na trzy sekundy pytanie,
czy skasować pamięć EEPROM.
Należy to zrobić przy pierwszym
uruchomieniu, gdyż w pamięci
mogą być przechowywane „śmie-
ci”, które uniemożliwią normalną
pracę urządzenia.
Klawisze UP oraz DOWN
umożliwiają nawigację po „zapęt-
lonej” liście numerów odpowiednio w górę i
w dół. Klawisze Left oraz Right dają moż-
liwość zmiany rodzaju akcji przypisanej do
numery. Dostępne są następujące opcje:
- UK (UnKnow) – numer nieznany, nie rób nic,
- AC (Accept Call) – odbierz połączenie,
- RP (RePly) – odpuść sygnał,
- TR (TeRminate) – odrzuć połączenie,
- RL (ReLay) – włącz przekaźnik.
Po włączeniu przekaźnika pozostaje on
w tym stanie do chwili wciśnięcia przycisku
RELAY (lub wyłączenia zasilania).
Telefon należy podłączyć PRZED
WŁĄCZENIEM ZASILANIA.
Niedotrzymanie tego warunku nie spowoduje
żadnego uszkodzenia, ale układ nie będzie
działał. Wynika to z faktu, że domyślnie
komórka nie wysyła numeru osoby dzwo-
niącej. Konieczna jest specjalna komenda AT
wysyłana zaraz po uruchomieniu zasilania
urządzenia. Gdy Czytelnik „rozpędzi się” i
przeoczy tę kwestię, musi wyłączyć i ponow-
nie włączyć zasilanie.
Należy zachować dużą staranność montażu
LCD. Najczęściej ma on elektrody napylone
na szkło i złącze z pinami, który musi być
solidnie dociśnięte, aby moduł mógł prawid-
łowo pracować. Jeżeli po uruchomieniu urzą-
dzenia na wyświetlaczu nic się nie pojawia, to
warto poruszać tasiemką i/lub ścisnąć palcami
obudowę LCD na wysokości złącza. Po każdej
takiej zmianie należy na moment odłączyć
układ od zasilania, aby mogła zostać wyko-
nana procedura inicjacji ekranu. W mode-
lu złącze jest dociśnięte kawałkiem plastiku
przyklejonym do obudowy.
Jakub Borzdyński
R21 . . . . . . 390 Ω 2012 (0805)
R22,R23 . . .10k Ω 2012 (0805)
R31,R32 . . . .1k Ω 2012 (0805)
C11,C13, C15,C17,C26,C31,C33,
C41-C43 . . 100nF 2012 (0805)
C12,C14,C16,C18 100μF
C21-C24 . . . . . . . . . . . . . . 1 μ F
C25 . . . . . . . . . . . . . . . . .4,7 μ F
C32 . . . . . . . . . . . . . . . . . 10 μ F
C44,C45 . . . 22pF 2012 (0805)
D11,D31 . . . . . . . . . . . 1N4007
T31 . . . . . . . . . . . . . . . . BC547
U11 . . . . . . . . . . . . . . . LM7809
U12 . . . . . . . . . . . . . . . LM7805
U13 . . . . . . . . . . . . . . s78DL33
U21 . . . . . . . . . . . . . . . MAX232
U41 . . . . . . . . . . . . . ATmega88
F11 . . . . . . . 0,14A 1812 (smd)
JP21 . . . . . . . . . . . . goldpin x4
JP31 . . . . . . . . . . . goldpin 2x5
JP32,JP33 . . . . . . . . goldpin x6
Q41 . . . . . . . . . . . 11,0592MHz
REL31 . . . . . . . . . NT73-2C-S12
Z11 . . . . . . . . . . . . . . . . . ARK2
Z31 . . . . . . . . . . . . . . . . . ARK3
Kolejny krok obsługi połączenia to
instrukcja switch podejmująca zaprogramo-
waną akcję dla uprzednio zapamiętanego i
skonfigurowanego numeru. W przypadku
braku numeru w rejestrze zostaje on dopisany
na uprzednio skasowanej pozycji (jeżeli była
taka możliwość).
Komentarza może wymagać algorytm
odpuszczania sygnałów. Niektóre nadcho-
dzące połączenie stanowią próbę nawiązania
rozmowy z właścicielem telefonu. W takiej
sytuacji puszczenie sygnału byłoby po prostu
„dziwne”. W związku z tym po wykryciu
połączenia kwalifikującego się do odpuszcze-
nia sygnału urządzenie odczekuje 12 sekund i
puszcza strzałkę. Gdyby osoba dzwoniąca nie
rozłączyła się jeszcze do tego czasu, to próba
nawiązania połączenia zwróci błąd i sygnał
nie zostanie odpuszczony. W przeciwnym
wypadku nawiązane zostanie połączenie i po
upływie 15 sekund zostanie ono przerwane
przez układ.
Klasa numbreg ma trzy funkcje bardzo
podobne do funkcji zawartych wewnątrz
klasy callmgr : nextOption, prevOption, prin-
tNumber . Dwie pierwsze z wymienionych
wywołują w zasadzie swoje pierwowzory
dokonujące stosownej zmiany, ale przy oka-
zji zapisują nowe nastawy automatycznie
do pamięci EEPROM. Funkcja printNumber
ma dodatkowy argument – index . Określa
on, który z numerów przechowywanych
wewnątrz rejestru ma być wyświetlony.
Wewnątrz tej klasy znajdują się także
funkcje przeznaczone do obsługi pamięci
EEPROM wbudowanej w mikrokontroler:
writeByteToEEPROM – jako argument
przyjmuje adres komórki oraz bajt
readByteFromEEPROM – zwraca bajt
odczytany z komórki o adresie podanym w
argumencie
saveToEEPROM – zapisuje cały rejestr do
pamięci EEPROM
readFromEEPROM – wczytuje dane do
rejestru z pamięci EEPROM
Rys. 2
56
Maj 2010
Elektronika dla Wszystkich
Wykaz elementów
451452014.112.png 451452014.113.png 451452014.115.png 451452014.116.png 451452014.117.png 451452014.118.png 451452014.119.png 451452014.120.png 451452014.121.png 451452014.122.png 451452014.123.png 451452014.124.png 451452014.002.png 451452014.003.png 451452014.004.png 451452014.005.png 451452014.006.png 451452014.007.png 451452014.008.png 451452014.009.png 451452014.010.png 451452014.011.png 451452014.013.png 451452014.014.png 451452014.015.png 451452014.016.png 451452014.017.png 451452014.018.png 451452014.019.png 451452014.020.png 451452014.021.png 451452014.022.png 451452014.024.png 451452014.025.png 451452014.026.png 451452014.027.png 451452014.028.png 451452014.029.png 451452014.030.png 451452014.031.png 451452014.032.png 451452014.033.png
Zgłoś jeśli naruszono regulamin