You are on page 1of 20

http://www.easy-soft.tsnet.

pl

Urzdzenia alarmowe bardzo czsto wyposaane s w rnego rodzaju sygnalizacje wamania. Najprostszym jest uruchomienie sygnau dwikowego czy optycznego, te bardziej zaawansowane potrafi podawa swj status przez Internet czy telefon. Prezentowane w tym artykule urzdzenie to amatorski alarm, ktry potrafi przesa informacj o zaczeniu przez krtk informacj tekstow, tak zwany SMS. Dla potrzeb modelu wykorzystaem modem GSM firmy WAVECOM, jednak mona uy dowolnego telefonu komrkowego. By moe jego wykorzystanie bdzie wymagao rozwizania problemu zasilania oraz sposobu kodowania SMS, jednak jest moliwe i wykonalne w warunkach warsztatu elektronika amatora. Opis konstrukcji. Prezentowana centralka alarmowa jest jednym z tego rodzaju urzdze elektronicznych, ktrych podstawowa warto skupia si na wykonaniu odpowiedniego oprogramowania. Ukad elektryczny jest prosty i nieco przypomina pytk prototypow przeznaczon do projektowania ukadw z mikrokontrolerami. Jednostk sterujc stanowi ukad mikrokontrolera firmy ATMEL AT90S2313 taktowany wewntrznym generatorem o czstotliwoci stabilizowanej kwarcem 7,3728MHz. Mikrokontroler posiada 15 linii wejcia wyjcia. Dwie z nich wykorzystywane s przez UART (RXD 2, TXD 3), pozostae trzynacie steruje prac ukadw peryferyjnych lub suy do komunikacji mikrokontrolera z otoczeniem. Port B ustawiany jest przez program jako wyjciowy z zaczonymi rezystorami pull-up (DDRB=0xFF). Tryb ten nie ulega zmianie w czasie pracy programu mimo, i czasami port ten wyprowadza dane a czasami suy do ich odczytu. Jest to pewna szczeglna cecha mikrokontrolera AVR, wrcimy jeszcze do niej w dalszej czci artykuu. Podobnie jest w przypadku portu D, chocia tutaj cz linii jest liniami wyjciowymi (TXD, DIR) a cz wejciowymi (RXD i bity 2 do 5). Nie mniej jednak raz ustawiony tryb pracy nie jest zmieniany podczas funkcjonowania urzdzenia. Jak wspomniaem wczeniej, mikrokontroler AT90S2313 posiada 15 linii portw wejcia wyjcia. Potrzeby ukadu alarmu s jednak znacznie wiksze. Posiada on 8 wej przeznaczonych dla czujnikw a dodatkowo wywietlacz i klawiatura wymagaj uycia odpowiednio co najmniej 6 i 7 wyprowadze portw. To tylko podstawowe ukady otoczenia. Dodajmy do tego jeszcze co najmniej 1 lini dla sterowania ukadem sygnalizacji alarmu i otrzymamy liczb 22 wyprowadze portw koniecznych do poprawnego funkcjonowania ukadu alarmu. Konieczna wic bya albo zmiana mikrokontrolera na taki posiadajcy wiksz liczb portw albo te zastosowania dodatkowych ukadw scalonych. Zdecydowaem si na to drugie rozwizanie. Sygna z czujnikw alarmowych podawany jest na doprowadzenia diody transoptora. Transoptor zapewnia izolacj galwaniczn oraz eliminuje cz niskonapiciowych zakce, ktre mog pojawi si na linii doprowadzajcej sygna z czujnika. Uyem 2 elementw firmy SHARP o symbolu PC849 (odpowiednik funkcjonalny produkowany jest przez firm LITEON pod oznaczeniem LTV849). Kada z obudw zawiera 4 transoptory skadajce si z fototranzystora i diody. Szeregowo poczone z diodami rezystory R1..R8 naley dobra do parametrw posiadanych czujnikw. Te stosowane przez mnie o wartoci 1k dobrane zostay dla napicia sterujcego 9..12V. Osiem wej czujnikw podczone jest do ukadu multipleksera, ktry w zalenoci od poziomu logicznego sygnau przyoonego na wejcie A/B (wyprowadzenie 1) podaje na wyjcia 1Y..1Y odpowiednio stany logiczne z wej 1A..4A lub 1B..4B. Umoliwia to 4-bitowemu portowi mikrokontrolera odczyt 8-bitowych danych w dwch porcjach po 4 bity. Wyborem 4 wej, z ktrych odczytywany jest stan steruje wyprowadzenie 6 portu D mikrokontrolera. Niektre z portw mikrokontrolera peni podwjn rol. Oprcz tego, e s wyjciowymi np. dla moduu wywietlacza LCD, to s rwnie wejciowymi dla wierszy klawiatury. Zacznijmy moe opis od wywietlacza. W swojej konstrukcji uyem moduu LCD 2 linie po 20 znakw w kadej. Wywietlacz pracuje w trybie interfejsu 4-bitowego wykorzystujc linie portu PB0..PB4 jako linie danych, PB4 jako lini wyboru rejestru RS i PB7 jako ENABLE. Wszystkie linie portw oprcz ENABLE s wykorzystywane w dwjnasb: jako sterujce wywietlaczem oraz prac klawiatury. Wykorzystywany jest fakt, e w czasie trwania stanu niskiego na linii ENABLE nie s do rejestrw wywietlacza zapisywane adne dane. Umoliwia to zmiany stanw pozostaych linii bez zakcania pracy moduu. Typowo, na wyprowadzenie 3 zcza wywietlacza podane jest napicie z suwaka potencjometru suce do regulacji kontrastu a pomidzy 15 i 16 doprowadzone jest napicie dla podwietlenia ta (okoo 4,3V). Ukad mona uproci zwierajc napicie regulacji kontrastu do masy. Dla wikszoci wywietlaczy LCD jest to wystarczajce. Klawiatura zostaa zbudowana jako matryca 3 kolumn i 4 wierszy. Trzy bity portu B (4, 5 i 6) pracuj jako wyjciowe, cztery jako wejciowe. Wszystkie linie maj zaczone wewntrznie rezystory pull-up. Wyjtkiem s tutaj bity 0 i 1, ktre wymagaj zewntrznych rezystorw podcigajcych. Kierunek pracy portu nie jest zmieniany przez program sterujcy. Linie pracuj zawsze jako wyjciowe a w razie potrzeby ich stan sprawdzany jest przez odczyt rejestru PIN. W architekturze mikrokontrolera AVR rejestr PIN to adres, przy odczycie ktrego, wyprowadzenie portu zaczane jest przez specjalny bufor trjstanowy do wewntrznej magistrali danych mikrokontrolera. Rol ukadu dopasowujcego poziomy napi interfejsu UART mikrokontrolera do RS232 peni ukad MAX232. Wykorzystane s tylko 2 ukady driverw znajdujce si w strukturze. Sygna interfejsu doprowadzony jest na zcze mskie, 9-wyprowadzeniowe. Ukadu MAX mona nie wlutowywa lub nie wykorzystywa. Zworki JP1 i JP2 znajdujce si na pytce umoliwiaj odczenie sygnaw RXD i TXD mikrokontrolera od ukadu MAX, i doprowadzenie go do inwertorw 74HCT14. W zamiarze mia by to ukad dopasowujcy do telefonu GSM (SIEMENS C35). Rezystory R20 i R21 to dzielnik napicia, ktry jest tak dobrany, aby napicie wyjciowe nie

- Strona 1 z 14 -

http://www.easy-soft.tsnet.pl

przekraczao 3,3V w stanie wysokim. W drug stron, bramka 74HCT14 pracujca jako odbiornik, posiada w strukturze przerzutnik Schmitta, ktry powoduje, e napicie powyej 2,4V uwaane jest za stan wysoki. Zaznaczam jednak, e alarm testowany by wycznie z modemami firmy SIEMENS (M20T) oraz WAVECOM (WMOD2) a interfejs dla telefonu GSM nie by wykorzystywany. Zcze dla zwykego telefonu GSM oznaczone jest jako X14 a dla modemu GSM - X12. Bramki ukadu inwertora pracuj rwnie jako ukady wyjciowe sterujce prac przekanika oraz diody LED. Cao ukadu zasilana jest napiciem 5V z umieszczonego na pytce ukadu stabilizatora 7805 (U3). Do poprawnej pracy wymaga on podania co najmniej 7V na zaciski zcza X10. Uwaga na polaryzacj! Kondensatory C9..C12 peni rol filtrowania napicia zasilajcego. C10 i C11 powinny by umieszczone jak najbliej wyprowadze stabilizatora. Rezystor R11 i kondensator C4 to prosty ukad RC (rezystor adowany przez kondensator) wytwarzajcy sygna reset dla mikrokontrolera. Elementem wykonawczym alarmu jest przekanik RL1. Na doprowadzeniach jego cewki znajduje si dioda D3 majca za zadania eliminowanie przepi powstajcych w czasie zaczania i wyczania cewki. Jak wspomniaem wczeniej, rol ukadu dopasowujcego peni bramki inwertora poczone rwnolegle w celu zapewnienia wikszej wydajnoci prdowej. Przekanik sterowany jest wsplnie z diod LED. Zaczeniu przekanika odpowiada stan zawiecenia diody. W pewnych momentach pracy ukadu, dioda wykorzystywana jest rwnie do sygnalizacji. Wwczas jednak jej byski s na tyle krtkie, e nie powoduj zaczenia przekanika. Rwnie w czasie przegldania wierszy klawiatury staraem si dobra czasy na tyle krtkie aby nie powodowa zaczania urzdze zewntrznych. Wyprowadzenie mikrokontrolera Opis funkcji Nazwa Numer Oznaczenie (obudowa sygnau na DIL20) schemacie PB0/AIN0 12 DB4 Linia danych DB4 moduu LCD, wiersz 2 klawiatury PB1/AIN1 13 DB5 Linia danych DB5 moduu LCD, wiersz 3 klawiatury PB2 14 DB6 Linia danych DB6 moduu LCD, wiersz 4 klawiatury PB3/OC1 15 DB7 Linia danych DB7 moduu LCD, wiersz 1 klawiatury PB4 16 RS Linia RS (Register Select) moduu LCD, kolumna 1 klawiatury PB5/MOSI 17 COL Kolumna 2 klawiatury PB6/MISO 18 LED Linia zaczajca przekanik i diod LED, kolumna 3 klawiatury PB7/SCK 19 EN Linia ENABLE moduu LCD (sterujca wprowadzaniem danych) PD0/RXD 2 RXD Linia odbiornika interfejsu UART mikrokontrolera PD1/TXD 3 TXD Linia nadajnika interfejsu UART mikrokontrolera PD2/INT0 6 Wejcie sygnau z czujki zewntrznej (X1 i X5) PD3/INT1 7 Wejcie sygnau z czujki zewntrznej (X2 i X6) PD4/T0 8 Wejcie sygnau z czujki zewntrznej (X3 i X7) PD5/T1 9 Wejcie sygnau z czujki zewntrznej (X4 i X8) PD6/ICP 11 DIR Sterowanie wyborem wej multipleksera (U2) Tabela 1. Opis wyprowadze mikrokontrolera AT90S2313 Opis programu sterujcego. Pocztkowo zamierzaem wykona cao programu sterujcego prac alarmu w jzykach Bascom lub GCC. Okazao si jednak, e mikrokontroler AT90S2313 ze swoimi 2kB pamici FLASH jest zbyt skromny jak na wymagania kompilatora jzyka wysokiego poziomu. Zupenie zaskoczy mnie kompilator GCC. Przeniosem do niego bibliotek funkcji, napisan co prawda dla 8051, lecz po drobnych modyfikacjach kompilator GCC przetworzy rdo na kod wynikowy bez wikszego problemu. Jednak rozmiar tego kodu by dla mnie zupenym zaskoczeniem! Wykonaem wycznie procedury obsugi LCD w jzyku C i te po kompilacji zajy 3kB! Dla porwnania analogiczny funkcjonalnie program wykonany w Bascom AVR zaj jedynie ok.500 bajtw. Podobnie zreszt jak w RC-51. By moe nie umiaem wczy jakiej opcji optymalizacji ale... Tak czy inaczej 2kB to za mao pamici aby bya wystarczajc do wykonania tego typu aplikacji w jakim jzyku wysokiego poziomu. Chcc nie chcc, zgodnie z zasad co za co, musiaem wykona cao programu sterujcego w jzyku AVR Asembler. W tym przypadku by to rozmiar kodu wynikowego kosztem czasu spdzonego przy jego implementacji. Przy uruchamianiu i testowaniu programu sterujcego posugiwaem si AVR Studio 4 firmy ATMEL. Aby omwi sposb funkcjonowania programu, musz wyjani kilka podstawowych regu, ktrymi kieruj si przy pisaniu tego rodzaju aplikacji. Dotycz one gwnie staych i zmiennych oraz sposobu ich interpretacji przez funkcje. Zacznijmy od liczb. Zgodnie z notacj przyjt przez firm Atmel, kad liczb rozpoczyna bajt mniej znaczcy a koczy bardziej znaczcy. I tak jeli liczba jest 4-bajtow zmienn umieszczon w rejestrach R0 - R01 - R02 - R03, to najmniej znaczcy bajt zawiera R0 a najbardziej znaczcy R03. Kady acuch tekstowy wysyany na wywietlacz zawiera tylko kody znakw wikszych od 0x20 (32 dziesitnie, kod znaku odstpu) a koczy si znakiem o kodzie 0x00. Podobnie jest z cigami znakw wysyanych do modemu ale podlegajcych przetwarzaniu przed ich wysaniem. Na przykad polecenie zapisujc kod PIN zawiera cz sta AT+CPIN= oraz zmienny zaleny od karty SIM poufny kod PIN. Inaczej jest z poleceniami przesyanymi wprost do modemu. Te koczy sekwencja kodw CR (powrt kursora do pocztku linii, 0x0A) oraz LF (nowa linia, 0x0C). Reasumujc kady tekst wywietlany lub przetwarzany koczy kod 0x00 a kady tekst przesyany jako stay do modemu, kocz kody CR-LF. Ten sposb zapamitywania danych stosowany jest konsekwentnie w caym programie. Wyjtkiem jest sposb w jaki przechowywane s kody zaczenia i wyczenia alarmu oraz kod PIN.

- Strona 2 z 14 -

http://www.easy-soft.tsnet.pl

Program gwny jest bardzo krtki. Na pocztku ustawiane s tryby pracy portw B i D. Do rejestru DDRB wpisywana jest warto 0xFF, co oznacza, e wszystkie wyjcia maj zaczone rezystory pull-up i pracuj jako wyjciowe. Do rejestru DDRD wpisywana jest warto 0xC0, ktra ustawia bity 6 i 7 portu D jako wyjciowe a pozostae jako wejciowe. Tu jedna uwaga. Linia TXD portu C (bit 1) pracuje jako wyjciowa, jednak wpisanie do rejestru DDRD 1 na pozycj odpowiedni dla tego bitu powoduje, e pracuje ona jako zwyky port wyjciowy i traci swoj funkcj jako TXD. Aby linia ta pracowaa poprawnie jako wyjcie interfejsu UART, naley do DDRD na pozycji 1 wpisa 0 lub pozostawi stan taki, jaki jest po zaczeniu zasilania. Nastpne linie programu ustalaj czstotliwo z jak wywoywane bd przerwania Timera 0 i 1. Ten pierwszy to licznik 8-bitowy generujcy przerwanie po zliczeniu 255 impulsw. 256 impuls zegarowy ustawia flag przepenienia OVF0 i powoduje przejcie do obsugi przerwania. Przy czstotliwoci rezonatora kwarcowego 7,3728MHz, preskalerze ustawionym na warto 1024 oraz pocztkowej wartoci licznika 0 (licznik Timera 0 liczy w gr), przerwania bd wywoywane z czstotliwoci 7372800 : 1024 : 256 = 28,125 Hz. Timer 1 rwnie ma preskaler ustawiony na warto 1024, jednak do rejestrw wpisywana jest warto inicjujca, od ktrej Timer zlicza impulsy zegarowe w gr, a do przepenienia. Timer 1, w odrnieniu od Timera 0, jest 16bitowy, tote liczy do wartoci 65535. Impuls numer 65536 powoduje przepenienie, ustawienie flagi OVF1 i przejcie do procedury obsugi przerwania. Tu przerwanie wywoywane jest z czstotliwoci 7372800 : 1024 : (65535 58335) = 1 Hz. Przerwania s zablokowane po uruchomieniu mikrokontrolera, jednak pozostawiony na wszelki wypadek rozkaz CLI wycza je i blokuje a do momentu, gdy konieczne bdzie ich uycie. Zostawmy na razie procedury obsugi przerwa bdzie jeszcze okazja do nich wrci. Od etykiety STATUS_CHECK rozpoczyna si cz programu majca za zadanie rozpoznanie trybu, w ktrym znajdowa si mikrokontroler przed wyczeniem napicia zasilania. Wywoywana zostaje funkcja odczytujca bajt spod adresu 0x00 w pamici EEPROM. Warto tego bajtu odpowiada statusowi urzdzenia. Jeli komrka ta zawiera warto rn od 0xF0 lub 0x0F, to program uznaje, e jest to pierwsze zaczenie alarmu i zada wykonania wszystkich niezbdnych nastaw, to jest: podania kodu zaczenia i wyczenia, podania kodu PIN dla uywanej karty SIM, wprowadzenia numeru telefonu oraz opisw dla lokalizacji alarmu i wej czujnikw. Wybrana metoda sprawdzenia statusu urzdzenia jest o tyle pewna, e kady zapis programu do pamici FLASH mikrokontrolera AT90S2313 powoduje usunicie zawartoci EEPROM (cay EEPROM zostaje zapisany wartoci 0xFF). Po wprowadzeniu nastaw do komrki STATUS zostaje zapisana warto odpowiednia dla stanu wyczenia alarmu. Powimy teraz kilka chwil wysyanym do modemu rozkazom i ich znaczeniu. Interfejs UART pracuje z szybkoci 9600 bitw na sekund. Identyczn prdko powinnimy ustawi w posiadanym telefonie, czy modemie. Aby dokona niezbdnych nastaw naley przy pomocy dowolnego programu terminala nawiza poczenie z modemem i wyda polecenie AT+IPR=9600;&W. Ustawi ono i zapisze w pamici konfiguracji modemu parametr prdkoci transmisji. W przypadku uycia telefonu GSM moe si okaza, e nie zaakceptuje on wyej wymienionej komendy. Wwczas prawdopodobnie atwiej bdzie nam zmieni prdko z jak pracuje UART mikrokontrolera, anieli telefonu. Mona to zrobi poprawiajc funkcj uart_init a konkretnie warto wpisywan do rejestru UBRR. Naley dobra j w zalenoci od uywanego rezonatora i wymaganej prdkoci transmisji. Gotowe przykady mona znale w notach aplikacyjnych na stronie producenta http://www.atmel.com lub wyliczy samodzielnie na podstawie wzorw znajdujcych si w kartach katalogowych mikrokontrolerw AVR. Gdy sprawdzimy, e modem (telefon) gotowy jest do pracy i komunikuje si poprawnie uywajc prdkoci 9600 bps, moemy podczy go do naszego ukadu. Jako pierwsz program sterujcy wysya komend ATZ. Powoduje ona ustawienie domylnego trybu pracy przywrcone zostaj rwnie wszystkie te parametry, ktre nie zostay zapamitane na stae jako domylne. Nastpny rozkaz wprowadza numer PIN waciwy dla karty na przykad: AT+CPIN=9889. Kod PIN to haso, ktrego rola polega na zabezpieczeniu telefonu GSM przed niepowoanym dostpem. Tutaj szczerze powiedziawszy troch przeszkadza ale niestety jest wymagany w celu uruchomienia modemu. Jako kolejne wysyane s polecenia ATE0 wyczajce tzw. echo komendy oraz AT+CPMS=SM ustawiajce miejsce przechowywania wiadomoci SMS na kart SIM. Jednoczenie z przyjmowaniem tych polece modem wcza si do sieci. W przypadku modemu WAVECOM gotowo do pracy sygnalizowana jest przez migoczc z czstotliwoci okoo 1 Hz diod LED, w przypadku SIEMENS MT20 jest odwrotnie dioda LED zawieca si na stae. Po kadym poleceniu wysanym do modemu wywoywana jest funkcja gets odbierajca cig znakw z UART. Oczekiwane jest, e modem odpowie co najmniej wysyajc kody CR i LF. W przypadku braku odpowiedzi od modemu, program przestanie pracowa ju w fazie inicjacji. Mona w ten sposb atwo stwierdzi, e brak jest poprawnej cznoci z modemem. Niestety, nie wykonaem w programie detekcji odczenia modemu. W przypadku, gdy modem zostanie odczony tu przed wysaniem SMS z powiadomieniem o zaczeniu alarmu, alarm zostanie wczony a nastpnie program bdzie oczekiwa na poczenie z modemem i odpowied na przesane polecenia. Jeli jej nie otrzyma zawiesi si sprawdzajc w nieskoczono stan flagi gotowoci do odbioru znaku (bajtu) z UART. Od etykiety main rozpoczyna si gwna ptla programu. Na jej pocztku ponownie odczytywany jest bajt statusu i w zalenoci od jego wartoci podejmowana jest odpowiednia akcja. Polega ona bd to na wywoaniu procedury obsugi alarmu w stanie czuwania, bd to obsugi alarmu w stanie wyczenia. Stan wyczenia. Za jego obsug odpowiedzialna jest funkcja alarm_off. Po jej wywoaniu czyszczony jest ekran wywietlacza LCD a nastpnie wywietlona zostaje informacja z pamici ROM umieszczona w niej pod nazwami symbolicznymi whenoff oraz set_1. Ta pierwsza umieszczona zostaje w 1 linii ekranu ja zadeklarowaem j jako ALARM WYCZONY. Ta druga umieszczona w 2 linii LCD, to pytanie o kod wyczenia. Zadeklarowaem j jako Kod wyczenia?. Pniej zmiennej visible nadana zostaje warto UCANTSEE a zmiennej sensors warto SENSOROFF. Po wyej wymienionych operacji, wywoywana jest funkcja odczytu kodu wprowadzanego przy pomocy klawiatury. Kod jest zawsze 4 cyfrowy. Rezultat pracy funkcji zwracany jest w rejestrach o nazwach symbolicznych cchar1 do cchar4. Uwaga: kod zaczenia musi by inny ni 0000. Jest on zarezerwowany do wprowadzenia urzdzenia w tryb serwisowy!

- Strona 3 z 14 -

http://www.easy-soft.tsnet.pl

Funkcja compare_codes porwnuje 4 bajty pobrane z pamici EEPROM spod adresu podanego w rejestrze eeaddr z tymi odczytanymi z klawiatury. Jeli kod wprowadzony jest identyczny z zapamitanym, do komrki zawierajcej bajt statusu w EEPROM, zapisana zostaje warto informujca program o tym, e alarm jest zaczony i nastpuje powrt do programu gwnego. Teraz na podstawie zawartoci komrki status pamici EEPROM, wywoana zostaje funkcja obsugujca stan zaczenia alarmu. Stan zaczenia. Cao funkcji zwizanych ze stanem czuwania alarmu umieszczona jest w podprogramie pod etykiet alarm_on. Po wejciu do podprogramu zaczane jest przerwanie Timera 1. Fragment programu zawierajcy kod jego obsugi, umieciem na listingu 1. Procedura ta ma do wykonania dwa podstawowe zadania. Ma zwikszy warto zmiennej - licznika goon oraz odwiey zawarto rejestrw licznika Timera 1. Do tych dwch zada dodaem jeszcze trzecie krtki, trwajcy okoo 1 milisekundy, bysk diody LED. Sygnalizuje ona w ten sposb, e odmierzany jest czas do zaczenia. Ptla rozpoczynajca si od etykiety al_on_wait trwa dokadnie tyle czasu odmierzanego w sekundach, ile podano w staej DELAYTIME. Jako typow warto zadeklarowaem 30 sekund. Jest to czas, przed upywem ktrego osoba zaczajca alarm musi si oddali z obszaru zadziaania czujnikw.

;----------------------------------------------------------------------------;obsuga przerwania timera 1 ;odmierzanie czasu opnienia do zadziaania alarmu ;----------------------------------------------------------------------------tim1_irq: sbi portb,ALARMOUT ;zaczenie diody LED (migotanie w czasie "ALARMDELAY") push temp ;przechowanie zawartoci "temp" na stosie ldi temp,TIM1RLDH out TCNT1H,temp ldi temp,TIM1RLDL out TCNT1L,temp ;odwieenie zawartoci Timer'a 1 inc goon ;zwikszenie licznika "goon" ldi temp,0xFF tim1_loop: rcall delay1ms ;opnienie czasowe aby migotanie LED byo widoczne pop temp cbi portb,ALARMOUT ;wyczenie diody LED reti Listing 1. Procedura obsugi przerwania Timera 1. Po upywie tego czasu, rozkaz CLI wycza obsug przerwa a przerwanie pochodzce od Timera 1 jest blokowane. Teraz wywietlony zostaje komunikat o zaczeniu alarmu (whenon i set_2) a nastpnie do rejestru kontrolnego przerwa (TIMSK) wprowadzana jest nastawa zaczajca przerwanie na skutek przepenienia Timera 0. Jest ono odpowiedzialne za odpytywanie stanu czujnikw (sensorw) alarmu. Rozkazy skadajce si na procedur obsugi umieciem na listingu 2. Ze wzgldu na pozorn zoono powiemy jej troszeczk uwagi.

;----------------------------------------------------------------------------;obsuga przerwania timera 0 ;odpytywanie wej alarmu ;----------------------------------------------------------------------------tim0_irq: push temp ;zapamitanie "temp" na stosie cbi portd,HIGHNIBBLE ;odczyt modszej powki bajtu wej czujnikw nop ;przerwa na czasy propagacji ukadw nop in temp,pind ;odczyt modszej powki bajtu asr temp ;"dopasowanie" bitw asr temp mov sensors,temp sbi portd,HIGHNIBBLE nop ;przerwa na czasy propagacji ukadw nop in temp,pind ;odczyt starszej powki bajtu asr temp ;"dopasowanie" bitw asr temp andi temp,0x0F swap temp or sensors,temp pop temp reti Listing 2. Procedura obsugi przerwania Timera 0.

- Strona 4 z 14 -

http://www.easy-soft.tsnet.pl

Rozkaz push temp przechowuje warto rejestru temp na stosie. Nastpnie zerowany jest bit 6 portu D oznaczony na schemacie jako DIR. Warto 0 tego bitu oznacza, e odczytane zostan czujniki podczone do wej 1A, 2A, 3A i 4A mikrokontrolera. Tworz one modsz powk bajtu stanu czujnikw. Jest ona odczytywana z rejestru PIND, przesunita dwukrotnie w prawo (dwa polecenia asr temp) i zostaje zapamitana w zmiennej sensors. Nastpnie, po ustawieniu stanu wysokiego na wyprowadzeniu PORTD.6, pobrany zostaje starsza poowa bajtu stanu czujnikw, przesunita dwukrotnie w prawo i zsumowana z modsz. Wynik sumowania zostaje zapamitany w zmiennej sensors. Po odtworzeniu wartoci temp rola procedury koczy si. Inne funkcje sprawdzaj odczytany stan czujnikw i podejmuj odpowiedni akcj. W przypadku stwierdzenia na jednym z wej informacyjnych mikrokontrolera (PD2..PD5) stanu niskiego, rola przerwania Timera 0 koczy si zostaje ono zablokowane. Dalsze przegldanie czujnikw nie jest potrzebne. Ponownie zerowany jest licznik czasu goon i zaczone zostaje przerwanie Timera 0 tym razem odmierzajc czas upywajcy od momentu zadziaania czujnika do momentu zaczenia alarmu. Ponownie jest to czas podany w sekundach o wartoci DELAYTIME. Opnienie zostao wprowadzone po to, aby uytkownik mia moliwo wprowadzenia kodu wyczajcego alarm. Procedura alarm_on, sprawdza kod wyczenia wprowadzany przez uytkownika podobnie jak poprzedniczka. W ten sam sposb koczy prac ustawiajc bajt statusu urzdzenia w EEPROM i powracajc do gwnej ptli programu w przypadku zgodnoci wprowadzonego kodu z tym zapisanym w EEPROM. Ponownie jak poprzednio decyzj o podejmowanej przez urzdzenie akcji podejmuje gwna ptla programu na podstawie zawartoci komrki pamici zawierajcej bajt statusu urzdzenia. W zwizku z tym, e jest to pami, ktra nie traci zawartoci po wyczeniu napicia zasilania, urzdzenie po odczeniu i ponownym podczeniu napicia zasilania zostanie wprowadzone w ten sam stan, w ktrym znajdowao si przed wyczeniem. Odczyt kodu. Ramy tego artykuu s troch zbyt szczupe aby omwi blisko 1,5 tysica linii programu napisanego w jzyku asemblera. Niestety w zwizku z tym pewne aspekty bd pominite i dociekliwy Czytelnik musi sam przeanalizowa kod rdowy programu tak, aby dotrze do pewnych szczegw. Jedn z takich dwch trudnych procedur jest funkcja odczytu kodu wprowadzanego z klawiatury. Zwaszcza kilka pocztkowych linii wymaga dokadniejszego omwienia. Umieciem je na listingu 3. . . read_code_loop: brid read_code_next

mov

temp,sensors

;jeli przerwania s wyczone, przejd do odczytu ;klawiatury ;i nie sprawdzaj stanu sensorw ;sprawdzenie stanu czujnikw!!! konieczne tutaj, ;bo funkcja nie przerywa pracy do momentu odczytu ;penego, 4-cyfrowego kodu ;jeli aden sensor nie jest aktywny omi ;ponisze rozkazy ;jeli flaga T jest ustawiona, to nie wykonuj ;nastaw przerwania Timera 1 ;wyczenie przerwa ;kasowanie licznika czasu opnionego zaczenia ;(pracuje w przerw.Timer'a 1)

cpi breq brts cli clr

temp,SENSORSOFF read_code_next read_code_act

goon

ldi temp,0x80 out TIMSK,temp ;zaczenie przerwa Timer'a 1 (co 1 sek.) sei ;zaczenie przerwa read_code_act: set ;ustawienie flagi "T" push zl ;przechowanie wskanika do bufora w RAM rcall alarm_active pop zl read_code_next: rcall kbd_read ;odczyt klawiatury, znak zwracany w zmiennej char . . Listing 3. Fragment funkcji odczytu kodu read_code. Od etykiety read_code_next rozpoczyna si waciwa procedura rozpoznawania wcinitych klawiszy i nadawania wartoci komrkom cchar1... cchar4. Pamitajmy o tym, e funkcja jest uniwersalna i wykorzystywana zarwno w trybie wyczenia alarmu jak i w trybie zaczenia. Tryby te rni si pomidzy sob przede wszystkim tym, e w stanie zaczenia aktywne jest przerwanie Timera 0 przegldajce stan czujnikw. W zwizku z tym rozkaz brid read_code_next powoduje natychmiastowe przejcie do funkcji interpretacji klawiszy wwczas, gdy nie jest zaczona obsuga przerwania. Zrobiem tak po to, aby warto zmiennej sensors nie wpywaa na stan alarmu. Dlaczego? Przeledmy dalsze linie programu. Sekwencja rozkazw mov temp,sensors cpi temp,SENSORSOFF sprawdza, czy ktry z czujnikw alarmu jest aktywny. Obojtnie czy w stanie wyczenia, czy zaczenia podejmowana jest akcja na podstawie stanu zmiennej sensors! W zwizku z tym moliwe jest uaktywnienie sygnalizacji dwikowej i powiadomienia SMS w stanie wyczenia alarmu. Omawiane wczeniej polecenie brid ma urzdzenie przed tym uchroni.

- Strona 5 z 14 -

http://www.easy-soft.tsnet.pl

Rwnie w tej funkcji konieczne jest jednokrotne zainicjowanie wartoci goon i zaczenie przerwa Timera 1 w celu odmierzania czasu opnionego zaczenia. Inicjacja przeprowadzana jest w zalenoci od stanu flagi T. Rozkaz brts read_code_act omija polecenia nadajce wartoci zmiennym w przypadku, gdy flaga jest ustawiona. Polecenia set ustawia flag T po przeprowadzeniu inicjalizacji. Zaczenie alarmu. Na listingu 4 umieciem fragment kodu rdowego programu odpowiedzialny za obsug uaktywnienia alarmu. Rozpoczyna si ona od etykiety alarm_active zestawem rozkazw testujcych stan zmiennej goon odmierzajcej czas do zaczenia alarmu. Jeli warto goon jest mniejsza lub rwna DELAYTIME, to nie jest podejmowana adna akcja. Jeli warto goon jest wiksza od DELAYTIME, rozkaz sbi portb,ALARMOUT zacza sygnalizacj dwikow a polecenie rcall send_SMS wywouje podprogram wysyajcy SMS pod zaprogramowany i zapamitany w EEPROM numer telefonu. SMS bdzie wysany, o ile bit 0 zmiennej sms_sent nie jest ustawiony. Dodatkowo blokowane s przerwania, co powoduje zaniechanie sprawdzania stanu czujnikw oraz odmierzania czasu. Alarm pozostaje zaczony do momentu wprowadzenia kodu wyczenia lub odczenia napicia zasilania.

;----------------------------------------------------------------------------;alarm aktywny - sygnalizacja dwikowa, powiadomienie za pomoc SMS, ;oczekiwanie na kod wyczenia ;----------------------------------------------------------------------------alarm_active: mov temp,goon subi temp,DELAYTIME ;sprawdzenie,czy upyn ju czas opnienia brsh active_and_on rjmp active_exit active_and_on: cli ;wyczenie przerwa - ju nie s potrzebne sbi portb,ALARMOUT ;zaczenie wyjcia alarmu tst smssent ;jeli wysyano ju SMS,to nie wysyaj powtrnie brne active_exit rcall send_SMS ;wysanie sms z powiadomieniem active_exit: ret Listing 4. Procedura obsugi zaczenia alarmu. Wysyanie SMS. Wysyanie wiadomoci SMS przez mikrokontroler to pytanie bardzo czsto pojawiajce si w listach kierowanych do Redakcji oraz na grupach dyskusyjnych w Internecie, dlatego te powic mu nieco czasu. Oba z posiadanych przez mnie modemw GSM obsuguj dwa tryby przesyania wiadomoci SMS. Tryby te oznaczone s numerami 0 i 1. Odpowied Twojego telefonu lub modemu na rozkaz AT+CMGF? lub AT+CMGF=? bdzie zawiera list obsugiwanych trybw pracy. Ja dla swojej aplikacji wybraem tryb 1, wygodniejszy i wol nie wyraa swojej opinii na temat kodowania wiadomoci w trybie 0, zwanym rwnie PDU mode. Podane poniej informacje opracowane zostay na podstawie dokumentacji firmy SIEMENS dla modemu GSM M20. Zainteresowanym poszerzeniem swojej wiedzy na ten temat odsyam szczeglnie do czterech rde: 1. Dokumentacji modemu M20 SIEMENS dostpnej na stronie producenta pod nazw sms_guid_v1_0.doc. Autorem jest T.Schuh 2. Noty aplikacyjnej umieszczonej pod adresem http://www.mcselec.com/an_31.htm . Autorem jest Vilko Susti. 3. Noty aplikacyjnej umieszczonej pod adresem http://www.mcselec.com/an_117.htm. Autorem jest Warren Read. 4. Informacji zawartych na stronie internetowej http://www.dreamfabric.com/sms/ Mode 0 (PDU). W tym trybie na twrc aplikacji spada obowizek zakodowania caej informacji dotyczcej wysyanej wiadomoci. Spjrzmy na przykad zaczerpnity z materiaw firmy SIEMENS przesyajcy wiadomo o treci THE BIG BROWN FOX pod numer telefonu +991234567.

- Strona 6 z 14 -

http://www.easy-soft.tsnet.pl

03

91

0100

11

00

09

91

99214365F7

00

00 Schemat kodowania danych

FF Okres wanoci SMS

11

546411244C1E4142E9F3EA94199F58

Dugo pola SCA

Pole numeru SCA

Numer odbiorcy wiadomoci SMS

Dugo numeru odbiorcy

Dugo tekstu Szesnastkowo podana liczba bajtw oktetw tekstu

Pierwszy oktet

Identyfikator protokou

Typ numeru

Typ SCA

Podobnie jak w przypadku typu SCA 91 lub 81

Pierwszy oktet statusu wiadomoci SMS (11H to warto typowa dla wikszoci wiadomoci)

Numer odbiorcy SMS: cyfry s zamieniane miejscami a w przypadku gdy zawiera on nieparzyst liczb cyfr, na kocu dodawane jest F. (123 123F 21F3)

Numer odniesienia dla wiadomoci SMS. Naley wprowadzi warto 0

THE BIG BROWN FOX 0x00 alfabet domylny, 7-bitowe znaki ASCII

Dugo pola numeru centrum usug w bajtach (mona poda 00)

Wyjanijmy znaczenie poszczeglnych pl wiadomoci SMS. 1. Dugo pola SCA jest opcjonaln dla niektrych telefonw. Jest to podana szesnastkowo liczba oktetw numeru Centrum Usug. Wikszo telefonw umoliwia wprowadzenie w tym miejscu wartoci 0x00, wic nie trzeba podawa i tym samym zna tego parametru. 2. Typ numeru Centrum Usug podanie wartoci 91 oznacza numeracj midzynarodow (np. z prefix +48 dla Polski), 81 to numeracja lokalna, obowizujca na terenie danego kraju 3. Numer Centrum Usug to numer podany przez operatora, dziki ktremu moliwe jest przesyanie wiadomoci SMS. Np. dla sieci Plus GSM jest to numer +48601000100, Zwrmy uwag na sposb kodowania tego numeru. Na przykad numer 601 000100 zakodowany bdzie w sposb nastpujcy: Numeracja krajowa, bez numeru kierunkowego: 81 Nieparzysta liczba znakw na kocu dodawana jest litera F, wic numer przyjmie posta 601000100F Numer po kodowaniu bdzie wyglda nastpujco: 06010010F0. 4. Pierwszy oktet komunikatu SMS Numer bitu Nazwa bitu 7 TP-RP 6 TP-UDHI 5 TP-SRR 4 TP-VPF 3 TP-VPF 2 TP-RD 1 TP-MTI 0 TP-MTI

TP-RP cieka (numer) nadawcy; ustawienie bitu oznacza, e cieka dla odpowiedzi na wysany SMS jest ustawiona TP-UDHI ustawienie bitu oznacza, e przesyane dane uytkownika rozpoczynaj si od nagwka identyfikujcego TP-SRR ustawienie tego bitu oznacza, e nadawca da raportu na temat odbioru wiadomoci SMS przez odbiorc TP-VPF bity okrelajce format okresu wanoci wiadomoci SMS: - 0 0 : TP-VPP nieobecne - 1 0 : TP-VPP obecne, format relacyjny (0..143 = (warto parametru + 1) x 5 minut, 144..167 = 12 godzin + (warto parametru - 143) x 30 minut, 168..196 = (warto parametru 166) x 1 dzie, 197..255 = (warto parametru 192) x 7 dni) - 0 1 : format rozszerzony, 7 oktetw - 1 1 : format absolutny, 7 oktetw TP-RD ustawienie bitu powoduje, e duplikaty wiadomoci s odrzucane TP-MTI typ komunikatu: warto bitw 0 1 powoduje, e wiadomo przesyana jest w trybie SMS-SUBMIT

- Strona 7 z 14 -

0xFF = 255 192 tygodnie = 63 tygodnie

91 numeracja z numerem kierunkowym kraju, 81 bez numeru kierunkowego

0100 = 1000 (zamieniona pozycja cyfr)

0x00 dostarcz jako normalny SMS

Dugo numeru odbiorcy w bajtach

Tekst

http://www.easy-soft.tsnet.pl

5. 6. 7. 8. 9. 10. 11. 12. 13.

Pole statusu okrelajce numer odniesienia dla wysyanego komunikatu; wpisanie wartoci 0x00 powoduje, e numer telefonu, z ktrego wysyamy SMS jest rwnoczenie numerem odniesienia. Dugo numeru odbiorcy SMS, podana w iloci bajtw numeru. Typ numeru odbiorcy SMS (81 lub 91). Numer odbiorcy wiadomoci SMS (kodowany w ten sam sposb, co numer Centrum Usug). Identyfikator protokou komunikacyjnego. Wartoci typow, uywan przez wikszo sieci telefonw komrkowych jest 0x00. Schemat kodowania danych. Wprowadzona warto 0x00 oznacza, e znaki kodowane s w postaci 7bitowych znakw ASCII. Okres wanoci wiadomoci SMS. Liczba podana i interpretowana zgodnie z kodem reguy podanym przez bity TP-VPF. Liczba oktetw bajtw tekstu. Tekst wiadomoci

Wiadomo SMS zgodnie ze specyfikacj organizacji ETSI (http://www.etsi.org) moe mie do 160 znakw dugoci, gdzie kady znak zakodowany jest w postaci kodu 7-bitowego. Znaki o kodach dugoci 8-bitw zazwyczaj nie s przez telefony wywietlana, natomiast czasami uywane s jako sterujce (przesyanie obrazw, dzwonkw itp.). Komunikaty zakodowane w postaci liczb 16-bitowych (maksymalnie 70 znakw) uywane s do przesyania komunikatw zakodowanych wedug standardu UNICODE (UCS2) i mog by wywietlane przez wikszo aparatw GSM. Niektre z telefonw wywietlaj te komunikaty jako FLASH SMS. My zajmiemy si kodowaniem standardowym, gdy kody znakw maj dugo 7 bitw. Przeledmy sposb kodowania tekstu na przykadzie: zakodujmy wiadomo ELEKTRONIKA. Tekst ELEKTRONIKA zawiera 11 znakW nazywane septetami ze wzgldu na sw dugo 7 bitw. My musimy zmieni sposb kodowania z septetw na oktety znaki o dugoci 8 bitw. E L E K T R O N I K A 0x45 0x4C 0x45 0x4B 0x54 0x52 0x4F 0x4E 0x49 0x4B 0x41 1000101 1001100 1000101 1001011 1010100 1010010 1001111 1001110 1001001 1001011 1000001 1000101 1001100 1000101 1001011 1010100 1010010 1001111 1001110 1001001 1001011 1000001 Pierwszy septet (E) zamieniany jest na oktet poprzez zabranie najmniej znaczcego bitu nastpnego w kolejnoci znaku i wprowadzenie go na pozycj bitu 7 (0 + 1000101 = 01000101 0x45). Po tej operacji bit jest usuwany, wic nastpne przeksztacenie (L) zabierze dwa bity z kolejnego znaku, kolejne trzy i tak dalej. W konsekwencji znak smy zostanie cakowicie usunity. Dla znaku numer dziewi proces rozpocznie si od pocztku. 01000101 01100110 01110001 01001001 10010101 00111110 10011101 0x45 0x66 0x71 0x49 0x95 0x3E 0x9D 11001001 01100101 00010000 0xC9 0x65 0x10

Jako przykad zakodowan wiadomo ELEKTRONIKA i wylijmy na numer sieci PLUS. Centrum wiadomoci (SCA) ma tutaj numer +48601000310. Przelijmy wiadomo na numer +48605010203. 1. Dugo pola SCA (w tym przypadku 7 bajtw, z polem typu SCA): 07 2. Typ SCA - numeracja midzynarodowa: 91 3. Numer SCA: 8406010013F0 4. Pierwszy oktet wiadomoci SMS: 11 5. Pole statusu: 00 6. Dugo numeru odbiorcy SMS (liczba bajtw): 07 7. Typ numeru odbiorcy numeracja midzynarodowa: 91 8. Numer odbiorcy: 8496959192F3 9. Identyfikator protokou: 00 10. Schemat kodowania: 00 11. Okres wanoci (1 tydzie): BF 12. Dugo tekstu: 0x0A 13. Tekst: 45667149953E9DC96510 Uff... Zbierzmy to w cao: 07918406010013F0110007918496959192F30000BF0A45667149953E9DC96510 Niestety oprcz znajomoci dugoci niektrych ze skadnikw wiadomoci, aby j wysa musimy jeszcze zna jej cakowit dugo. W naszym przykadzie wynosi ona 32 bajty. Zestaw polece, ktre musimy wyda modemowi aby wysa wiadomo, bdzie nastpujcy: 1. AT+CMGF=0 <CR> 2. AT+CMGS=32 <CR> 3. >07918406010013F0110007918496959192F30000BF0A45667149953E9DC96510 <CTRL+Z> Uwaga: wyej wymienione znaki s reprezentacj bajtw o wartoci zakodowanej szesnastkowo. Cyfra 32 jest dugoci przesyanej informacji podan w bajtach. Podany przykad kodowania jest waciwy dla informacji wprowadzanej przez interfejs komunikacyjny. Inaczej wysya si wiadomo, gdy numer Centrum Usug znajduje si na karcie czy te gdy wysyana jest wiadomo zapamitana w pamici telefonu lub karty SIM.

- Strona 8 z 14 -

http://www.easy-soft.tsnet.pl

Mode 1 (TEXT MODE). W przeciwiestwie do swojego poprzednika , tryb 1 zwany rwnie TEXT MODE jest bardzo atwy w uyciu. Ponisza sekwencja polece wysya identyczn wiadomo jak wyej w trybie tekstowym: 1. AT+CMGF=1 <CR> 2. AT+CMGS=+48605010203 <CR> 3. >ELEKTRONIKA<CTRL+Z><CR> Trybem tym posuyem si tworzc funkcj send_SMS. Niestety, nie wszystkie telefony GSM bd ten tryb obsugiwa. Funkcja wysyajca wiadomo SMS: send_sms. Na listingu 4 umieciem kod rdowy funkcji wysyajcej wiadomo SMS. Cz wiadomoci docierajcej do adresata jest staa, zdefiniowana w programie. Cz wiadomoci taka, jak lokalizacja obiektu i opis czujnika jest zmienna i moe by zdefiniowana przez uytkownika. Definicja zostaje zapamitana w pamici EEPROM i jest uywana przy kompozycji wiadomoci. Przeanalizujmy listing 4. send_SMS: ldi ldi rcall rcall ldi ldi ldi clr rcall ldi rcall ldi st rcall rcall ldi ldi ldi clr rcall ldi rcall ldi st clr send_SMS_sen: inc clc ror brcs mov rcall inc rcall ldi st rcall rcall inc ret Listing 5. Procedura wysyania wiadomoci tekstowej SMS. Jako pierwsze wysyane jest do modemu polecenie zapisane w pamici ROM zdefiniowane pod etykiet send_sms_1. Jest to polecenie zaczenia trybu tekstowego AT+CMGF=1. Uwaga! Zarwno polecenie wywietlajce list dostpnych trybw jak i zaczajce konkretny tryb pracy dziaa dopiero po wczeniu si telefonu do sieci. Kade polecenie musi by zakoczone znakiem CR (0x0D). Za przesanie polecenia z ROM odpowiedzialna jest funkcja o nazwie putf. Rni si ona od puts tym, e dane wysyane przez UART pobiera

zl,LOW(send_sms_1<<1) zh,HIGH(send_sms_1<<1) putf gets zl,LOW(send_sms_2<<1) zh,HIGH(send_sms_2<<1) yl,LOW(buffer) yh move_rom2ram eeaddr,SMSNUMBER_EEADDR ee_read2buf temp,0x22 y,temp st_EOL puts_buffer zl,LOW(send_sms_3<<1) zh,HIGH(send_sms_3<<1) yl,LOW(buffer) yh move_rom2ram eeaddr,SMSTEXT_EEADDR ee_read2buf temp,',' y,temp temp temp sensors send_SMS_sen eeaddr,temp sen_ee_addr yl ee_read2buf temp,0x1A y,temp st_EOL puts_buffer smssent

;Z = adres nastawy-polecenia w ROM ;wysanie polecenia ;pobranie odpowiedzi modemu ;Z = adres napisu w ROM ;Y = adres bufora w RAM ;tu adresy RAM mog by tylko 1-bajtowe ;przepisanie danych z ROM do RAM, ;adresy ROM w Z,RAM w Y ;teraz pobranie numeru telefonu z eeprom do "buffer", ;na ktry wskazuje Y ;uwaga: zmieniany jest rejestr Y ;cudzysw zamykajcy ;zapisanie znakw CR+LF do bufora ;wysanie zawartoci "buffer" przez UART ;teraz kompozycja SMS do wysania ;odczyt czci "staej" z ROM i EEPROM

;teraz odczyt opisu obiektu (30 znakw wprowadzone przez uytkownika) ;do temp kod przecinka ;zapisanie go w buforze ;wyliczenia adresu etykiety i jej odczyt (jeli czujnik ;jest aktywny,to bit ;przyjmuje warto "0") ;kasowanie flagi "carry" ;przeniesienie najmodszego bitu do C ;jeli C jest "1",to wejcie nie jest aktywne ;wyznaczenie adresu w eeprom ;odczyt etykiety wejcia do bufora w RAM ;zapamitanie znaku "Ctrl+Z" ;zapisanie kodw CR+LF ;wysanie zawartoci "buffer" przez UART ;ustawienie znacznika wysania SMS

- Strona 9 z 14 -

http://www.easy-soft.tsnet.pl

z ROM a nie bufora w pamici RAM. W nastpnej kolejnoci przesyany jest do modemu numer telefonu, ktrego staa cz zdefiniowana jest pod etykiet send_sms_2 a zmienna, wprowadzana przez uytkownika, pobierana jest z EEPROM. Polecenie zawierajce numer telefonu adresata wiadomoci komponowane jest w pamici RAM i przesyane do modemu przez funkcj puts. Podobnie tworzona jest wiadomo tekstowa: komponowana w RAM z czci staej send_sms_3, tekstu lokalizacji obiektu wprowadzonej przez uytkownika oraz etykiety czujnika wyliczanej na podstawie zawartoci zmiennej sensors (zmienna ta przesuwana jest w prawo z uyciem flagi przeniesienia C do momentu a flaga ta zostanie wyzerowana; logiczne 0 oznacza stan aktywny czujnika liczba przesuni liczona wskazuje na numer wejcia). Tekst musi by zakoczony znakiem CTRL+Z. Jest to dobrze znany nam znak koca zbioru tekstowego o kodzie 26 (0x1A). Monta. Cao zmontowana zostaa na dwch pytkach jednostronnych: po jednej dla klawiatury i ukadu sterujcego. Konstrukcja alarmu jest bardzo prosta a jej monta nie powinien sprawia trudnoci nawet pocztkujcemu elektronikowi. Monta rozpoczynamy od wlutowania czwek ja wykonywaem je przy pomocy drutu srebrzanki. Pniej elementy bierne rezystory i kondensatory, pprzewodniki a na kocu ukad mikrokontrolera. Mikrokontroler nie musi by zaprogramowany. Dolutowujc do jego wyprowadze zcze mona zaprogramowa go ju w ukadzie. Tak wanie uruchamiaem swj ukad. Rezystory R1 do R8 naley dobra w zalenoci od posiadanych czujnikw. Warto 1k jest waciw dla napicia wejciowego od 9 do 12V i transoptorw LTV849. Dla PC849 firmy SHARP mona uy rezystorw o wikszej wartoci. Warto rezystancji mona oszacowa na podstawie wzoru: (Napicie czujnika 1,5) : 0,01 = Rezystancja w Ohm Program napisany zosta w taki sposb, e za aktywny uwaany jest stan, gdy na wejciu pojawi si napicie. W przypadku odwrotnym wymagane jest zanegowanie wartoci zmiennej sensors po odczycie czujnikw. W takiej sytuacji wystarczy w procedurze obsugi przerwania Timera 0 na kocu doda polecenie neg sensors. Zarwno klawiatura jak i wywietlacz podczone zostay z uyciem zcz zaciskanych o nazwie IDC. Wywietlacz wymaga zcza o 16 wyprowadzeniach, klawiatura o 10. Oczywicie zcza mona zastpi przewodami. Stabilizator 7805 dobrze jest umieci na niewielkim radiatorze. Jego temperatura bdzie zalee bardzo mocno od modelu uytego wywietlacza oraz doprowadzonego napicia wejciowego. Ja uyem zgodnego z LCD wywietlacza VFD, ktry charakteryzuje si dosy duym poborem prdu i przez to stabilizator bardzo mocno nagrzewa si w czasie pracy (wywietlacz pobiera okoo 0,3A co przy napiciu zasilajcym 12V daje moc tracon przeszo 2W). Ukad powinien by zasilany napiciem staym o wartoci co najmniej 8V i nie wicej ni 15V. Jeli chcemy wykorzysta modem GSM (na przykad WAVECOM), na pytce montujemy zcze DSUB-9 mskie (szpilki). Jest ono waciwe dla urzdzenia sterujcego transmisj. Do zcza tego wprost doczamy kabel modemu. Elementem wykonawczym jest przekanik z cewk na napicie 5V. W modelu uywaem przekanika firmy ITT o oznaczeniu RZ2H-5. Styki przekanika, podobnie jak wejcia czujnikw alarmu, wyprowadzone s przez zcza terminatory o rastrze 3,5mm (pod rubk) umoliwiajce wygodne podczenie i rozczenie ukadu. Karta SIM musi by przygotowana do pracy. To znaczy musi zawiera poprawny numer centrum serwisowego oraz by aktywna. Programowanie parametrw karty mona wykona bd to z uyciem programu terminala, bd to umieszczajc kart w zwykym telefonie GSM. Uytkowanie alarmu. Po pierwszym zaczeniu uytkownik musi przeprowadzi procedur nastaw. Prosz pamita o tym, e interfejs uytkownika jest bardzo skromny, poniewa ilo pamici programu, ktr dysponuje mikrokontroler rwnie jest bardzo maa. Jako pierwszy naley wprowadzi kod wyczenia alarmu. Moe i powinien on by inny od kodu zaczenia. Wprowadzamy 4 cyfry w tym momencie zmienna visible ma warto UCANSEE i mona odczyta wprowadzane znaki. Kod zawiera 4 cyfry, po ktrych wprowadzeniu uytkownik zostanie poproszony o akceptacj przez nacinicie klawisza ENTER (w prawym, dolnym rogu klawiatury) lub moliwe jest powtrne wprowadzenie innego (?) kodu po naciniciu klawisza CLR (rodek dolnego rzdu klawiatury). Pniej w identyczny sposb wprowadzamy kod wyczenia i numer PIN dla karty telefonu GSM. Teraz nastpuje pytanie o numer telefonu, na ktry wysyane bd SMS. Naley wprowadzi go cznie z numerem kierunkowym kraju, na przykad 48605010203. Procedura wprowadzania numeru telefonu jest wsplna z t przeznaczon do wprowadzania tekstu: dusze przytrzymanie klawisza powoduje wprowadzenie litery. Prosz zwrci uwag na to, aby wprowadzi wycznie cyfry. W przypadku pomyki, kasowanie jest moliwe przez nacinicie klawisza CLR. Numer zostaje zapamitany po naciniciu ENTER. Nastpnie uytkownik pytany jest o cz opisow dla SMS. Przeznaczona jest ona dla krtkiego opisu lokalizacji, na przykad JAGIELLOSKA 2/3. Mona wprowadzi do 28 znakw. Dodatkowo naley poda opisy dla wej poszczeglnych sensorw, na przykad 1 OKNO, 2 DRZWI itp. Zalecam aby wprowadzi cokolwiek, co pozwoli zidentyfikowa wejcie czujnika chociaby numer 1, 2, 3 itp. Na etykiet opis wejcia czujnika, przeznaczone jest 8 znakw. Jeli nie zostan wprowadzone adne dane tekstowe, program zapisze pod adresem acucha znakw w EEPROM znak jego koca. Mog si wwczas pojawi bdy przy kompozycji i wysyaniu wiadomoci SMS. Wprowadzanie tekstu koczy krtkie przycinicie klawisza ENTER. Prosz nie przytrzymywa go przez czas duszy ni 1 sekunda. Na rysunku 1 umieciem opis klawiatury. Tekst wprowadzany jest podobnie jak przy pisaniu wiadomoci SMS w telefonie komrkowym. Dusze przytrzymanie klawisza, powoduje wyprowadzenie kolejnych znakw. I tak dla

- Strona 10 z 14 -

http://www.easy-soft.tsnet.pl

przykadu pod klawiszem 1 ukryte s litery A, B i C oraz oczywicie cyfra 1. Zwolnienie klawisza powoduje przesunicie kursora na nastpn pozycj po upywie czasu okoo 1 sekundy. Po wprowadzeniu nastaw alarm przejdzie do pracy w trybie wyczonym. Podanie kodu zaczenia spowoduje, e odmierzony zostanie czas 30 sekund a nastpnie alarm przejdzie do trybu czuwania. W tym czasie wida migotanie diody LED co 1 sekund i pojawia si komunikat czekaj..., chocia bardziej na miejscu byby napis uciekaj!. Jest to jednak napis wsplny dla rnych funkcji, nie byo miejsca w pamici ROM na bardziej sugestywne komunikaty. Pojawienie si napicia na wejciu czujnika powoduje, e na kolektorze tranzystora pojawi si stan niski. Jest on interpretowany przez mikrokontroler jako uaktywnienie alarmu. Od momentu pojawienia si stanu niskiego CPU zaczyna odmierza czas 30 sekund i jeli w tym czasie nie zostanie wprowadzony kod wyczenia, zaczany jest przekanik oraz wysyane powiadomienia SMS. Alarm jest zaczony a do momentu odczenia napicia zasilania lub wprowadzenia kodu wyczenia. Podobnie jak poprzednio, odmierzanie czasu sygnalizowane jest przez migotanie diody LED. Gdy alarm znajduje si w trybie wyczenia, moliwe jest ponowne wprowadzenie nastaw. Nastawy wykonane poprzednio i zapisane w EEPROM s zamazywane a na ich miejsce zapisywane s nowe, wprowadzane przez uytkownika. Nie istnieje wic moliwo modyfikacji nastaw naley poda je wszystkie na nowo. Aby wej do trybu nastaw, w trybie wyczenia naley wpisa kod 0000 a nastpnie kod wyczenia alarmu. Po poprawnym jego podaniu, moliwe jest wprowadzenie nastaw. Uwagi. Urzdzenie alarmowe jest urzdzeniem amatorskim i jako takie nosi jego znamiona. Jest przykadem aplikacji wykorzystujcej modem lub telefon GSM do sygnalizacji. Wraz z urzdzeniem udostpniam rwnie rdo programu i zachcam do samodzielnych jego modyfikacji. Mona na przykad usun z programu moliwo wysyania w wiadomoci SMS etykiet opisw czujnikw a zaoszczdzone w ten sposb miejsce w pamici programu wykorzysta na implementacj lepszego interfejsu uytkownika lub innego sposobu kodowania wiadomoci ni TEXT MODE. Mona wreszcie pozby si procedur komunikacji z telefonem GSM i wykorzystywa urzdzenie jak zwyk centralk alarmow. Cao programu zostaa wykonana i skompilowana przy pomocy AVR STUDIO 4. Jest to kompletne rodowisko do pisania i uruchamiania aplikacji dla mikrokontrolerw AVR. Do linii RESET, MISO, MOSI i SCK mikrokontrolera przylutowaem zcze i przy wykorzystaniu programatora ISP programowaem i testowaem ukad. Jest to bardzo wygodna, nie tylko dla elektronika amatora, metoda. Pozwala na uruchamianie aplikacji w rzeczywistym rodowisku jej pracy. Program zajmuje 128 bajtw pamici EEPROM na zmienne definiowane przez uytkownika. Ich wykaz Mona znale w tabeli 2. Kod wynikowy po kompilacji zajmuje 1019 sw dwubajtowych, to jest 2038 z 2048 bajtw pamici programu AT90S2313. Niestety, nie ma ju zbyt wiele miejsca na implementacj nowych funkcji lub duszych komunikatw. Mona je wykona jedynie kosztem usunicia lub optymalizacji ju istniejcych. Jacek Bogusz jacek.bogusz@easy-soft.tsnet.pl
Wykaz elementw: pprzewodniki: U1 AT90S2313 U2 74LS157 U3 7805 U4 74HCT14 U5 MAX232 ISO1,ISO2 - PC849 SHARP (LTV849 LITEON) D1 dioda LED czerwona D2 dioda krzemowa redniej mocy, np. 1N4007 D3..D6 dioda krzemowa maej mocy, np. 1N4148 elementy bierne: Q1 kwarc 7,3728MHz R1..R8 1k R9..R11 10k R14, R16..R18 33R R19 560R R20 270R R21 750R PR1 10..22k C1,C2 22p C3 10u/16V C4..C8 1u/50V C9 100u/16V C10,C11 100n/63V C12 470u/25V Z1,Z2,X1..X8 X10 terminatory pod rubk o rastrze 3,5mm X9 komplet wtyk wlutowywany w pytk, IDC prosty, 16 wypr. + gniazdo zaciskane na przewodach X11 komplet wtyk wlutowywany w pytk, IDC prosty, 10 wypr. + gniazdo zaciskane na przewodach X12 zcze DSUB-9/M (mskie) X14 zcze dla telefonu komrkowego inne: SW1..SW12 - przyciski zwierne RL1 przekanik z cewk 5V, np. ITT RZ2H-5 LCD1 wywietlacz LCD 2x20

- Strona 11 z 14 -

http://www.easy-soft.tsnet.pl

Etykieta adresu

Adres zmiennej w EEPROM

Opis

STATUS_EEADDR

Komrka, w ktrej zapamitany jest status alarmu (zaczony = 0xF0, wyczony = 0x0F) ONCODE_EEADDR 0x01 Kod zaczenia alarmu w postaci 4 kodw znakw ASCII OFFCODE_EEADDR 0x05 Kod wyczenia alarmu w postaci 4 kodw znakw ASCII PINNUMBER_EEADDR 0x09 Numer PIN telefonu, rwnie 4 znaki ASCII SMSNUMBER_EEADDR 0x0D Numer telefonu, na ktry przesyane bd powiadomienia SMS; zmienna ma dugo 12 bajtw 11 na numer telefonu + 0x00 SENSOR1_EEADDR 0x1B Etykieta wejcia czujnika 1; zmienna ma dugo 9 bajtw 8 na opis + 0x00 SENSOR2_EEADDR 0x23 Etykieta wejcia czujnika 2, jak wyej SENSOR3_EEADDR 0x2C -//3 SENSOR4_EEADDR 0x35 -//4 SENSOR5_EEADDR 0x3E -//5 SENSOR6_EEADDR 0x47 -//6 SENSOR7_EEADDR 0x50 -//7 SENSOR8_EEADDR 0x59 -//8 SMSTEXT_EEADDR 0x62 Tekst komunikatu SMS przeznaczony do zidentyfikowania obiektu, na przykad ulica + numer domu; dugo 28 bajtw 27 na tekst + 0x00 Tabela 2. Wykaz adresw zmiennych umieszczonych w pamici EEPROM

0x00

;stae zwizane z wywietlaczem .equ ENABLE = 7 .equ REGSEL = 4 ;stae .equ .equ .equ .equ ;stae .equ .equ .equ .equ

;numer bitu portu b dla linii ENABLE wywietlacza LCD ;numer bitu portu b dla linii R/S wywietlacza LCD

zwizane z UART i tablicami danych CR = 0x0A ;kod znaku powrotu kursora LF = 0x0D ;kod znaku nowej linii EOF = 0x1A ;kod znaku koca zbioru tekstowego EOD = 0x00 ;koniec danych (tabeli, tekstu itp) zwizane z klawiatur COLUMN1 = 4 COLUMN2 = 5 COLUMN3 = 6 NOKEY = 0xFF

.equ .equ .equ .equ

CLRKEY ENTERKEY UCANSEE UCANTSEE

= 10 = 11 = 0xFF = 0x00

;numer bitu portu b 1 kolumny klawiatury ;numer bitu portu b 2 kolumny klawiatury ;numer bitu portu b 3 kolumny klawiatury ;jeli "char" zwracany przez funkcj odczytu klawiatury ;przyjmuje warto NOKEY, oznacza to, e nie jest ;wcinity aden klawisz ;umowny kod klawisza "CLR" ;umowny kod klawisza "ENTER" ;staa dla "visible" oznacza, e wprowadzane znaki ;mona czyta ;staa dla "visible" oznacza, e wprowadzanych znakw nie ;mona czyta (wywietlany jest znak zastpczy *) ;status alarmu - zaczony ;status alarmu - wyczony ;status alarmu sygnalizacja (nie uywany) ;bit wyjcia portu b sterujcy zaczeniem alarmu ;bit wyjcia portu D sterujcy wyborem powki bajtu ;warto zmiennej sensors oznaczajca, e aden ;z czujnikw nie jest aktywny (wyzwolony przez warunek ;alarmu) ;czas opnienia do zadziaania alarmu (w sekundach) ;stae do odwieania zawartoci Timer'a 1 (czstotliwo ;wywoywania przerwania to 1 Hz)

;stae stanu alarmu .equ ALARMON = 0x0F .equ ALARMOFF = 0xF0 .equ ALARMACTIVE = 0x55 .equ ALARMOUT = 6 .equ HIGHNIBBLE = 6 czujnikw .equ SENSORSOFF = 0xFF

.equ .equ .equ

DELAYTIME TIM1RLDH TIM1RLDL

= 30 = 0xE3 = 0xDF

;++++++++++++++++++++++++++++ ;teksty do wywietlenia ;++++++++++++++++++++++++++++ ;tekst powitania welcome1: .db "ALARM+SMS",EOD ;teksty statusu whenoff: .db whenon: .db ;teksty menu nastaw set_1: .db

"ALARM WYLACZONY",EOD "ALARM AKTYWNY",EOD

"Kod zalaczenia?",EOD

- Strona 12 z 14 -

http://www.easy-soft.tsnet.pl

set_2: set_3: set_4: set_5: set_6: set_ok: set_wait:

.db .db .db .db .db .db .db

"Kod wylaczenia?",EOD "Kod PIN modemu?",EOD "Telefon dla SMS?",EOD "Tekst SMS (30 zn.)?",EOD "Tekst wej. (8 zn.)?",EOD "ENTER=OK,C=popraw ",EOD "Czekaj...",EOD

;nastawy modemu GSM init_modem_1: .db init_modem_2: init_modem_3: init_modem_5: send_sms_1: send_sms_2: send_sms_3: .db .db .db .db .db .db

;ten tekst wysyany bdzie przez UART, dlatego ;koczy si CR+LF "AT+CPIN=",EOD ;ten tekst bdzie przetwarzany przed wysyk, ;dlatego koczy si EOD "ATE0",CR,LF "AT+CPMS=",0x22,"SM",0x22,CR,LF "AT+CMGF=1",CR,LF "AT+CMGS=",0x22,"+",EOD "ALARM ZALACZONY W OBIEKCIE ",EOD tablicy "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"

"ATZ",CR,LF

;tablica znakw do wprowadzania tekstu, naciniciu klawisza odpowiada znak z ;kolumna 1 zawiera znaki dla pojedynczego nacinicia, 2 dla podwjnego itd. chartable: .db '0', ' ', '/', '-' ;kody dla klawisza .db '1', 'A', 'B', 'C' ;kody dla klawisza .db '2', 'D', 'E', 'F' ;kody dla klawisza .db '3', 'G', 'H', 'I' ;kody dla klawisza .db '4', 'J', 'K', 'L' ;kody dla klawisza .db '5', 'M', 'N', 'O' ;kody dla klawisza .db '6', 'P', 'Q', 'R' ;kody dla klawisza .db '7', 'S', 'T', 'U' ;kody dla klawisza .db '8', 'V', 'W', 'Z' ;kody dla klawisza .db '9', 'Y', 'Z', '.' ;kody dla klawisza Listing 6. Wykaz staych uywanych w programie

;definicje zmiennych pomocniczych .dseg .def cchar1 = r02 .def cchar2 = r03 .def cchar3 = r04 .def cchar4 = r05 .def visible = r06 .def length = r07 .def sensors = r08 .def goon = r09 odmierzajca .def .def .def .def .def .def .def .def copypb = copypd = smssent = temp = delay1 = delay2 = delay3 = delay r10 r11 r12 r16 r17 r18 r19

;kod BCD znaku zwracanego przez funkcj "read_code" /1 ; j.w. /2 ; j.w. /3 ; j.w. /4 ;zmienna ma warto 1,gdy wprowadzany kod mona odczyta ;dugo wprowadzanego tekstu dla read_text ;stan sensorw (czujnikw) alarmu ;zmienna zwikszana o 1 co 1 sekund przez funkcja ;czas opnienia podczas obsugi przerwania Timera 1 ;przechowuje kopi portu b ;przechowuje kopi portu d ;warto rna od 0 oznacza, e SMS zosta wysany ;zmienna pomocnicza ;dla procedury delay ; - / / ;w niej podawany jest argument dla funkcji delaysec ;(w sekundach) ;gwna zmienna dla delay - w niej podawany jest argument ;dla funkcji delayms (w milisekundach) ;zmienna pomocnicza - ptle i iteracje ;bufor znakw dla lcd ;bajt do zapisu w eeprom ;adres zapisu bajtu w eeprom ;bufor dla pojedynczego znaku odbieranego / wysyanego

= r20

.def i = r21 .def char = .def eedata = .def eeaddr = .def sbuf = przez uart

r22 r23 r24 r25

;xp zawiera odcit, yp rzdn (definicja pokrywa si z "delay") .def xp = R17 .def yp = R18 Listing 7. Wykaz definicji rejestrw uywanych w programie (zmiennych)

- Strona 13 z 14 -

http://www.easy-soft.tsnet.pl

1 A B C (0x67)

2 D E F (0x57)

3 G H I (0x37)

4
4 J K L (0x6E)

5
5 M N O (0x5E)

6
6 P Q R (0x3E)

7
7 S T U (0x6D)

8
8 V W X (0x5D)

9
9, Y, Z, . (0x3D)

0 , / (0x6B)

CLR
(0x5B)

ENTER
(0x3B)

Rysunek 1. Klawiatura (na zielono oznaczono kody zwracane przez funkcj kbd_read.

- Strona 14 z 14 -

R9 X1 2 1 R1 1k 1 C1 22p 15 RST #A 5 ISO1A 16 2 X2 2 1 4 1k ISO1B 13 3 X3 2 1 R3 R11 10k R2 C2 22p VCC 4 XTAL2 Q1 7,3728MHz 1 U1 AT90S2313 RST XTAL1 PB0/AIN0 PB1/AIN1 PB2 PB3/OC1 PB4 PB5/MOSI PB6/MISO PB7/SCK PD6/ICP PD0/RXD PD1/TXD 12 13 14 15 16 17 18 19 11 2 3

R10 VCC

PC849

47k DB4 DB5 DB6 DB7 RS COL LED EN DIR RXD TXD DB4 DB6

47k PR1 10k 1 3 5 7 9 11 13 15

C3 10u

VCC

WYWIETLACZ LCD
2 4 6 8 10 12 14 16 RS EN X10 DB5 DB7 2 1 VCC VDD VCC U3 7805 3 VOUT VIN GND 1 C9 100u X11 VSS 2 4 6 8 10 ZLACZE 2-10 C10 0,1u 2 C11 0,1u C12 470u

VCC

14

#B

6 7 8 9

PD2/INT0 PD3/INT1 PD4/T0 PD5/T1

X9 D2 1N4007

1k

11

#C RST

U2 4 1Y 2Y 3Y 4Y 7 1A 1B 2A 2B 3A 3B 4A 4B A/B G 2 3 5 6 11 10 14 13 1 15 #A #B #C #D #E #F #G #H DIR LED 1N4148 DB5 R16 33 1 3 5 7 9 DB4 D4 COL 1N4148 RS D6 1N4148 D5 R14 33

ISO1C 12 6 X4 2 1 R4 C4 1u

9 12

1k

10

#D

ISO1D 7 9 X5 2 1 R5 74LS157 #E

1k

15

DB6 LED ISO2A 16 2 X6 2 1 R6 1 3 5 9 DB7 74HCT14 #F U4A ISO2B 13 3 2 4 6 8 X7 2 1 R7 U4B U4C U4D JP1

R17 33

KLAWIATURA
(1,2,3 - WIERSZE; 4,5,7,9 - KOLUMNY)

R18 33

14

1k

C5 2 1u 13 8 11 10 1 3 RXD C7 1u R1 IN R2 IN T1 IN T2 IN C1+ C1 U5 MAX232 10 6

C6 VCC 1u R1 OUT R2 OUT T1 OUT T2 OUT C2+ C2 12 9 14 7 4 5 C8 1u

TERMINAL GSM
X12 DB9/M 1 6 2 7 3 8 4 9 5

V+

1k

11

#G D1 LED 3 2 1

ISO2C 12 6 X8 2 1 R8 JP2 #H D3 1N4148 ISO2D 3 2 1 VCC 7 9 2 1 2 1 VCC RL1 R19 560

1k

10

V-

U4E 74HCT14 11 GSM-TXD GSM-RXD R20 270 1 2 3 4 5 6

X14

13 TXD U4F 74HCT14 Z1 Z2

12

R21 750

3
W1-PC6 10 8 6 W2-PC3 4 K2-PC1 2

X11
9 7 5 3 1 W1-PC6 W4-PC5 W3-PC4 K3-PC2 K1-PC0

W2-PC3

6
W3-PC4

9
W4-PC5

ESC

ENTER

K3-PC2 K2-PC1 K1-PC0

You might also like