gsm kontroler zasnovan na atmega16 procesoru - diplomski rad

78
Univerzitet u Beogradu Elektrotehnički fakultet GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD – Student Mentor Goran Golubović 501/98 prof. dr Slobodan Vukosavić Beograd , 2006.

Upload: duongque

Post on 02-Feb-2017

256 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

Univerzitet u Beogradu Elektrotehnički fakultet

GSM kontroler zasnovan na ATMEGA16 procesoru

- DIPLOMSKI RAD –

Student Mentor Goran Golubović 501/98 prof. dr Slobodan Vukosavić

Beograd , 2006.

Page 2: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

2

Predgovor Ovaj diplomski rad ima za cilj da čitaoca upozna sa osnovnim principom rada

GSM modema,kao i njegovu praktičnu integraciju u jedan zatvoren funkcionalan sistem . Problemi na koje sam nailazio u toku projektovanja uređaja kao i primenjena rešenja su takođe opisana u radu.

U radu je detaljno opisan hardware potreban za integraciju GSM modema i mikrokontrolera. Pored hardvera detaljno je opisan i softvare koji je pisan u programskom jeziku C. Opisano je i kompletno razvojno okruženje u kome je sve razvijano. Opisane su funkcije razvojnog okruženja CodeVision AVR kao i hardver razvojnog sistema EASY AVR3. Čitalac može na osnovu ovog rada za kratko vreme da shvati princip rada i da svojim idejama unapredi ovaj uređaj. Kao krajnji rezultat ima se uređaj koji na osnovu zadate komande putem SMS poruka izvršava unapred isprogramirane zadatke.

Moram da naglasim da ovaj uređaj poseduje samo osnovne funkcije i da je ovaj hardver i softver samo polazna osnova za dalju nadgradnju. U svetu postoji mnogo komercijalnih uređaja koji imaju mnogo više funkcija od uređaja opisanog u ovom radu,ali nigde nisu dostupne šeme veza kao ni source kod. Upravo zbog toga mislim da ovaj rad ima posebnu težinu i vrednost.

Page 3: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

3

Sadržaj Predgovor 2

1.Uvod 4

1.1 Projektni zadatak 5

2.Hardware 7

2.1 Telit GM862 7

2.2 AT komande i sintaksa 18

2.3 ATMEGA16 26

2.4 Kolo za transliranje signala TTL/RS232/CMOS 35

2.5 Napajanje 36

3.Razvojni alati 38

3.1 Razvojni softver CodeVision AVR 38

3.2 Razvojni hardver EASYAVR 3 42

3.3 „Hardverski debuger“ – LCD displej 44

4 Organizacija softvera 46

4.1 Inicijalizacija 46

4.2 Glavni program 48

4.3 RxD Interapt rutina 51

4.4 Zaključak 53

5 Source kod – kompletan listing 54

6 Lista komponenti 72

6.1 Šeme veza 74

Literatura 78

Page 4: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

4

UVOD

U svetu savremene tehnologije uvek je postojala težnja inženjera da se

mogućnosti novih tehnologija implementiraju u postojeće industrijske aplikacije i procese. Niko nije ni pomišljao koliku će popularnost doživeti mobilne telekomunikacije i mobilni telefoni. Uporedo sa razvojem mobilne telefonije razvijale su se i ideje o njenoj upotrebi u industriji. Jedna od takvih ideja koja je sprovedena u delo je uređaj koji moze da vrši monitoring i kontrolu nekog drugog uređaja,u ovom slučaju je to asinhroni elektromotor, ili industrijskog procesa putem GSM mreze,dakle bez žica.Kontrola uređaja bežičnim putem je postojala i ranije ali je udaljenost sa koje se moglo kontrolisati bila ograničena.Sa pojavom GSM mreže dobila se mogućnost da sa jednog kraja sveta možete kontrolisati i monitorisati uređaj na drugom kraju sveta.

U svetu postoji oko 50 biliona „mašina“,i GSM kontroler omogućava da mašina bude monitorisana i kontrolisana skoro sa svake tačke zemljine kugle ,bilo kad ,koristeći trenutnu bežičnu data tehnologiju kao što je GSM-GPRS, i SMS(tekst poruke). Znajući da kompletnu proizvodnju u industriji pokreću elekromotorni pogoni i da svaki njihov zastoj stvara ekonomski gubitak kompaniji ,veoma je važno da se što ranije uoči zastoj ili ne pravilnost u radu elektromotornog pogona. Sa pojavom GSM kontrolera omogućeno je rano signaliziranje,monitoring i mogućnost daljinskog otklanjanja problema. U zavisnosti kako je koncipiran sistem GSM kontroler moze da komunicira putem SMS poruka,putem internet sesija preko GPRS protokola ,ili kao običan modem koristeći GSM mrežu kao medijum za prenos informacija. Posebno se pokazala velika upotrebna vrednost ovakvih GSM kontrolera za monitoring i upravljanje elektromotornim pogonima koji su nepristupačni ili se nalaze u opasnim sredinama(eksplozivne ,radioaktivne ,fizički nepristupačne , hemijski opasne sredine..). Potreba za ovakvom vrstom uređaja je postojala od kada postoje elektromotorni pogoni,ali je tek sa razvojem tehnologije materijalizovana u obliku GSM kontrolera.U industriji je ovakva vrsta monitoringa i upravljanja poznata pod imenon M2M(machine to machine,machine to mobile ,man to machine,machine to man ).

Page 5: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

5

1.1 Projektni zadatak Predmet ovog diplomskog rada je razvoj uređaja koji će biti u mogućnosti da

monitoriše i kontroliše rad asinhronog motora sa IRADK modulom putem GSM mreže.Uređaj je nazvan GSM kontroler. GSM kontroler putem SMS tekst poruka dobija komande na osnovu kojih mikrokontroler generiše naponsku referencu koja se prosleđuje na analogni ulaz IRADK modula,koji kontroliše asinhroni motor.IRADK modul je uređaj koji je zasnovan na PIC mikrokontroleru i IRAMS inteligentnom Power modulu za aplikacije u elektromotornim pogonima. Detaljanije informacije i dokumentacija o IRADK modulu se mogu dobiti u labaratoriji za mikroprocesorsko upravljanje elektromotornim pogonima.

GSM kontroler je projektovan tako da reaguje na sledeće tri komande : 1) START XXXX – gde umesto XXXX stoji brzina kojom želimo da se

vrti motor 2) STOP komanda koja zaustavlja motor, tj. obara brzinu motora na nulu 3) REPORT komanda koja vraća korisniku informaciju o trenutno

podešenoj brzini putem SMS-a Uređaj se sastoji iz hardvera, koji je eksperimentalno verifikovan, i softvera

za mikrokontroler koji je napisan u C-u .Na slici 1.1 je data blok šema kompletnog uređaja.

Slika 1.1 Blok šema uređaja Za realizaciju ovakvog uređaja potrebno je znanje iz oblasti

programiranja,elektronike,procesnih računara, elektromotornih pogona , mikroprocesorskog upravljanja elektromotornim pogonima. Sve ove oblasti se izučavaju na elektrotehničkom fakultetu u Beogradu , tako da je ovakav zadatak svojevrstan test za budućeg diplomiranog inženjera elektrotehnike. Pored ovih znanja za realizaciju ovog projekta bilo potrebno mnogo volje , rada, truda, živaca , strpljenja, jednom rečju mnogo radnih sati uloženih da bi se na kraju dobio ovakav uređaj.

Rad se sastoji iz pet poglavlja . Prvo poglavlje je uvod gde se ukratko opisuje projektni zadatak.

Page 6: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

6

Drugo poglavlje je hardwer koje se sastoji iz 4 potpoglavlja u kojima se opisuje redom GSM modem sa AT komandama ,mikrokontroler , kolo za transliranje signala i napajanje.

Treće poglavlje se bavi opisom razvojnog softvera CodeVision AVR i razvojnog sistema EASY AVR3 na kome je razvijan softver.Poseban osvrt je dat na pravljenje adaptera za LCD displej koji se može koristiti na ovom razvojnom sistemu.

Četvrto poglavlje Organizacija softvera se bavi opisom strukture programa koji pokreće ovaj uređaj.Detaljno su opisani glavni program,inicijalizacija i interapt rutina.

Peto poglavlje je kompletan listing programa na C jeziku. Šesto poglavlje se sastoji iz dva dela. Prvi deo sadrži listu svih elemenata a

drugi deo sve šeme veza uređaja.

Page 7: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

7

2 HARDVER Hardver uređaja se može funkcionalno podeliti u četiri funkcionalne celine :

• GSM modem TELIT GM 862 GPRS • mikrokontroler ATMEGA16 sa low pass filterom • kolo za prilagođavanje signala UART-a sa 2.8V na 5V • napajanje

Hardver je eksperimentalno verifikovan u vidu test prototipa uređaja.

2.1 TELIT GM862 – GSM modem Telit GM 862 GSM modem, namenjen korisćenju u wireless industrijskim

aplikacijama za monitoring. Malih je dimenzija,lagan je i lak za integraciju. Kvalitetnog robusnog dizajna, male potrošnje, proširenog opsega radne temperature (-20,+70 ) sa integrisanim držačem gsm kartice. Modem poseduje i real time časovnik i alarm. Osnovne informacije

• Dimenzije • dužina : 43.9 mm • širina : 43.9 mm • debljina : 6.9 mm • zapremina : ≈13 cm3 • težina : 23 g (sa oklopom ,16g bez oklopa)

Layout modema prikazan je na sledećim slikama:

Slika 2.1 Layout TELIT GM862 modula

Page 8: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

8

Slika 2.2 Fizički izgled TELIT GM 862 modula

Temperaturni opseg

• Garantovano funkcionalan rad u opsegu temperatura od -10°C do +55°C • Temperatura u ekstremno funkcionalnom stanju od -20 °C do +70 °C • Temperatura skladištenja od -30°C do +85°C

Radna frekvencija Prema GSM specifikaciji modem može da radi na sledećim frekvencijama 900 MHz / 1800 MHz . Antena U zavisnosti za kakvu aplikaciju korisnik koristi modem ,prema tome se bira i antena koja mora da ispuni zahteve iz tabele :

Frekventni opseg Standardni Dual Band opseg frekvencija Bandwith 80 MHz u GSM & 170 MHz u DCS

Pojačanje 1.5dBi ≤ Pojačanje < 3dBi (referenced to 1/2 dipole)

Impedansa 50 ohm Ulazna snaga > 2 W peak snage VSWR apsolutni max < 10:1 VSWR preporučeno 2:1

Page 9: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

9

Konektor za antenu Telit GM862 modul uključuje i 50 ohm koaksijani ženski 2 PIN ugaoni Coax SMDJ01341A0081 konektor za omogućavanje konekcije sa antenom.Korisnička aplikacija mora da ima konektor kao na slici.

Slika 2.3 Izgled konektora za antenu Napon napajanja Telit GM862 modul dolazi bez napajanja tako da se mora priključiti na eksterno napajanje.Eksterno napajanje se priključuje između pinova VBATT i GND,i mora da ispuni sledeće zahteve:

• Nominalni radni napon 3.8V • Operativni opseg napona od 3.4V do 4.2V

Posebna pažnja se mora obratiti da se ne pređu granice operativnog opsega napona jer se u suprotnom modem automatski isključuje. Potrošnja modula Tipična potrošnja struje Telit GSM862 modula je :

• Power off režim (tipično) 26 µA • Stand-by režim 4 mA • Maksimalna potrošnja stuje (strujni impuls) 1.9 A • Maksimalna srednja potrošnja struje tokom prenosa podataka (rms) 350 mA • Srednja vrednost struje u idle režimu 17 mA

Page 10: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

10

Konektori interfejsa na GM862 modulu Telit GM862 ima dva konektora i čitač SIM kartice :

1) konektor za antenu 2) interfejs konektor 3) čitač SIM kartice

Na slici su prikazani konektori i njihove pozicije

Slika 2.4 Šematski prikaz pozicija konektora Na slici ispod je prikazan lay-out GM 862 konektora i tabela sa rednim brojevima pinova i kratkim opisom svakog od njih.

Slika 2.5 Lay out GM862 konektora

Page 11: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

11

Molex 5299 1-0508 (male) GM862 Connector PIN-OUT

Pin Signal I/O Funkcija Internal Pull up Tip

1 VBATT - Glavno napajanje napajanje

2 GND - ground napajanje

3 VBATT - Glavno napajanje napajanje

4 GND - Ground napajanje

5 VBATT - Glavno napajanje napajanje

6 GND - Ground napajanje

7 VBATT - Glavno napajanje napajanje

8 CHARGE Al Ulaz za punjač (5) napajanje

9 EAR HF+ AO Hands free izlaz za slušalicu,phase+ Audio

10 EAR_MT- AO Handset izlazni signal, phase - Audio

11 EAR_HF- AO Handsfree slušalica izlaz, phase - Audio

12 EAR MT+ AO Handset slušalica izlazni signal, phase + Audio

13 MICHF- Al Handsfree mikrofonski ulaz; phase -, nominalni nivo 3mVrms Audio

14 MICMT+ Al Mikrofonski ulaz signala za Handset; phase+, nominalni nivo 50mVrms

Audio

15 MICHF+ Al Handsfree mikrifinski ulaz ; phase +, nominalni nivo 3mVrms Audio

16 MICMT- Al Handset mikrofonski ulaz; phase-, nominalni nivo 50mVrms Audio

17 ON/OFF I —

Ulaz za komandu koji uključuje ili isključuje napajanje.Dužina trajanja signala koji se šalje na GM862 mora biti jednaka ili veća od

47KΩ VBATT (6)

Page 12: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

12

1s

18 AXE I Handsfree prekidač 47KΩ 2.OV signal

19 SIMIO I/O Externi SIM signal - Data I/O 3V ONLY

20 C103/TXD I Serijski ulaz za podatke (TXD) od DTE CMOS 2.8V

21 PWRCTL/ CAM_SYNC 0

Module Status ON indikator(izlazni signal za power on\off kontrolu eksternih uređaja) / Interfejs za kameru (4)

820Ω- 10KΩ CMOS 2.8V

22 SIMVCC Eksterni SIM signal za napajanje (3) 3V ONLY

23 RESET I Reset ulaz 2KΩ Pogledati dokumentaciju za više detalja

24 SIMRST 0 Eksterni SIM reset signal 3V ONLY

25 TEST32kHz/ MON1 CAM

— Za testne svrhe (1) / kamera interfejs (4) CMOS 2.8V

26 SIMCLK 0 Eksterni SIM CLOCK signal 3V ONLY

27 CCIN I/O Eksterni SIM signal –za prisustvo kartice (aktivno stanje signala low)

47KΩ CMOS 2.8V

28 GPIO2/JDR 0 Izlaz za generalnu upotrebu (Otvoren kolektor) / Interfejs za kameru (4)

Otvoreni kolektor

29 C106/CTS 0 Izlaz za CLEAR to SEND (CTS) prema DTE CMOS 2.8V

30 C 125/RING 0 Izlaz za Ring indikator (RI) prema DTE CMOS 2.8V

31 GPIO1 I Ulaz za generalnu upotrebu

transistor base

32 CLKSXM / PD[0]

DAI Za testne svrhe (1) / Interfejs za kameru (4) CMOS 2.8V

33 C107/DSR 0 Izlaz za Data set ready signal (DSR) prema CMOS 2.8V

Page 13: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

13

DTE

34 TXDD / PD[l] DAI – Za testne svrhe (1) / interfejs za kameru (4) CMOS 2.8V

35 EMMI TX 0 TX Data izlaz za debug monitor (1) CMOS 2.8V

36 C109/DCD 0 Izlaz za Data carrier detekciju signala (DCD) prema DTE CMOS 2.8V

37 C104/RXD 0 Serijski izlaz za podatke prema DTE CMOS 2.8V

38 SCLK/ PD[2] — DAI – Za testne svrhe (1) / Interfejs za kameru (4) CMOS 2.8V

39 STAT_LED 0 Led status indikator Otvoreni kolektor

40 RXDD / PD[3] — DAI – Za testne svrhe (1) / Interfejs za kameru (4) CMOS 2.8V

41 EMMI RX I RX Data ulaz za debug monitor (1) CMOS 2.8V

42 RFSD / PD[4] I DAI za testne svrhe (1) /

interfejs za kameru (4) CMOS 2.8V

43 C108/DTR I Ulaz za data terminal ready signal (DTR) od DTE(4)

CMOS 2.8V

44 TFSD / PD[51] — DAI za testne svrhe (1) / Interfejs za kameru (4) CMOS 2.8V

45 C105/RTS I Ulaz za request to send signal (RTS) od DTE CMOS 2.8V

46 GPIO3 / PD[6] I/O —

Konfigurabilni I\O pin za generalnu upotrebu /interfejs za kameru CMOS 2.8V

47 GPIO4 / IICSDA I/O

Konfigurabilni I\O pin za generalnu upotrebu /interfejs za kameru CMOS 2.8V

48 GPIO5 / CAM DRDY

I/O —

Konfigurabilni I\O pin za generalnu upotrebu /interfejs za kameru CMOS 2.8V

49 GPIO6 /ALARM /PD[7] I/O

GP I/O pin / interfejs za kameru ili izlazni pin za ALARM CMOS 2.8V

Page 14: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

14

50

GPIO7 /BUZZER /CAM_PWR ON

I/O GP I/O pin ili BUZZER izlazni pin / Interfejs za kameru CMOS 2.8V

Tabela sa opisom pinova Pošto je jako teško pristupiti pinovima modema ,u ovom radu se koristila i dodatna pločica –adapter.Pomoću ove pločice se veoma lako može pristupiti svakom pinu modula.Slika adaptera je data na sledećoj slici.

Slika 2.6 Prednja strana adaptera Slika 2.7 Zadnja strana adaptera

Slika 2.8 Modem montiran na adapter Za realizaciju ovog uređaja korišćeni su sledeći pinovi

• VBATT i GND za priključenje napajanja - pinovi 1,3,5,7,2,4,6 • STAT_LED za signalizaciju statusa mreže - pin 39 • PWRCTL za indikaciju da je uređaj uključen - pin 21 • TXD,RXD za serijsku komunikaciju sa eksternom aplikacijom - pin 37,20 • RESET za reset modema – pin 23 • ON/OFF za uključenje i isključenje modema-pin 17

Page 15: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

15

Fiksiranje antenskog koaksijalnog kabla Da bi Telit GM862 radio kako treba potrebno je pravilno montirati antenski kabl.Da bi kabl bio montiran pravilno sledeći uslovi moraju biti ispunjeni :

• tačka montiranja ne sme biti suviše blizu konektoru antene ,već mora biti udaljena najmanje 30mm

• tačka montiranja mora biti u istoj ravni kao i antenski konektor • fleksibilni kabal ne bi trebalo da bude postavljen sa radijusom manjim od

25mm Slika 2.9 objašnjava date uslove:

Slika 2.9 Način povezivanja antene na modul Čitač SIM kartica Telit GM862 GPRS modul ima ugrađen čitač SIM kartica.On podržava samo SIM kartice napona napajanja od 3V . SMS Telit GM862 GPRS podržava dva tipa SMS poruka :

• MT(mobile terminated) klasa 0-2 sa signalizacijom o novopristiglim SMS porukama,SIM card full statusom , SMS pročitanim porukama

• MO(mobile originated) klasa 0-3 sa pisanjem I memorisanjem poruka u SIM kartici kao I slanjem istih

Časovnik realnog vremena Telit GM862 je opremljen časovnikom realnog vremena kao i alarmom. Časovnikom i alarmom se upravlja putem AT komandi. Izlaz alarma (pin GPIO6) se može koristiti za generisanje signala za eksterne interapte.

Page 16: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

16

Indikacija dostupnosti mreže Preko AT komandi ili preko LED indikacije na pinu 39 (STAT_LED). STAT_LED je izlaz sa otvorenim kolektorom gde je moguće direktno priključiti LED diodu da pokazuje informacije o stanju mreže i CALL STATUS. Sledeća tabela daje opis i značenje LED indikacije.

LED status Status uređaja

Stalno isključena Uređaj isključen

Brzo blinkanje (period Ton 0,5s) Traži se mreža/Nije registrovana kartica

Sporo blinkanje (period 3s, Ton O,3s) Registrovana kartica na mrežu

Stalno uključena Poziv je u toku

Specifikacija logičkih nivoa za serijski interfejs Komunikacija između modema i korisničke aplikacije mora da ide preko serijskog interfejsa. Kada ništa nije eksplicitno naznačeno ,svi interfejsi rade na 2.8V CMOS logičkim nivoima. Sledeće tabele pokazuju specifikaciju logičkih nivoa za Telit GM862 module.

Apsolutne maksimalne vrednosti-modul ne funkcioniše

Parametar Min Max

Ulazni nivo bilo kog digitalnog pina kada je uključen -0.3V +3.75V

Ulazni napon na uključenom analognom pinu -0.3V +3.0 V

Operativne vrednosti-nivoi interfejsa (2.8V CMOS)

Nivo Min Max

Ulazni visoki nivo 2.1V 3.3V

Ulazni niski nivo 0V 0.5V

Izlazni visoki nivo 2.2V 3.0V

Izlazni niski nivo 0V 0.35V

Page 17: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

17

RESET signal

Signal Funkcija I/O Pin

RESET Reset modema I 23

Reset signal se koristi za reset modema.Dokle god je signal na niskom nivou(pulled low) GM862 GPRS je resetovan.Kada se uređaj resetuje on zaustavlja sve operacije i posle otpuštanja reseta modem se gasi bez prethodnog odjavljivanja sa mreže na kojoj je registrovan. Ovo nije pravilno gašenje modema je nije urađeno odjavljivanje sa mreže. Zbog ovoga reset se ne sme koristiti za normalno gašenje modema,već kao krajnje rešenje u retkim slučajevima kada se modem zaglavi čekajući nekakav odgovor od mreže.

RESET signal- operativni nivoi Signal Min Max

RESET visoki ulazni naponski nivo 2.2V* 3.3V

RESET niski ulazni naponski nivo 0V 0.2V

*ovaj signal je interno pulled up pa ako se ne koristi može se ostaviti da “visi”,tj da bude ne priključen

Pored ovih detaljnije opisanih funkcija modem poseduje i sledeće funkcije: • DATA/Fax prenos podataka • Kodiranje govora (speech coding) • Kontrolu poziva (Call control) • Telefonski imenik (phonebook) • Karakter menadžment • Automatsko javljanje (DATA,fax,govor) • DMTF tonovi • Akustična signalizacija

Page 18: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

18

2.2 AT komande i sintaksa

Modem prilikom uključenja ne šalje i ne inicira nikakav prenos podataka preko serijske veze. Modemom se može komandovati putem AT komandi. Naziv ovih komandi AT je skraćenica od attention command. Specifično za ove komande je da svaka komanda počinje sa nizom znakova AT. Spisak svih komandi sa opisom se nalaze u pdf dokumentu GM862_Family_AT_Commands,koji se može naći na telitovom sajtu kao i na propratnom CD-u.Ovde cu opisati samo osnovni set komandi potrebnih za slanje i čitanje SMS poruka i za inicijalizaciju modema. Notacija komandi <CR> predstavlja Carriage Return Character (13) <LF>predstavlja Line Feed Character (10) <xx>predstavlja bilo koji string umesto xx (ova zagrada < i ova > su jedino granični

parametri i NE SMEJU biti uneti preko terminala) [<xx>] predstavlja opcioni parametar ,bilo koji string umesto xx ( [ i ] karakteri su

granični i NE SMEJU biti prosledjene preko terminala) Svaka komanda poslata modemu GM862 rezultuje odgovorom ako su omogućeni

kodovi odgovora (response codes,podešavaju se pomoću komande ATQn).U zavisnisti od komande zavisi i vreme odgovora (response time). Response time za svaku komandu pojedinačno je dat u GM862_Family_AT_Commands.pdf dokumentu. Response time za neke komande zavisi od trenutnog stanja mreže. Rezultat svake komande je obezbeđen sa odgovarajućim time out-om,ako ovo vreme prođe bez ikakvog odgovora,tada je odgovor ERROR kao indikator da je operacija neuspela.Default time out je 100ms za sve komande koje nemaju interakciju sa mrežom.

Po uključenju modema on učitava iz svoje memorije osnovnu konfiguraciju. Da bi se

videlo koja je trenutna konfiguracija potrebno je modemu proslediti komandu AT&V. Kao rezulatat ove komande dobijamo sledeće podatke :

aatt&&vv DTE SPEED : AUTO DTE FORMAT : 8N1 GSM DATA MODE : Not Transparent AUTOBAUD : +IPR0=YES COMMAND ECHO : E1=YES RESULT MESSAGES : Q1=YES VERBOSE MESSAGES : V1=YES EXTENDED MESSAGES : X1=YES LINE SPEED : F0=autodetect

Page 19: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

19

CONSTANT DTE SPEED : YES FLOW CONTROL OPTIONS : &K3=HW bidirect. ERROR CORRECTION MODE : RLP CTS (C106) OPTIONS : &B2=OFF while disc. DSR (C107) OPTIONS : &S3=PHONE ready->ON DTR (C108) OPTIONS : &D0=ignored DCD (C109) OPTIONS : &C1=follows carrier RI (C125) OPTIONS : \R1=OFF dur. off-hk C108/1 OPERATION : &D4=NO POWER SAVING ON DTR : +CFUN:1=NO DEFAULT PROFILE : &Y0=user profile 1 OK

Kao što se vidi u prvom redu baud rate serijske veze modema po fabričkom setovanju je podešen na AUTO ,uključen je ECHO i omogućena je opcija AUTOBAUD. Pošto je za ovaj diplomski rad usvojeno da brzina serijske veze bude 19200 to ovo podešavanje ne odgovara napisanom source kodu. Pošto serije GSM modema verovatno imaju različita defaultna podešavanja , najsigurnije je da se modem ručno nasetuje pa tek onda ubaci u GSM kontroler uređaj. Da bi se modemu pristupilo potrebno je zakačiti ga na serijski port računara. Za to je potrebno TxD i RxD signale modema ,njihove polaritete i naponske nivoe , prilagoditi polaritetu i naponskim nivoima signala RS232 protokola PC računara. Ovo je moguće uraditi uz minimalnu izmenu postojećeg hardvera ili jednostavno napraviti kolo za transliranje signala između modema i PC računara. Procedura za setovanje parametara modema se sastoji iz sledećih komandi koje se unose iz serijskog terminala CVAVR razvojnog okruženja :

• ATE0<CR><LF> - komanda koja isključuje ECHO na serijskoj vezi.

Čekati na rezultat OK. • AT+IPR=19200<CR><LF> - komanda koja podešava baud rate na

19200 bauda. Čekati na rezultat OK. • AT&Y0<CR><LF> – izbor profila koji se učitava nakon reseta. U

ovom slučaju je to profil 0. Može se birati između profila 0 i 1. Čekati na odgovor OK.

• AT&W0<CR><LF> - snimanje trenutne kompletne konfiguracije modema u profil 0 .

Posle unosenja komande AT&V<CR><LF> imamo sledeće:

Page 20: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

20

at&v DTE SPEED : 19200 DTE FORMAT : 8N1 GSM DATA MODE : Not Transparent AUTOBAUD : +IPRxxx00=NO COMMAND ECHO : E0=NO RESULT MESSAGES : Q1=YES VERBOSE MESSAGES : V1=YES EXTENDED MESSAGES : X1=YES LINE SPEED : F0=autodetect CONSTANT DTE SPEED : YES FLOW CONTROL OPTIONS : &K3=HW bidirect. ERROR CORRECTION MODE : RLP CTS (C106) OPTIONS : &B2=OFF while disc. DSR (C107) OPTIONS : &S3=PHONE ready->ON DTR (C108) OPTIONS : &D0=ignored DCD (C109) OPTIONS : &C1=follows carrier RI (C125) OPTIONS : \R1=OFF dur. off-hk C108/1 OPERATION : &D4=NO POWER SAVING ON DTR : +CFUN:1=NO DEFAULT PROFILE : &Y0=user profile 1 OK

Kao što se vidi može se uočiti razlika da je sada fiksiran baud rate na 19200 bauda,isključen je AUTOBAUD , i isključen je ECHO. Tek sada nakon ove provere modem je spreman za pravilan rad.

U narednim redovima je dat opis osnovnih AT komandi koje su potrebne za

rad sa GSM modemom. Detaljan spisak komandi sa objašnjenjima se nalazi u fajlu GM862_Family_AT_Commands.pdf .

Page 21: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

21

1)Autobauding • Poslati komandu AT<CR> • čekati OK odgovor Posle ove inicijalne komande ,potrebno je fiksirati baud rate porta ,da bi se eliminisale moguće greške u detekciji brzine protoka podataka serijskog porta: • Poslati komandu AT+IPR=<baud rate><CR> • čekati OK odgovor

gde je baud rate brzina protoka podataka serijskog porta i može biti 300,1200,2400,4800,9600,19200,38400,57600,115200 bps.

2)Provera prisutnosti SIM kartice Omogućavanje proširenog izveštaja o kodovima grešaka • Poslati komandu AT+CMEE=1<CR> • čekati OK odgovor Provera prisutnosti i status Sim kartice • Poslati komandu AT+CPIN<CR> • čekati na odgovor: Odgovor Značenje odgovora

Šta činiti ?

+CP1N: SIM PiN

Sim kartica je prisutna i PIN je potreban da bi se dalje nastavilo sa radom

preci na tačku 3) Unosenje PIN koda

+CP1N: SIM PUK

Sim kartica je prisutna i potrebno je uneti PUK kod jer PIN kod nije pravilno unet iz tri pokušaja.

Poslati komandu AT+CPIN=<SIMPUK>

+CP1N: READY

Sim kartica je prisutna i nije potreban PIN kod za dalji rad

Nastaviti dalje

+CME ERROR: 10

Sim kartica nije prisutna Ubaciti Sim karticu i ponoviti sve od tačke 1)Autobauding

+CME ERROR: 13

Neispravna Sim kartica Proveriti Sim karticu ili ubaciti ispravnu Sim karticu i ponoviti sve od tačke 1)Autobauding

+CME ERROR: 14

Sim kartica je zauzeta Pokušati kasnije

+CME ERROR: 15

Pogrešan tip Sim kartice Mora biti GSM kartica

Page 22: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

22

3)Unošenje PIN koda • Poslati komandu AT+CPIN=****<CR> gde **** predstavlja SIM PIN kod (npr.1234) • čekati na odgovor

Odgovor Razlog Šta činiti? OK SIM PIN je tačan Nastaviti dalje ERROR Uneti PIN kod je netačan Ponoviti tačku 2)Provera

prisutnosti Sim kartice

4)Unošenje PUK koda • Poslati komandu AT+CPIN=<****><CR> gde je ***** SIM PUK kod (npr 1234) • čekati odgovor

Odgovor Razlog Šta ciniti? OK SIM PUK je tačan Nastaviti dalje ERROR Uneti PUK kod je netačan Ponoviti tačku 4)Unošenje

PUK koda

5)Provera mreže • Poslati komandu AT+CREG<CR> • čekati na odgovor

Odgovor Razlog Šta ciniti +CREG:0,1 ili +CREG:0,2

Modem je registrovan na domaćoj mreži

Nastaviti dalje ,modem je spreman da šalje i prima pozive

6)Podešavanje za VOICE CALL

• Poslati komandu AT+FCLASS=8<CR> • čekati OK odgovor

7)Biranje zadatog broja telefona • Poslati komandu ATD <Broj telefona><CR> gde je <Broj telefona> je broj telefona koji se poziva • čekati na odgovor:

Odgovor Razlog Šta činiti ? OK Poziv je uspostavljen čekati da druga strana

podigne slušalicu BUSY pozvana linija je zauzeta pokušati kasnije ponovo NO ANSWER pozvani broj nije

odgovorio pokušati kasnije ponovo

NO CARRIER poziv nije uspešno uspostavljen

proveriti jačinu signala i registraciju mreže

Page 23: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

23

Primer: Ako želimo da pozovemo broj 0644432098 : komanda je: ATD “+381644432098”<CR> odgovor OK

8)Prekidanje VOICE CALL-a (hang up) • Poslati komandu ATH<CR> • čekati OK odgovor

9)Podesavanje produžene indikacije poziva • Poslati komandu AT+CRC=<n><CR>

gde je <n> izabrani mod operacije: 0-produženi rezultati su isključeni(prilikom poziva modem javlja samo RING ) 1-produzeni rezultati su uključeni(modem javlja +CRING:<tip>indikacija)

• čekati OK odgovor Daje informaciju kakav je tip poziva Voice ili data call.

10)Podešavanje modema za SMS GM862 podržava SMS u dva različita formata PDU i tekst format.PDU mod podrazumeva da uredjaj vraća i prima SMS kodirane u formatu koji je spreman za slanje na mrežu.U tekst modu uređaj konvertuje automatski pročitani PDU u tekst i obrnuto.Tekst mode je lakši za korisćenje pa ćemo njega i koristiti.

• Poslati komandu AT+CMGF=<mod><CR> gde je <mod> SMS tip formata 0-PDU 1-Text

• čekati na odgovor OK Primer: Setujemo TEXT format za SMS : komanda: AT+CMGF=1<CR> odgovor:OK

11)Slanje SMS poruke bez snimanja Nova SMS poruka može biti poslata direktno na mrežu bez čuvanja

• Poslati komandu AT+CMGS=”<OA>”<CR> gde je <OA> odredišna adresa,tj broj mobilnog telefona na koji se šalje poruka

• čekati na pojavu znaka “>” • uneti tekst poruke ,do 160 karaktera. • završiti unos CTRL-Z karakterom • čekati na odgovor:

Page 24: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

24

Odgovor razlog Šta činiti? +CMGS:<mr> OK

Poruka je uspešno poslata <mr> predstavlja referentni broj poruke

nastaviti dalje

ERROR nastala je neka greška omogućiti prošireni način javljanja grešaka i pokušati ponovo sa slanjem poruke

Primer: Želimo da pošaljemo poruku direktno na broj +381644432098.Pretpostavlamo da je sve već setovano za SMS mod opisano u prethodnim tačkama: komanda: AT+CMGS=”+381644432098” odgovor: > ovo je tekst poruke koja ce se poslati :))))))) Završiti tekst poruke sa CTRL-Z karakterom odgovor : +CMGW:4 OK SMS poruka je uspešno poslata .

12)Čitanje poruka SMS poruke su podeljene u 5 grupa

REC UNREAD-pristigle poruke koje nisu pročitane REC READ –pristigle poruke koje su pročitane STO UNSENT – napisane poruke koje nisu jos poslate STO SENT – napisane poruke koje su poslate ALL- svi tipovi poruka

• Poslati komandu AT+CMGL=<grupa><CR> gde je <grupa> grupa poruka koja se zeli pročitati “REC READ” “REC UNREAD” “STO SENT” “STO UNSENT” “ALL”

• čekati na odgovor u formatu za svaku poruku u grupi: +CMGL:<index>,<stat>,<oa/da>[<tooa/toda>,<lenght>]<CR> <LF><tekst> gde su: <index>-index poruke u memoriji <stat>-status poruke

“REC READ” “REC UNREAD” “STO SENT” “STO UNSENT”

Page 25: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

25

“ALL” <oa/da>-broj primaoca/broj posiljaoca <lenght>-dužina poruke u karakterima <tekst>-tekst poruke Primer:Želimo da vidimo sve poruke u modemu : komanda:AT+CMGL=”ALL”<CR> odgovor:+CMGL:5,”REC READ”,”+381642472248” Proba GSM modema :)))))) +CMGL:8,”REC READ”,”+381641424199” druga proba GSM modema :))))))))) OK

Ovo je ukratko opis komandi koje su neophodne za osnovno funkcionisanje modema. Ove komande su polazna osnova za planiranje source koda. Na osnovu ovih komandi se pravi šablon kako se šalje i prima SMS poruka.

Page 26: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

26

2.3 Mikrokontroler ATMEGA 16

Arhitektura

Mikrokontroler ATMEGA 16 je osmobitni mikrokontroler kompanije ATMEL,harvardske arhitekture. U osnovi se nalazi moderni 8-bitni RISC mikroprocesor koji sadrži 32 registra opšte namene, 16K flash memorije koja služi za čuvanje programa koji procesor izvršava ,512 bajta EEPROM memorije koja služi za čuvanje podataka koji ne smeju biti izgubljeni po nestanku napajanja i 1K interne SRAM memorije za čuvanje podataka . Performanse AVR mikrokontrolera su dosta iznad proseka - AVR mikroprocesore odlikuje velika brzina izvršavanja – do 16 MIPS, što je oko 12 puta vise nego kod standardnih 8-bitnih mikroprocesora,dok su sa druge strane i memorijske performanse znatno poboljšane kombinovanim korišćenjem Flash memorije i EEPROM memorije.

2.10 Pin dijagram mikrokontrolera 2.11 ATMEGA16 u PDIP kućištu

MEGA AVR familija mikrokontrolera ima jedinstvenu memoriju sa

mogućnošću samoprogramiranja (Self-Programming Memory) , kao i mogućnost čitanja iz memorije tokom upisa (Read while Write). Mikrokontroleri iz ove familije se mogu naći u varijantama sa 8-128K Flash memorije, do 4K EEPROM-a i do 4K RAM-a, i dolaze u 32-64 pinskom pakovanju. Usmereni su na specijalizovane segmente tržišta, i često se koriste kao komponente u prenosivim uređajima, bežičnoj komunikaciji i bezbednosti.Procesorsko jezgro je bazirano na AVR RISC arhitekturi koja je zajednička za sve mikrokontrolere AVR familije. Ovo ima za posledicu jednostavnije programiranje u slučaju promene mikrokontrolera u toku faze projektovanja (nema potrebe za izmenom napisanog koda,već se piše samo dodatni kod za rad sa specifičnim komponentama novog mikrokontrolera).Blok šema mikrokontrolera na slici je preuzeta iz fajla 2466.pdf koji se nalazi na propratnom CD-u.

Page 27: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

27

Slika 2.12 Blok šema mikrokontrolera

Programska flash memorija je organizovana kao 8K x 16 ,zato što su sve instrukcije mikrokntrolera dužine 16 ili 32 bita. Postoji ugrađen pipeline mehanizam koji omogućava da se tokom izvršavanja jedne instrukcije preuzima sledeća instrukcija iz programske memorije. Pošto je frekvencija sistemskog takta jednaka frekvenciji oscilatora koji se koristi za generisanje taktnih impulsa to znači da procesor koji radi na 16MHz ima brzinu od 16MIPS-a što je za osmobitne procesore izvanredan rezultat. AVR mikrokontroleri imaju 32 osmobitna registra opšte namene.Svaki od ovih registara može imati ulogu akumulatora pri obavljanju aritmetičkih operacija.Ovi registri su mapirani u SRAM memoriji i zauzimaju prve 32 adrese.Na sledeće 64 adrese su mapirani I/O registri perifernih jedinica mikrokontrolera.Od adrese 60H počinje interna SRAM memorija . Gornjih šest registara opšte namene se mogu koristiti kao 3 šesnaestobitna registra pri indirektnom adresiranju programske ili data memorije.Ovi pokazivači se označavaju kao X,Y ili Z registar.Za adresiranje lokacija u programskoj memoriji se može koristiti samo Z registar.Detaljniji opis registara i arhitekture se nalazi u fajlu 2466.pdf koji se nalazi na propratnom CD-u.

I\O portovi

Mikrokontroler ATMEGA16 poseduje četiri ulazno-izlazno porta. To su

portovi PORTA,PORTB,PORTC,PORTD koji imaju po osam izvedenih pinova na kućištu procesora.Svi pinovi su multipleksirani i imaju dodatne funkcije u zavisnosti koja se od periferijskih jedinica koristi.Tako se na primer na pinovima porta A se nalaze analogni ulazi A/D konvertora. Svaki od pinova se može konfigurisati kao ulazni ili kao izlazni pin bez obzira kako su konfigurisani ostali pinovi istog porta. Na sledećoj slici je prikazana struktura ulazno-izlaznog pina.

Page 28: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

28

Slika 2.14 Struktura I/O pina

Svaki pin ima interni pull up otpornik koji se programski može uključiti ili

isključiti. Svakim portom se upravlja pomoću tri I/O registra. To su registri DDRx,PORTx,PINx gde umesto x treba da stoji oznaka porta (A,B,C ili D). DDRx Data Direction Register služi za određivanje smera podataka,tj. da li će port biti definisan kao ulazni ili kao izlazni.Ovaj registar je osmobitni i svaki bit u ovom registru određuje koji će pin biti izlazni a koji ulazni.Na primer ako želimo da setujemo da svi pinovi porta C budu izlazni treba ovako napisati u programu DDRC=0xFF,ili DDRC=0b11111111.Ako se želi da svi pinovi porta C budu ulazni onda treba napisati DDRC=0x00,ili DDRC=0b00000000. Podešavanjem pojedinačnih bitova se može podesiti da pinovi budu ulazni ili izlazni u okviru istog porta.

Registar PORTx je registar podataka. Ako je prethodno podešeno da su pinovi izlazni i ako se određeni bitovi u registru PORTx podese na jedinicu ili nulu stanje se odmah preslikava na izlaz. Na primer ako je registar DDRC=0b00001111 a registar PORTC=0b11001010 i ako su pull up otpornici isključeni , na pinovima od P7 do P4 će se imati stanje visoke impedanse,jer su ovi pinovi definisani kao ulazni i njihovo stanje ne zavisi od sadržaja PORTC registra. Na pinovima od PD0 do PD3 koji su definisani kao izlazni imamo preslikano stanje iz PORTC registra,1010 . PINx registar je namenjen samo za čitanje stanja pinova bez obzira da li su definisani kao ulazni ili kao izlazni. Za pinove koji se ne koriste preporučuje se da budu definisani kao ulazni i da se dovedu na neki logički nivo. Ovo se najlakše postiže uključivanjem internih pull up otpornika.

Page 29: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

29

Tajmeri

ATMEGA 16 poseduje tri Timer/Counter jedinice. Timer/Counter0 i Timer/Counter2 su osmobitni dok je Timer/Counter1 šesnaestobitni. Za realizaciju ovog rada korišćen je Timer/Counter1 koji će biti opisan. Detaljni opisi za ostale Timer/Counter jedinice dat je u fajlu 2466.pdf.

Slika 2.15 Blok šema TimerCounter1 jedinice

Timer/Counter1 (TCNT1) ima dva output compare registra (OCR1A,OCR1B) i jednu input capture jedinicu (ICR1).Output compare registri porede svoj sadržaj sa sadržajem brojača i kad se njihovi sadržaji poklope setuju se OCF1A ili OCF1B fleg TIFR registra u zavisnosti čiji se sadržaj poklopio sa stanjem brojača. Ako su globalno omogućeni prekidi i ako su setovani bitovi OCIE1A ili OCIE1B pozivaju se prekidne rutine Timer1CompA ili Timer1CompB. Output Compare registri OCR1A i OCR1B kao i Input Capture ICR1 su šesnaestobitni registri. Da bi se pristupilo ovim registrima koristi se privremeni temporary osmobitni registar koji je zajednički za sve šesnaesto bitne registre TimerCounter-a 1. Prilikom operacije upisa ,da bi se pravilno pristupilo registru potrebno je najpre upisati sadržaj gornjeg bajta a zatim donjeg bajta. Pri upisu gornjeg bajta sadržaj se upisuje u privremeni temporary registar da bi se pri upisu donjeg bajta istovremeno sadržaj temporary registra kopirao kao gornji bajt odgovarajućeg šesnaestobitnog registra. Pri čitanju donjeg bajta šesnaestobitnog registra gornji bajt se kopira u temporary registar u istom taktnom ciklusu. Dalje se sadržaj gornjeg bajta

Page 30: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

30

dobija čitanjem temporary registra. Kao zaključak imamo da se pri upisu u šesnaestobitni registar mora prvo upisati gornji pa donji bajt,dok je kod čitanja obrnut redosled. Na strani 94 i 95 fajla 2466.pdf se nalaze primeri u C-u kako se pristupa ovim registrima. Input Capture jedinica se sastoji od šesnaestobitnog registra ICR1 kao i logike za generisanje write signala. Detaljna šema je prikazana na strani 96 dokumenta 2466.pdf. Rad input capture jedinice se zasniva kopiranju sadržaja brojača u ICR1 registar, prilikom pojave spoljnjeg signala na pinu ICP1 ili pri pojavi signala na analognom komparatoru. Tada se Input Compare fleg ICF1 registra TIFR postavlja na jedinicu. Ako je omogućen Input Capture prekid,bit TICIE1 regirstra TIMSK setovan i ako su prekidi globalno omogućeni poziva se odgovarajuća interapt rutina. ICF1 se automatski briša nakon izvršenja prekidne rutine. Ovaj fleg može biti obrisan i ručno upisom logičke jedinice na njegovo mesto. Registru ICR1 se pristupa kao i drugim šesnaestobitnim registrima TimerCounter-a 1. Output Compare jedinica se sastoji iz dva šesnaestobitna registra,šesnaestobitnog komparatora i generatora talasnih oblika Waveform Generator.

Slika 2.16 Output Compare unit

Na slici je prikazan jedan output compare registar označen sa OCRnx gde umesto x treba da stoji A ili B zavisno o kom se registru radi. Umesto n treba da stoji 1 jer se radi o timercounter-u 1. Osenčeni registar je brojački registar TCNT1 i on nije deo output compar jedinice. Šesnaestobitni komparator stalno poredi sadržaje registara OCR1A i OCR1B sa sadržajem brojačkog registra TCNT1. Kada se sadržaj brojačkog registra izjednači sa sadržajem nekog od output compare registra OCR1A ili OCR1B signalizira match signal. Output compare fleg OCF1A ili OCF1B se setuje u prvom sledećem tajmerskom taktnom ciklusu. Ako su bitovi OCIE1A ili OCIE1B setovani i ako su omogućeni globalno prekidi poziva se odgovarajuća prekidna rutina. Adrese interapt rutina su 7 za OC1A i 8 za OC1B. Pinovima OCR1A i OCR1B upravlja generator talasnih oblika u zavisnosti koji je mod rada OutputCompare registra podešen.Detalji oko podešavanja ovih modova se nalaze na stranama 111 do 117 fajla 2466.pdf.

Page 31: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

31

Generator talasnih oblika

Generator talasnih oblika ima sledeće modove rada • normalni mod • CTC mod • Fast PWM • Fazno korektni PWM • Fazno i frekvencijski korektan PWM •

U ovom radu je upotrebljen Fast PWM mod pa će on biti detaljno opisan. Fast PWM mode omogućava generisanje PWM signala najveće moguće prekidačke učestanosti. Za razliku od ostalih PWM modova ,ovaj mod je zasnovan na generisanju testerastog nosioca. Brojački registar inkrementira dok ne stigne do gornje TOP vrednosti i tada se resetuje na nulu. U zavisnosti kako je definisana TOP vrednost postoji 5 mogućih načina rada . Gornja vrednost može biti osmobitna (TOP=255) ,devetobitna(TOP=512) , desetobitna (TOP=1024), može biti definisana sadržajem registra ICR1 ili OCR1A. Pri dostizanju TOP vrednosti setuje se TOV1 fleg registra TIFR. Ako su prekidi globalno dozvoljeni i ako je ova vrsta prekida dozvoljena poziva se prekidna rutina TIMER1OVF.Output compare jedinica stalno poredi sadržaj brojačkog registra sa sadržajem registara OCR1A i OCR1B. Kada dođe do poklapanja setuju se flegovi OCF1A ili OCF1B i u zavisnosti od stanja bitova COM1A1,COM1A0,COM1B1,COM1B0 registra TCCR1A menjaju se stanja na pinovima OC1A i OC1B. Na ovaj način se generišu odgovarajući talasni oblici. U ovom režimu rada registri OCR1A i OCR1B su duplo baferovane , svaka promena sadržaja ovih registara ima efekta tek nakon što brojač dostigne TOP vrednost.

Slika 2.17 FastPWM mod

Page 32: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

32

Univerzalni sinhroni i asinhroni serijski prijemnik i predajnik

USART

USART mikrokontrolera je predviđen za serijsku komunikaciju mikrokontrolera sa drugim uređaja. Može raditi u sinhronom i asinhronom režimu. Mikrokontroler može raditi i u full duplex režimu rada. U ovom režimu rada je moguće nezavisno i istovremeno slati i primati poruke. Kada mikrokontroler radi u sinhronom režimu moguće je rad u master ili slave modu. Podaci koji se prenose mogu biti širine 5,6,7,8 ili 9 bita. Moguće je koristiti 1 ili 2 stop bita. Kontrola parnosti je realizovana hardverski i u slučaju greške setuje poseban fleg.

Slika 2.18 Blok šema univerzalnog sinhronog

i asinhronog serijskog predajnika i prijemnika USART

Vizuelno se izdvajaju tri bloka USART-a. Prvi je generator takta clock generator , predajnik transmitter i prijemnik receiver. Tu su još i tri zajednička kontrolna registra preko kojih se upravlja radom USART-a. To su registri UCSRA,UCSRB i UCSRC. Pored ovih registara u kontrolne registre spada i šesnaestobitni registar UBBR preko koga se definiše brzina prenosa podataka.

Page 33: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

33

Registar UDR se nalazi na istoj adresi i za prijemnik i za predajnik. Za prijemnik je ovaj registar organizovan kao FIFO bafer koji se sastoji od dva registra. Generator takta na osnovu vrednosti upisane u UBBR registar generiše taktni signal za prijemnik i predajnik. USART podržava 4 moda rada. To je normalni asinhroni,double speed asinhroni , master sinhroni i slave sinhroni mod. U slave sinhronom modu se koristi spoljnji takt sa pina XCK. U svim drugim modovima takt se generiše interno .

Slika 2.19 Frame format signala podataka koji se prenose preko serijske veze

Početka slanja podataka počinje start bitom nakon koga sledi određeni broj bitova podataka , zatim bit parnosti i na kraju jedan ili dva stop bita. Start i stop bitovi služe za sinhronizaciju između dva uređaja koji komuniciraju putem serijske veze. Jedna od preporuka pri radu sa serijskom vezom je ta da se ne uzima kristal koji ima frekvenciju koja nije delilac baudrate-a koji se koristi.Tako je pri realizaciji ovog uređaja bilo dosta problema oko pravilnog setovanja bitova za serijsku vezu.Rešenje je kod generator CodeVision-a koji je generisao tačne vrednosti za setovanje registara. Stvar je u tome da ako se računa prema formuli

116

−×

=BAUD

fUBBR OSC gde je OSCf =8000000 Hz frekvencija kristala koji se

koristi,BAUD je usvojeni baud rate koji je 19200 . Kada se sračuna vrednost koju treba upisati u registar UBBR po ovoj formuli i kada se ona unese u program serijska veza ne radi uopšte. Kada se za UBBR vrednost registra upiše vrednost koju je generisao kod generator serijska veza radi perfektno. Detaljne informacija kako se inicijalizue format podataka se nalaze u fajlu 2466.pdf na stranama od 150 do 161.

Slanje podataka

Predaja podataka je omogućena ako je bit TXEN registra UCSRB setovan.Omogućavanjem predajnika preuzima se kontrola na pinom TxD od strane USART-a. Preko ovog pina se šalju podaci. Slanje počinje upisivanjem podatka u registar UDR. Podatak se kopira u shift registar odakle se šalje bit po bit na pin TxD brzinom definisana sadržajem registra UBBR. Pomerački shift registar prihvata novi podatak tek po završetku slanja prethodnog. Nakon kopiranja podatka u pomerački registar setuje se UDRE USART Data Register Empty fleg registra UCSRA. Ako su prekidi globalno omogućeni i ako je bit UDRIE registra UCSRB setovan poziva se prekidna rutina USART UDRE sa brojem 13 u interapt tabeli. Tek nakon što je setovan UDRE fleg dozvoljen je upis novog podatka u UDR registar. Ako pomerački registar pošalje podatak i ako nema novog podatka u UDR registru setuje se TXC fleg

Page 34: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

34

registra UCSRA. Ako je setovan TXCIE bit registra UCSRB i ako su globalno dozvoljeni prekidi poziva se prekidna rutina broj 14 USART Tx complete. TXC fleg se automatski briše pozivom ove interapt rutine. Predajnik se isključuje brisanjem bita TXEN registra UCSRB.

Prijem podataka Prijemnik se uključuje setovanjem bita RXEN registra UCSRB. Tada USART preuzima kontrolu nad pinom RxD. Prijemnik poseduje pomerački registar koji preko RxD pina prima podatke. Nakon završetka prijema podatak se kopira u UDR registar koji je organizovan kao FIFO bafer koji se sastoji iz dva registra. Ovaj bafer deli istu I/O adresu kao i predajni bafer. Korisnik ovaj bafer vidi kao UDR registar. Nakon čitanja podatka iz UDR registra podatak ne ostaje više u baferu jer na njegovo mesto dolazi novopristigli podatak. Ako novi podaci ne pristižu nakon čitanja bafer se prazni. Podatak se može samo jedanput pročitati iz UDR registra. Posle onemogućavanja prijemnika isto dolazi do brisanja UDR registra. Nakon prijema svih bitova jednog podatka setuje se RXC fleg registra UCSRA. Ako su prekidi globalno omogućeni nakon setovanja bita RXC poziva se prekidna rutina broj 12 USART Rx complete . RXC fleg se briše čitanjem podataka iz registra UDR. USART prijemnik kontroliše dodatna 3 flega koji signaliziraju da li je došlo do greške u prijemu podataka. To su flegovi FE( Frame Error), DOR (Data OverRun) i PE(Parity Error). Ovi flegovi se nalaze unutar registra UCSRA.

Detaljan opis registara USART-a se nalaze na stranama od 164 do 172 dokumenta 2466.pdf .

Page 35: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

35

2.4 Kolo za transliranje signala TTL/RS232/CMOS

Jedan od problema koji se javio pri realizaciji ovog uređaja je bio i taj što su naponski nivoi USART-a mikrokontrolera i GSM modema različiti. Naponski nivo USART-a mikrokontrolera je zasnovan na naponskim nivoima TTL logike,5V UART, dok su kod modema naponski nivoi zasnovani na CMOS 2.8 V logici.

TTL nivo signala

Logička jedinica HIGH 3.6 - 5V Logička nula LOW 0 - 0.9V

Specifikacija logičkih nivoa mikrokontrolera

CMOS nivo signala Logička jedinica HIGH 2.2 - 3V

Logička nula LOW 0 - 0.35V Specifikacija logičkih nivoa GSM modema

Kao što se vidi iz tabela postoje razlike između naponskih nivoa ova dva uređaja. Dodatni problem je taj što se mora omogućiti mogućnost praćenja podataka ,koje šalje modem ,na računaru. Problem je rešen upotrebom dva kola MAX232N .

Slika 2.20 Principijelna šema translatora signala

Iz tabela o naponskim nivoima se vidi da se ovi signali razlikuju samo u naponskim nivoima. RS232 interfejs se razlikuje i po nivou i po polaritetu signala. Koriste se dva MAX232 čipa zato što prvi invertuje signal koji se može direktno odvesti na serijski port računara, a drugi opet invertuje signal koji se preko dve zener diode od 3.3V direktno vodi na GSM modem. Na serijski port računara se vodi signal TxD GSM modema,odnosno podaci koje šalje modem. Na sledećoj slici se nalazi šema ovog kola .

Page 36: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

36

Slika 2.21 Šema veza kola za transliranje signala TTL/RS232/CMOS

Praćenje podataka koji stižu sa modema na računar je korišćeno samo u fazi razvoja softvera. Ovakav uređaj koji je u mogućnosti da nadgleda podatke koji se šalju sa serijske veze ,bez ometanja prenosa, naziva se snifer. U gotovom uređaju ovaj interfejs je izostavljen, a opis je dat da bi se stekla slika o tome šta je sve potrebno imati od dodatnih alata da bi se razvio jedan ovakav uređaj.

2.5 NAPAJANJE

Napajanje je realizovano pomoću dva linearna regulatora napona. Na ulazu napajanja se nalazi transformator prenosnog odnosa 220V / 15V .Sniženi napon se posle transformatora vodi na Grecov most odakle se tako ispravljen vodi na ulaze naponskih regulatora. Regulator napona LM317T je upotrebljen za stvaranje stabilnog napona od 3.8V koji služi za napajanje GSM modema. Napajanje od 3.8V projektovano je za struju od 2A prema uputsvima koja se nalaze u fajlu GM862hardwareuserguide.pdf. Napajanje mora da ispuni uslov da pri pojavi pika struje od 2 A napon ne padne ispod 3.4 V. Ako ovaj uslov nije ispunjen u toku rada kada se desi ovaj strujni pik može doći do iznenadnog gašenja modema.Nakon prvog uključenja sklopa sa stabilizatorom LM317T potrebno je podesiti izlazni napon na vrednost od 3.8 V . To se radi podešavanjem otpornika R9 dok je voltmetar priključen na izlazu stabilizatora . Pored ovog napajanja za uređaj je potrebno i napajanje od 5V za mikrokontroler i translator signala. Za ovaj napon je upotrebljen stabilizator napona 7805 u standardnoj konfiguraciji . Oba stabilizaora bi trebalo montirati na hladnjake radi boljeg i efikasnijeg hlađenja. Na sledećoj slici je data šema veza celokupnog napajanja.

Page 37: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

37

Slika 2.22 Šema veza napajanja

Page 38: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

38

3 Razvojni alati Za pisanje i testiranje softvera potreban je dobar razvojni alat. Za ovaj

diplomski rad izabrano je CodeVision AVR razvojno okruženje. Za testiranje datog softvera upotrebljen je razvojni sistem EASY AVR 3 firme mikroelektronika. U narednim redovima biće dat detaljan opis razvojnog okruženja i razvojnog sistema .

3.1Razvojni softver CodeVision AVR

Kompanija HP infotech nudi veoma dobar i upotrebljiv softver za razvoj programa pisane na jeziku C za Atmel mikrokontrolere .CodeVision AVR je aplikacija koja se izvršava pod Microsoft Windows operativnim sistemima i koja sadrži :

• Editor izvornog koda u C jeziku • Projekt menadžer • Serijski terminal sa mogućnostima snimanja primljenih podataka u fajlove,kao

i slanje unapred pripremljenih fajlova • Automatski program generator i In-system programmer za Atmel familiju

mikrokontrolera Slika 3.1 Galvni prozor alata CodeVision AVR

Posle startovanja programa pojavljuje se glavni prozor kao na slici iznad . Da bi mogao da se unose izvorni kod mora prvo da se kreira projekat. Kreiranje

novog projekta se vrši klikom na Create new file . Nakon toga se pojavljuje sledeći prozor

Page 39: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

39

Čekirati opciju Project i kliknuti na OK. U sledećem prozoru koji nudi kreiranje projekata uz pomoć kod generatora izabrati opciju NO.

Dodeliti ime projektu i snimiti ga. Nakon toga se pojavljuje Configure Project prozor u kome se u tabu C Compiler podešavaju podaci o vrsti projekta.Sledeći prozor pokazuje kako treba podesiti projekat za ovaj rad.

Kliknuti na OK. Nakon toga je potrebno otvoriti novi source kod prozor i uključiti

ga u projekat. To se radi klikom na ikonicu Create new file . U novootvorenom prozoru čekirati Source i pritisnuti OK. Nakon toga uneti izvorni C kod u tom novootvorenom prozoru. Snimiti source kod i nakon toga je potrebno

kliknuti na ikonicu i kliknuti na Add ikonicu i dodati C source kod fajl.Posle ovoga projekat je spreman za kompajliranje i linkovanje. To se radi

pritiskom na ikonicu Make project .Ako je program korektno napisan pojavljuje se sledeći prozor koji prikazuje osnovne podateke o iskompajliranom programu.

Page 40: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

40

Posle ovoga potrebno je *.hex fajl upisati u mikrokontroler.Pored ovog fajla kompajler generiše i fajlove tipa *.coff , *.asm , *.vec. Značenje ovih fajlova je sledeće :

• coff fajl služi za AVR Studio debuger .Uz pomoć ovog fajla se moze debagovati program korak po korak ,uz vizuelno praćenje stanja registara. AVR Studio debuger je besplatan softver koji se može naći na Atmelovom web sajtu.

• asm fajl je listing asemblerskog koda koji je dobijen kompajliranjem izvornog C fajla.

• vec fajl je fajl sa listom iskorišćenih interapta u programu. Serijski terminal U okviru CodeVision okruženja postoji i serijski terminal.Serijski terminal se

pokreće klikom na ikonicu . Podešavanje serijskog terminala se vrši izborom opcije Terminal , pod menijem Settings u glavnom prozoru .

Slika 3.2 Prozor za podešavanje serijskog terminala

Page 41: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

41

Slika 3.3 Izgled prozora serijskog terminala

Kod generator čarobnjak Jedna od veoma korisnih stvari je kod generator čarobnjak.Pokreće se klikom

na ikonicu . Na slici je prikazan prozor kod generatora. U ovom prozoru se podešava za koji tip procesora se generiše kod,frekvencija,stanje portova,podešavanje brojača , podešavanje serijske veze , jednom reči sve što se može podesiti za jedan mikrokontroler može se podesiti odavde. Nakon završenog podešavanja potrebno je u meniju File izabrati opciju Generate,Save and exit. U source prozoru je pojavljuje izgenerisani kod sa komentarima kod generatora.

Slika 3.4 Prozor kod generatora Slika 3.5 Izgled generisanog koda

Page 42: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

42

3.2 Razvojni hardver EASYAVR 3

Za razvoj softvera je korišćen razvojni sistem EasyAVR3 firme

Mikroelektronika.Ovaj razvojni sistem ima na sebi USB 2.0 programator koji sa softverom AVRprog omogućava jednostavno upisivanje *.hex fajla u memoriju mikrokontrolera.Ovaj razvojni sistem podržava 8,20,28,40 pinske mikrokontrolere.Ploča je veoma pregledna sa jasno obeleženim jumperima i prekidačima. Napajanje sistema može biti iz eksternog napajanja ili preko USB porta. Sistem EasyAVR3 sistem podržava karakter LCD kao i grafički LCD. Ovaj razvojni sistem uključuje sledeće :

• RS-232 komunikaciju • mogućnost podešavanja portova da budu Pull up ili Pull down

stanju pomuću jednog jumpera • 32 tastera za potrebe testiranja i razvoja programa • 32 led diode za prikaz stanja svih pinova u isto vreme • mogućnost promene kristala • LCD 2x16 karaktera • USB 2.0 programator • DAC konvertor • slot za MMC/SD kartice • Reset kolo za mikrokontroler Zbog toga što već ima integrisane tastere i led diode veoma je jednostavno pratiti stanje pojedinih portova tokom izvršavanja programa.

Slika 3.6 razvojnog sistema EASY AVR3

Posle priključenja razvojne ploče na USB port računara i nakon instalacije odgovarajućih drajvera sledi instalacija programa AVRprog. Nakon instalacije i pokretanja programa AVRprog ima se sledeći prozor

Page 43: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

43

Slika 3.7 Glavni prozor programa AVRprog Procedura za upis programa u mikrokontroler je sledeća:

1. U padajućem meniju Device izabrati oznaku mikrokontrolera koji se programira. U ovom slučaju ATmega16

2. U padajućem meniju Device frequency [MHz] izabrati frekvenciju na kojoj radi mikrokontroler.Za ovaj rad mikrokontroler je podešen da radi na 8 MHz

3. U okviru dela FUSE Bits u padajućem meniju za izbor Clock-a izabrati opciju External Clock

4. U fajl meniju izabrati opciju Load HEX i izabrati hex fajl koji je kompajler napravio

5. Kliknuti na taster Write . U status baru Progress se može videti stanje upisivanja.Ako je sve upisano kako treba program izbacuje sledeći prozor

Ovim je procedura upisa programa u mikrokontroler završena.

Page 44: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

44

3.3 „Hardverski debuger“ – LCD displej

Za razvoj uređaja koji komunicira preko serijske veze veoma je važno smisliti na koji način ćete pratiti podatke koji se razmenjuju preko serijske veze.Pored već opisanog snifera postoji I druga mogućnost a to je LCD displej. Za tu svrhu u ovom radu je upotrebljen LCD displej na razvojnom sistemu EASY ARV3. Za ovu razvojnu ploču ne stižu biblioteke za LCD displej na C jeziku. Zbog ovoga se ne može koristiti predviđeno podnožje za displej ne razvojnoj ploči već se mora napraviti adapter za displej. Pošto CVAVR razvojno okruženje poseduje već gotove biblioteke za LCD displej,adapter je napravljen u skladu sa uputstvom koje je dato u jednom od example fajlova. LCD displeji 2x16 karaktera potrebno je spojiti na sledeći način da bi on radio na razvojnoj ploči EASYAVR3 :

Slika 3.8 Pinovi LCD displeja

Slika 3.9 LCD displej na razvojnoj ploči Slika 3.10 Izgled pinova porta

Page 45: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

45

Šema povezivanja LCD displeja na port C mikrokontrolera

LCD displej ATMEGA 16 pin signal pin signal 1 GND 10 GND 2 +5V 9 VCC 3 V0- napon za LCD

kontrast V0 pin na postolju za grafički displej

V0

4 RS 1 PC0 5 R\W 2 PC1 6 E 3 PC2 11 DB4 5 PC4 12 DB5 6 PC5 13 DB6 7 PC6 14 DB7 8 PC7

Kao test za proveru da li je LCD displej dobro spojen može poslužiti sledeći program. #include <mega16.h> // LCDje priključen na PORTC #asm .equ __lcd_port=0x15 ;PORTC #endasm // include LCD driver rutinu #include <lcd.h> void main(void)

// inicijalizacija LCD displeja 2 reda & 16 kolona lcd_init(16); // idi na drugu kolonu u prvom redu lcd_gotoxy(0,1); // pokaži poruku lcd_putsf("Hello world"); //stani ovde

while (1); Kao rezultat izvršavanja ovog programa na displeju bi trebalo da se pojavi Hello world poruka. LCD displej je korišćen u razvoju programa kao neka vrsta dibagera. Sve problematične i sumljive promenljive su u toku razvoja programa preusmeravane na LCD displej. U finalnoj verziji hardvera i softvera uređaja LCD displej je uklonjen.

Page 46: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

46

4 Organizacija softvera

Kompletan softver se sastoji iz 5 fajlova i to :

• main.c – inicijalizacija i glavni programski tok • AVRSMS_api.c – inicijalizacija modema,upravljanje porukama • AVRSMS_com.c –komande za podešavanje komunikacije između

modema i mikrokontrolera,interapt rutina • AVRSMS_tools.c – funkcije za rad sa tekstom poruke • decode.c -- funkcija koja ispituje validnost SMS poruke

Organizacija softvera je podeljena na tri funkcionalna bloka i to :

• Inicijalizacija • Glavni program • Prekidna rutina(interrupt)

4.1 Inicijalizacija Na početku glavnog programa se vrši inicijalizacija modema,mikrokontrolera i interapt rutine. Ovo se vrši pozivanjem funkcije MAIN_init( ) ,čiji se kod nalazi u main.c sekciji. Ova funkcija nema ulaznih vrednosti i ne vraća ni jednu vrednost.Detaljan opis ove funkcije je dat u listingu programa.

U okviru MAIN_init funkcije se prvo poziva f-ja COM_init( ) koja inicijalizuje UART mikrokontrolera na 19200 bauda brzine i formata podataka od dužine 8 bita sa jednim stop bitom i bez kontrole parnosti ,8N1 format. Zbog upotrebe kristala od 8MHz postoji problem pri setovanju parametara serijske veze jer frekvencija kristala nije delilac brzine serijske veze. Problem se ispoljava da serijska veza ne radi iako su registri UCSRA,UCSRB,UCSRC,UBRRH,UBRRL podešeni kao što je savetovano u pdf dokumentu 2466 za mikrokontroler ATMEGA16, koji se nalazi na propratnom CD-u. Tu na scenu stupa veoma upotrebljiv kod generator CodeVision kompajlera. Pokretanjem kod generatora on generiše ispravne vrednosti za ove registre . Da bi serijska veza uopšte radila potrebno je da se nakon upisivanja ispravnih vrednosti u registre napravi pauza od 10 ms da bi se izvršila sinhronizacija registara. Nakon pauze od 10 ms poziva se funkcija COM_PWM_init() koja podešava fast PWM mod rada brojača1 (TIMER1) mikrokontrolera. Funkcija nema ni ulaznih ni izlaznih parametara. U izvornom kodu funkcije se nalaze detaljni komentari.

Page 47: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

47

Slika 4.1 Algoritam funkcije MAIN_init()

Page 48: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

48

4.2 Glavni program Glavni program se vrti u beskonačnoj petlji čekajući da se promeni

vrednost fleg promenljive rx_ack. Promenljivu rx_ack setuje interapt rutina kada se na serijskoj vezi pojavi niz znakova +CMTI, odnosno kada stine nova SMS poruka. Pošto je ispunujen uslov da je rx_ack jednak jedinici glavni program dalje čita indeks poruke koji se nalazi u prihvatnom nizu karaktera u programu nazvanom rx_buffer . rx_buffer je niz karaktera tipa static unsigned char. Tipa je static zato što mora da sačuva vrednost elemenata niza tokom više poziva funkcija zaredom. Pošto je poruka stigla modem joj automatski dodeljuje indeks pod kojim se pamti u memoriji SIM kartice. Podatak o indeksu se nalazi u prihvatnom nizu rx_buffer. Pozivanjem funkcije TOOLS_decodeCMTI kao povratna vrednost, ako je sve u redu , dobija se indeks poruke. Na osnovu indeksa poruke se može pročitati sadržaj poruke. To se radi pozivom funkcije API_readmsg. Ovoj funkciji se kao ulazni parametri prosleđuje promenljiva read_index koja nosi informaciju koja se poruka želi pročitati. Promenljivu brzina koja služi za to da se u slučaju dolaska komande START XXXX zapamti vrednost komandovane brzine(umesto XXXX treba da stoji zadata brzina ) menja funkcija API_readmsg. Kao povratna vrednost ove funkcije ima se brojčana vrednost i to vrednost 0 ako je stigla komanda START XXXX, vrednost 1 ako je stigla komanda STOP ,vrednost 2 ako je stigla komanda REPORT.

Ako je stigla komanda START na osnovu zadate brzine se proračunava koju vrednost treba upisati u output compare registar brojača 1 da bi se na OCR1A izlazu mikrokontrolera,pin 19, generisao napon srazmerne vrednosti. Generisani napon se preko low pass filtera filtrira i vodi na analogni ulaz IRDAK modula. Formula po kojoj se računa koju vrednost treba upisati u OCR1A je sledeća

speednombrzinaAOCR

_*2551 = . Brzina je vrednost koja se zadaje SMS porukom a

promenljiva,odnosno konstanta nom_speed je unapred zadata nominalna brzina motora. Za ovaj rad usvojeno je da je nominalna brzina 1500 ob/min. Maksimalni izlazni napon PWM izlaza je 5 V. Ovde kod ovog računanja dolazi do prekoračenja opsega integera pa se mora voditi računa o tipu promenljive u koju se smešta rezultat.

ocrtAOCRlloonnggocrt

speednomlonglloonngglloongg

brzinalonglonglloonngg

_1(int)_

)_(

)(*255)(

==

=

=

Kao što se vidi u tri koraka se rešava problem oko prekoračenja opsega jednostavnim proširivanjem promenljivih od tipa int na tip long, upotrebom cast operatora. Prvo se ima operacija množenja pa posle i operacija deljenja. Na kraju se rezultat operacije ima promenljiva tipa long koja se uz pomoć cast operatora (int) pretvara u promenljivu tipa int koja se smešta u registar OCR1A. Kao vizuelna indikacija da je stigla komanda START ima se uključivanje prve crvene led diode na portu B pin 0. Ostale led diode za indikaciju su ugašene. U slučaju da je stigla komanda STOP , na izlazu se generiše napon od 0V koji zaustavlja motor. Kao indikacija da je pristigla komanda STOP ima se uključivanje žute led diode na portu B pin 1. Ostale led diode za indikaciju su ugašene.

Page 49: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

49

Prilikom dolaska SMS poruke koja sadrži komandu REPORT , mikrokontroler korisniku šalje SMS poruku sa podatkom o trenutnoj brzini koja je zadata. Indikacija da je pristigla komanda REPORT je uključivanje crvene led diode na portu B pin 2. Ostale led diode za indikaciju su ugašene. Posebna pažnja se mora posvetiti memoriji za čuvanje SMS poruka. U slučaju da dođe do popune mesta u memoriji SIM kartice onemogućeno je pristizanje novih SMS poruka. To znači da je uređaj u takvim slučajevima neupotrebljiv. Da bi se izbeglo ovo u glavnom programu je ugrađen mehanizam koji proverava indeks poslednje pristigle poruke. Ako je SIM kartica prazna ,nema sačuvanih SMS poruka na sebi , svaka novopristigla SMS poruka će imati indeks za jedan veći od prethodne. Kada se ovo zna lako je napraviti uslov koji će proveravati koliko je popunjeno mesta na SIM kartici i ako je indeks veći od zadatog broja obrisati sve poruke sa SIM kartice. Broj SMS poruka koje se mogu zapamtiti na SIM kartici zavisi od toga koliko memorije poseduje SIM kartica. Kartica koja je korišćena za ovaj rad ima memoriju za smeštanje 30 SMS poruka. Iz ovoga proizilazi da zadati broja za proveru indeksa mora biti manji od 30. Brisanje SMS poruka se vrši pozivom funkcije API_deletemsg(). Ulazni parametar ove funkcije je indeks poruke koja se želi obrisati. Da bi program bio sposoban da prihvati novu SMS poruku mora se inicijalizovati prekidna rutina i moraju se resetovati sve promenljive koje se koriste u obradi poruke. To se postiže pozivom sledećih funkcija :

• COM_setSearchString( CMTI_ ) - pozivom ove funkcije se podešava koji niz karaktera mikrokontroler čeka na serijskoj vezi. U ovom slučaju podešava se da čeka pojavljivanje stringa +CMTI:

• COM_rx_reset( ) – ova funkcija resetuje vrednosti promenljivih rx_ack,rx_i, rx_wr_i , rx_overflow , rx_buffer[ rx_wr_i ] = '\0' na inicijalne vrednosti. Naravno pre reseta ovih promenljivih funkcija onemogućava RxD interapte

• COM_rx_on( ) - omogućava RxD interapte Nakon ovoga program je spreman za prihvatanje i obradu novih SMS poruka. Listing glavnog programa se nalazi na kraju rada. Glavni program se nalazi u fajlu main.c koji je detaljno komentarisan. Slika 3.2.1 prikazuje algoritam glavnog programa.

Page 50: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

50

Slika 4.2 Algoritam glavnog programa

Page 51: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

51

4.3 RxD interapt rutina

Interapt rutina se nalazi u fajlu AVRSMS_com.c, gde je detaljno komentarisana. Ona se izvršava pri svakom dolasku podatka na serijsku vezu,naravno pod uslovom da su prekidi globalno dozvoljeni i da je RxD prekid omogućen. U ovom programu prekid ima dvojaku ulogu. Prva uloga je da skuplja podatke koji dolaze preko serijske veze i da ih smešta u prihvatni niz rx_buffer. Druga uloga je provera da li je preko serijske veze stigao očekivani niz znakova . Interapt rutina je napisana tako da se može koristiti za prepoznavanje više različitih nizova znakova.Ovo je potrebno zbog toga što se dolazak nove poruke manifestuje dolaskom niza znakova „+CMTI:“ preko serijske veze , a završava se nizom znakova <CR><LF>. Između ova dva niza znakova se nalaze i podatak o indeksu poruke,tj. mesta na SIM kartici gde je snimljena. Kada stigne SMS poruka preko serijske veze se dobijaju sledeći podaci +CMTI: "SM",17 <CR><LF> . Naravno da se karakteri <CR><LF> ne vide već se manifestuju novim redom u CVAVR serijskom terminalu. Nakon ključne reči +CMTI: ide string “SM” koji označava gde se čuvaju SMS poruke dok je broj 17 indeks poruke i označava redni broj poruke u memoriji SIM kartice. Da bi novo pristigla poruka mogla da se pročita,interapt rutina mora da smesti u niz sve podatke koji dođu preko serijske veze. Nakon što se dobije indikacija da je pristigla nova poruka glavni program pozivom funkcije

TOOLS_decodeCMTI( ) nalazi indeks poruke,što bi u skladu sa datim primerom bio broj 17. Nakon toga glavni program poziva funkciju API_readmsg( read_index) koja kao parametar ima indeks poruke koja se želi pročitati. Ova funkcija prvo podešava da sledeća tražena reč bude OK<CR><LF> ,pa potom šalje komandu za čitanje poruke. Posle ove poruke modem odgovara listingom poruke koja izgleda ovako

+CMGR: "REC UNREAD","+381642472248",,"06/05/23,23:38:28+84" START 300 OK Kao što se vidi kraj listinga poruke se završava nizom karaktera OK<CR><LF> . Ovaj niz znakova se nalazi u prihvatnom nizu rx_buffer.U ovom nizu se nalazi i telo poruke koje je od važnosti za nas.Telo poruke se analizira tako što se prvo pozivom funkcije TOOLS_decodeCMGR dobije pointer na prvi karakter pristigle poruke.Potom se poziva funkcija decode_sms kojoj se kao parametar prosleđuje pointer koji pokazuje na prvi karakter poruke. Ova funkcija analizira tekst poruke I upoređuje ga sa unapred definisanim komandama. Unapred definisane komande se nalaze u nizu AM_CMD[CMD_COUNT]="START","STOP","REPORT". U slučaju da se u telu poruke nalazi neka od traženih komandi funcija vraća vrednost indeksa te poruke. U suprotnom ako nije pronađena ni jedna komanda vraća vrednost -1. Funkcija interapt rutine je da stavi u niz sve karaktere koji dođu sa serijske veze i da signalizira dolazak nove SMS poruke. Veoma je teško uraditi opis interapt rutine a da se ne spomenu funkcije koje se izvršavaju van nje a indirektno utiču na njen rad .

Page 52: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

52

Slika 4.3 Algoritam interapt rutine

Page 53: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

53

4.4 Zaključak Na kraju kada se sklopi hardver i softver dobija se uređaj koji izgleda kao na slici

Izgled prototipa GSM kontrolera

Crveni taster sa leve strane je reset taster mikrokontrolera,dok je crveni taster sa desne strane reset GSM modema. Crni taster ima funkciju uključenja i isključenja GSM modema. Kao signalni elementi o statusu i radu uređaja iskorišćene su LED diode. Kada se uključi GSM modem uključuje se crvena led dioda ,dok žuta led dioda koja se nalazi ispod crvene,se gasi i pali intervalom od 0.3s. Nakon nekoliko sekundi koliko je potrebno modemu da pronađe mrežu žuta led dioda počinje da se pali i gasi intervalom od 1s. Za to vreme mikrokontroler je pokušao da inicijalizuje modem ali bezuspešno. Kao signal da inicijalizacija nije uspela je rad žute led diode. Tek pošto je modem pronašao GSM mrežu pritiskom na taster za reset mikrokontrolera on pokušava ponovo da inicijalizuje modem. Kao rezultat da je operacija uspela ima se rad dve crvene led diode koje se nalaze levo i desno od žute. Tek sada je uređaj spreman za rad i primanje komandi preko SMS poruka. Ako je putem SMS stigla komanda START uključuje se samo prva crvena led dioda.U slučaju dolaska komande STOP uključuje se žuta led dioda dok se ostale gase. Pri dolasku komande REPORT uključuje se krajnja crvena led dioda dok se ostale isključuju. Ako nije došla ni jedna od podržanih komandi kao signal greške uključuju se sve tri led diode. Ovim je ukratko opisano ponašanje uređaja. Posle skoro pola godine razvoja ovog uređaja imam utisak da može još mnogo toga da se uradi na unapređenju i softvera i hardvera. Verovatno sigurno i može ali je vreme taj faktor koji ograničava mnoge stvari pa tako rad na ovom uređaju. Mnogo je radnih sati uloženo u ovaj diplomski rad pa se nadam da je će uređaj zasnovan na ovakvom principu naći svrhu i upotrebnu vrednost ne samo u industrijskim aplikacijama već možda i u svakodnevnom životu.

Page 54: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

54

5 Source kod – Kompletan listing

main.c #include <mega16.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <delay.h> #define n_nominalno 1500 //testne vrednosti za proveru kako radi brojac #define MAX_MSG_INDEX 25 //ovde treba podesiti do kojeg indexa treba pustiti da se pune poruke //na kartici ima mesta za 30 sms poruka !!!! preko toga ne moze,dakle //index nikada ne sme biti veci od 30 #include"AVRSMS_com.h" #include"AVRSMS_api.h" #include"AVRSMS_tools.h" unsigned char poruka[150]="Brzina je "; //templati teksta poruke koja se salje const unsigned char __flash signature[]=" GSM kontroler by Goran Golubovic 501/98"; ar *k; //! Flag importovan iz AVRSMS_com.c extern int rx_ack; volatile int brzina; //brzina koja se zadaje preko SMS-a //! promenljiva za indeks novih poruka,pogledati glavnu petlju volatile int read_index; int nom_speed=1500;// testna promenljiva //! Prototip funkcije void MAIN_init( void ); /*! \opis inicijalizacije sistema MAIN_init() * * Ova funkcija setuje sledece : * -Korektan baud rate na 19200,jedan stop bit,bez kontrole parnosti,8 bita podataka ,8N1 format * -Inicijalizacija modema * -Inicijalizuje TIMER1 mikrokontrolera za fast PWM mod * -Podesava interapt rutinu da ceka dolazak SMS poruke * -Omogucava serijski transmiter * * \ulazni parametri void * \povratni parametri void */ void MAIN_init( void ) int p; COM_init( ); //baud rate 19200 by code generator delay_ms(10); //cekaj malo da bi se sinhronizovala serijska veza ... COM_PWM_init(); //podesi mod za fast pwm pin PD5 na mikrokontroleru delay_ms(10); //sacekaj malo ... #asm ("sei"); //omoguci globalno interapte

Page 55: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

55

p=API_phoneinit( ); //Inicijalizuj modem za text mode poruke if(p==1) PORTB.0=1;PORTB.2=1; //ako je sve u redu(inicijalizacija uspela)upali prvu i trecu crvenu led diodu else PORTB.1=1; //ako nije uspela inicijalizacija upali zutu led diodu COM_rx_reset( ); //Resetuj buffer za pristigle podatke sa serijske veze COM_setSearchString( CMTI_ ); //Podesi da ceka da na serijsku vezu stigne "+CMTI: ,Storage,index\r\n" COM_rx_on( ); //Omoguci RxD interapt unsigned long int t_ocr; void main( void ) char *tp; int ntest,i; long lloonngg; DDRB=0xFF; //svi portovi porta B su setovani kao izlazni PORTB=0xFF; //ukljuci sve pinove porta B delay_ms(1000); //sacekaj 1 sekundu PORTB=0; //postavi sve pinove porta B na logicku nulu MAIN_init( ); // INICIJALIZACIJA SISTEMA while(1) //Beskonacna petlja if( rx_ack == 1 ) //Stigla je nova SMS poruka read_index = TOOLS_decodeCMTI( ); //Nadji indeks nove poruke ntest=API_readmsg( read_index); //Procitaj novo pristiglu poruku i dekodiraj njen sadrzaj if (ntest ==0 ) //ako je stigla komanda START PORTB=0; //Prvo iskljuci sve pinove porta B PORTB.0=1; //Postavi pin 0 porta B na logicku jedinicu // t_ocr=(int) (((long)brzina* (long )255)/(long)nom_speed);//*brzina; // brzina 0-1500 // nom_speed = (1500) opseg 300 6000 // lloonngg = ((long) 255 * (long) brzina); //preracunaj koliku vrednost treba upisati u registar OCR1A lloonngg = lloonngg / ((long) nom_speed);//da bi se generisao odredjeni napon na PWM izlazu t_ocr = (int) lloonngg;

Page 56: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

56

OCR1A=t_ocr; //ako je stigla nova poruka sa zadatom brzinom else if (ntest ==1) //ako je stigla komanda STOP PORTB=0; //spusti sve pinove porta B na log.nulu PORTB.1=1; //pin 1 porta B postavi na logicku jedinicu t_ocr=0; OCR1AL=t_ocr; //zaustavi motor tako sto ces mu proslediti referencu 0 else if (ntest==2) //ako je stigla komanda REPORT PORTB=0; // spusti sve pinove porta B na logicku nulu PORTB.2=1; //pin 2 porta B postavi na logicku jedinicu itoa(brzina,k); //prebaci integer u char da bi lakse poslao poruku strcat(poruka,k); //dodaj na kraj message poruke sablon poruke strcatf(poruka,signature);//dodaj i potpis :) API_sendmsg(poruka); //posalji poruku else //ako nije stigla ni jedna podrzana komanda PORTB=0; //iskljuci ceo port B PORTB=0xFF; //postavi sve pinove porta B na logicku jedinicu kao signal greske ; if (read_index >MAX_MSG_INDEX) //proveri koji je indeks poruke i ako je veci od zadatog for(i=1;i<MAX_MSG_INDEX;i++) API_deletemsg(i); //obrisi sve postojece poruke na kartici ; COM_setSearchString( CMTI_ ); //inicijalizuj trazeni string na +CMTI za interapt rutinu COM_rx_reset( ); //reset bafera i interapt rutine COM_rx_on( ); //podesi serijsku vezu za prihvatanje podataka

Page 57: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

57

AVRSMS_api.c

#include<mega16.h> #include"AVRSMS_com.h" #include"AVRSMS_tools.h" #include"AVRSMS_api.h" #include"decode.h" //! Eksterni flag iz AVRSMS_com.c extern int rx_ack; const unsigned char __flash GOLUB[]="+381642472248";//broj na koji se salje REPORT poruka //! AT-Set koriscenih komandi const unsigned char __flash ATE0[] = "ATE0\r\n"; //!< Echo off const unsigned char __flash AT_CNMI[]= "AT+CNMI=1,1,,,1\r\n"; //!< Identifikacija nove SMS poruke const unsigned char __flash AT_CPMS[] = "AT+CPMS=\"SM\",\"SM\",\"SM\"\r\n"; //!< Predefinisano skladiste za poruke const unsigned char __flash AT_CMGD[] = "AT+CMGD="; //!< Komanda za brisanje poruke sa zadatog indeksa const unsigned char __flash AT_CMGR[] = "AT+CMGR="; //!< Komanda za citanje poruke sa zadatog indeksa const unsigned char __flash AT_CMGS[]= "AT+CMGS="; //!< Komanda za slanje poruke const unsigned char __flash CRLF[] = "\r\n"; //!< Carrige return Line feed karakteri const unsigned char __flash AT_CMGF[] ="AT+CMGF=1\r\n"; //!< tekst mode za SMS poruke //! Prototip funkcije int API_check_acknowledge( void ); //proveri odgovor od modema /*! \ kratak opis funkcije API_phoneinit() za setup GSM modema * Ova f-ja salje AT komande modemu i ove komande podesavaju sledece * - Iskljucivanje echo-a , ATE0 * - Podesavanje GSM modema za rad u txt modu za SMS poruke, AT+CMGF * - Koriscenje korektnog skladista za poruke , AT+CPMS * - Indikaciju nove poruke , AT+CNMI * * \ulazni parametri void * * \opis povratnih vrednosti * \retval 1 sve je setovano bez greske * \retval 0 greska pri setovanju echo off * \retval -1 greska pri setovanju tekst moda za SMS poruke * \retval -2 greska pri setovanju memorije za poruke * \retval -3 greska pri setovanju indikacije nove SMS poruke */ int API_phoneinit( void ) COM_rx_reset( ); //Resetuj sistem COM_setSearchString( OK_ ); //Podesi da OK bude trazeni string COM_putsf( ATE0 ); //Posalji komandu za echo off COM_rx_on( ); //Omoguci RxD prekide if( API_check_acknowledge( ) > 0 ) //Echo off = OK COM_putsf(AT_CMGF);//Posalji komandu za tekst mode SMS poruka

Page 58: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

58

COM_rx_on( ); //Omoguci RxD prekide if( API_check_acknowledge( ) > 0 ) //tekst mode za SMS = OK COM_putsf(AT_CPMS);//setuj memoriju gde ce se cuvati SMS poruke COM_rx_on( ); //Omoguci RxD prekide if( API_check_acknowledge( ) > 0 ) //definisanje memorije za SMS = OK COM_putsf(AT_CNMI); //Posalji komandu za indikaciju novopristigle SMS poruke COM_rx_on( ); //Omoguci RxD prekide if(API_check_acknowledge()>0) return 1; else //indikacija novopristigle SMS poruke != OK return -3; else //memorija za cuvanje nove SMS poruke != OK return -2; else //tekst mode za SMS poruke != OK return -1; else //Echo off != OK return 0; /*! \opis f-je za brisanje poruke sa zadatim indeksom API_deletemsg() * * Funkcija za brisanje koristi komandu AT+CMGD za brisanje poruke sa indeksom koji je * prosledjen kao ulazni parametar * * * \ulazni parametri index poruke koja se brise * * * * Opis povratnih vrednosti * \ retval 1 Uspesno obrisana poruka * \ retval 0 Greska */

Page 59: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

59

int API_deletemsg( int index ) COM_rx_reset( ); //Resetuj sistem COM_setSearchString( OK_ ); //Podesi OK da bude trazeni string COM_putsf( AT_CMGD ); //Posalji komandu za brisanje poruke COM_put_integer( index ); //a zatim i prosledjeni indeks @index COM_putsf( CRLF ); //kao i terminator karaktere CR+LF COM_rx_on( ); //Omoguci RxD prekide if( API_check_acknowledge( ) > 0 ) //Delete = OK return 1; else //Delete != OK return 0; /*! \opis f-je za slanje SMS poruke API_sendmsg() * * Funkcija za slanje koristi komandu AT+CMGS e * prosledjen kao ulazni parametar * * * \ulazni parametri pointer na tekst poruke koja se salje * * * * Opis povratnih vrednosti * \ retval 1 Uspesno poslata poruka * \ retval -2 Nije poslata poruka,nema odgovora od modema * \ retval -1 Nema odgovora od modema u obliku "> " */ int API_sendmsg( unsigned char *msg ) COM_rx_reset( ); //Obrisi rx_buff bafer COM_setSearchString( READY_ ); //Postavi da "> " bude trazeni string COM_putsf( AT_CMGS ); //Posalji komandu za slanje AT+CMGS COM_putsf(GOLUB); //Posalji broj telefona na koji se salje poruka COM_putsf( CRLF ); //Posalji i terminator poruke CR+LF COM_rx_on( ); //Ukljuci RxD prekide if( API_check_acknowledge() > 0 ) //Cekaj na odgovor koji je jednak = "> " COM_rx_reset( ); //Ocisti rx_buff COM_setSearchString( OK_ ); //Podesi "OK" da bude trazeni string COM_puts(msg); //posalji prosledjeni pointer sa porukom,odnosno tekst poruke COM_putchar( 26 ); // posalji samo Carriage return karakter <CR> COM_rx_on( ); //Ukljuci RxD prekide if( API_check_acknowledge() > 0 ) //Odgovor od modema = OK

Page 60: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

60

return 1; else //Odgovor od modema != OK return -2; else //Odgovor od modema != "> " return -1; /*! \opis f-je za citanje SMS poruke API_readmsg() * * Funkcija za citanje koristi komandu AT+CMGR kojoj je * prosledjen kao ulazni parametar indeks novopristigle poruke * \ulazni parametri indeks poruke koja se cita @indeks * * Opis povratnih vrednosti * \ retval i povratna vrednost funkcija decode_sms * \ retval 0 ako citanje poruke nije uspelo */ int API_readmsg( int indeks ) //! lokalne promenljive unsigned char *encodedmsg; //Pointer na dekodiranu poruku int i; //Inicijalizacija pointera encodedmsg = '\0'; i = 0; COM_rx_reset( ); //Reset sistema COM_setSearchString( OK_ ); //Podesi OK da bude trazeni string COM_putsf( AT_CMGR ); //Posalji komandu za citanje SMS poruke COM_put_integer( indeks ); //posalji i indeks novopristigle poruke @index COM_putsf( CRLF ); //posalji i terminator karaktere CR+LF COM_rx_on( ); //Ukljuci RxD prekid i cekaj na odgovor od modema if( API_check_acknowledge() > 0 ) //Poruka procitana = OK encodedmsg = TOOLS__decodeCMGR( indeks ); //uzmi pointer na prvi znak SMS poruke i= decode_sms(encodedmsg); //pozovi f-ju koja proverava da li je u tekstu poruke stigla neka komanda return i; //vrati integer i kao odgovor sta je stiglo else //Read != OK return 0;

Page 61: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

61

/*! \kratak opis f-je API_check_acknowledge() * * Veoma vazna funkcija . Proverava da li je modem prisutan . * Brojacka petlja je ukljucena da bi se izbeglo cekanje * na odgovor od modema koji nikad ne stigne. * ulazni podaci * \param void * * Izlazni podaci * \retval 1 Korektan odgovor,modem je pristutan * \retval 0 Greska ,modem nije prisutan , time out ili pogresan odziv modema */ int API_check_acknowledge( void ) //! Lokalne promenljive static unsigned int i, ii; //Brojacka petlja koja ceka odgovor for( i = 0; ( rx_ack == 0 ) && ( i < 65535 ); i++ ) for( ii = 0; ii < 10; ii++ ) ; if( rx_ack > 0 ) //Sve radi kako treba ...rx prekid off rx_ack = 0; //Resetuj flag rx_ack return 1; else //timeout ,nema odziva od modema COM_rx_off( ); //Receiver off COM_rx_reset( );//Resetuj bafer i prekidnu rutinu return 0; //Time out ili pogresan odziv modema

Page 62: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

62

AVRSMS_com.c

#include<mega16.h> #include"AVRSMS_com.h" #define UDRE 5 //definicije bitova koji se koriste dalje u programu #define RXC 7 //! Overflow i acknowledge flag int rx_overflow, rx_ack; //! rx buffer static unsigned char rx_buffer[RX_BUFFER_SIZE]; //! pointer static unsigned char searchStr; //! indeks rx buffera static int rx_i; //! index write buffera static int rx_wr_i; //! definicije stringova koji se koriste u programu const unsigned char __flash OK[] = "OK\r\n"; //!< "OK" const unsigned char __flash CMTI[] = "+CMTI: "; //!< Nova poruka je pristigla const unsigned char __flash READY[] = "> "; //!< Modem je spreman za prihvatanje teksta poruke const unsigned char __flash CR_LF[] = "\r\n"; //!< Carrige Return Line Feed const unsigned char __flash *searchFor; //!< Flash pointer const unsigned char __flash *searchStrings[4] = OK, CMTI, READY, CR_LF; //!< Inicijalizacija pointera /*! \kratk opis funkcije COM_init() * * inicijalizuje UART mikrokntrolera na 19200 bauda ,format podataka 8N1 * ulazni podaci void * izlazni podaci * \retval void */ void COM_init( ) // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud rate: 19200 UCSRA=0x00; UCSRB=0x98; UCSRC=0x86; UBRRH=0x00; UBRRL=0x19; COM_rx_reset();

Page 63: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

63

/*! \kratak opis COM_rx_reset * onemogucava RxD prekide ,inicijalizuje promenljive i bafer * \param void * \retval void */ void COM_rx_reset( void ) UCSRB &= ~(1<<RXC); // Onemoguci RX interrupt rx_i = rx_wr_i = 0; //Inicijalizuj promenljive rx_overflow = rx_ack = 0; //overflow flag =0 rx_buffer[ rx_wr_i ] = '\0'; //inicijalizacija bafera /*! \kratak opis COM_rx_on() funkcije * * \param void * \retval void */ void COM_rx_on( void ) UCSRB |= ( 1 << RXC ); // omoguci RxD interrupt /*! \kratak opis COM_rx_off() funkcije * * \param void * \retval void */ void COM_rx_off( void ) UCSRB &= ~( 1 << RXC ); // onemoguci RxD interrupt /*! \kratak opis COM_setSearchStrings() funkcije * ulazni parametri * \param unsigned char,indeks iz niza trazenih stringova * * \retval void */ void COM_setSearchString( unsigned char Response ) UCSRB &= ~( 1 << RXC ); // Onemoguci RxD interrupt searchFor = searchStrings[Response]; //Setuj trazeni string na osnovu ulaznog podatka Response searchStr = Response; //koristi se u interapt rutini rx_i = 0;

Page 64: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

64

/*! \OPIS INTERRUPT RUTINE USART_RXC * * Bafer ove interapt rutine smesta SMS poruku koja je stigla od modema preko serijske veze * Interapt rutina takodje setuje i ack fleg kada stigne SMS poruka */ interrupt [USART_RXC] void usart_rx_isr(void) unsigned char data; //Lokalne promenljive data = UDR; //Uvek procitaj ono sto je stiglo rx_buffer[ rx_wr_i++ ] = data; //Smesti nov podatak u niz if( rx_wr_i > RX_BUFFER_MASK ) //Proveri prekoracenje duzine niza rx_wr_i = 0; //Resetuj write index rx_overflow = 1; //Podesi flag rx_overflow UCSRB &= ~( 1 << RXC ); //Onemoguci RxD interapt if( searchFor[rx_i] == data ) //Testiraj pristigli karakter sa karakterom trazenog stringa rx_i++; if( !searchFor[rx_i] ) //Kraj stringa nove poruke ...primljena je nova poruka ! rx_i = 0; if( searchStr == CMTI_ ) //+CMTI: ako je ovo podeseno da bude trazeni string searchFor = searchStrings[ CRLF_ ]; //podesi trazeni string na CRLF_ searchStr = CRLF_; //potrebno da bi se znalo koja je prethodna rec bila trazena else //Normalan odziv modema rx_ack = 1; //Podesi fleg da je stigla nova poruka UCSRB &= ~( 1 << RXC ); // Onemoguci RxD interapt else rx_i = 0; //pristigli podatak se ne poklapa ... kreni ponovo ...

Page 65: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

65

/*! \kratak opis f-je COM_putchar () * modifikacija ansi c putchar() f-je * \param data karakter za slanje * * \retval data ako je uspesno poslat karakter * \retval -1 ako se javio timeout */ int COM_putchar( unsigned char data ) //Lokalne promenljive unsigned int i; for( i = 0; !( UCSRA & ( 1 << UDRE ) ); i++ ) // Cekaj da se isprazni TxD bufer if( i > RX_WAIT ) //koliko dugo treba da ceka return -1; //vrati -1 ,bafer se nije ispraznio ,timeout UDR = data; // Pocni transmisiju return (int)data; //Castuj i vrati vrednost int /*! \kratak opis f-je COM_put_integer () * * modifikacija ansi c putchar() f-je * * * ulazni podatak * \param i integer koji se salje preko serijske veze * * povratna vrednost * \retval void */ void COM_put_integer( int i ) //! Lokalne promenljive int ii; unsigned char int_buf[5]; if (i < 0) //Integer je negativan i = -i; //konvertuj ga u pozitivan Integer COM_putchar('-'); //Print - znak for (ii=0; ii < 5; ) //Konvertuj Integer u znakovni niz int_buf[ii++] = '0'+ i % 10; //nadji Carry koristeci mod operaciju i = i / 10; //pomer MSB bit do ii--; while( (int_buf[ii] == '0') && (ii != 0) ); //skloni vodece nule do COM_putchar( int_buf[ii--] ); while (ii >= 0); //POsalji int->char konverziju niza

Page 66: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

66

/*! kratak opis f-je COM_puts * Salje string karakter po karakter preko serijske veze * ulazni parametri * \param str Pointer na string koji se salje * izlazni parametri * \retval void */ void COM_puts(unsigned char *str) for( ;*str != '\0'; ) //dok ne dodjes do kraja niza COM_putchar( *str++ ); //salji karater preko serijske veze /*! kratak opis f-je COM_putsf() * * Salje karakter po karakter stringa koji se nalazi u FLASH memoriji * ulazni podaci * \param fstr Pointer na string koji se nalazi u flash memoriji * povratne vrednosti * \retval void */ void COM_putsf( const unsigned char __flash *fstr ) for( ;*fstr != '\0'; ) //dok ne dodjes do kraja stringa COM_putchar( *fstr++ ); //salji karakter po karakter preko serijske veze /*! kratak opis f-je COM_trim() * Posto prihvatni rx_buffer ima na kraju karaktere "OK\r\n" ova f-ja ih uklanja * ulazni parametri * \param void * izlazni parametri * \retval i duzina skracenog baffera bez uklonjenih karaktera */ int COM_trim( void ) //! Lokalne promenljive int i; unsigned char temp; for( i = rx_wr_i - 1; i >= 0; i--) //Prodji kroz prihvatni bafer unazad temp = rx_buffer[i]; //rx_buff[i] stavi u temp if( ( temp != '\r' ) && ( temp != '\n' ) && ( temp != 'O' ) && ( temp != 'K' ) ) //ako nisu jednaki 'O', 'K', '\r' or '\n' break; //break prekini rx_buffer[ i+1 ] = '\0'; //Dodaj string za kraj niza \0 return i; //Vrati novu duzinu

Page 67: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

67

/*! kratak opis f-je COM_gets() * ulazni parametri * \param void * izlazni parametri * \retval rx_buffer Pointer na prihvatni RX bafer */ unsigned char* COM_gets( void ) return rx_buffer; /*! kratak opis f-je COM_PWM_init() * * f-ja inicijalizuje mikrokontrolera za rad u 8-bitnom fast PWM modu. * * * ulazni parametri * \param void * izlazni parametri * \retval void */ void COM_PWM_init(void) DDRD.5=1; //svi pinovi su setovani kao izlazni // OCR1A mora port da bude setovan kao izlzni!!!!!! PORTD.5=0; //sve pinove na portu stavi na nulu TCCR1A=0b10000001; TCCR1B=0b00000101; //preskaler 1024 TCNT1H=0x00; TCNT1L=0x01; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; //menjanjem samo OCR1A se postize razlicita vrednost za izlazni napon OCR1BH=0x00; OCR1BL=0x00;

Page 68: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

68

AVRSMS_tools.c

#include"AVRSMS_com.h" #include"AVRSMS_tools.h" #include <stdlib.h> /*! kratak opis f-je TOOLS_decodeCMTI() * Ova funkcija trci kroz rx_buffer sve dok ne naleti na ',' karakter.Ako je ovaj * karakter pronadjen u baferu sledeci karakter koji se trazi je \n.Karakteri koji cine * niz izmedju ova dva znaka su indeks poruke. * * ulazni parametri * \param void * * izlazni parametri * \retval i indeks novopristigle poruke * \retval 0 greska sa echo off */ int TOOLS_decodeCMTI( void ) //! Lokalne promenljive unsigned char *temp; int length, i; //inicijalizacija length = 0; length = COM_trim( ); //odstrani karaktere OK\r\n temp = COM_gets( ); //uzmi rx_buff for( i = 0; ( i < length ) && ( *temp++ != ',' ); i++) //idi kroz niz sve dok ne pronadjes ',' ; //greska if( i >= length ) return 0; else return atoi( temp ); //konvertuj ascii niz u integer

Page 69: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

69

/*! Kratak opis f-je TOOLS_decodeCMGR() * Kada se novopristigla poruka procita na osnovu indeksa ova funkcija ce * proci kroz nju i naci start teksta poruke * ulazni podaci * \param index ,indeks poruke koja treba da se procita * * \retval in_handle ,ako se javi greska in_handle pokazuje na '\0', * inace pokazuje na pocetak niza koji sadrzi tekst poruke */ unsigned char* TOOLS__decodeCMGR( int index ) //! Lokalne promenljive unsigned char *in_handle; int i, len; len = COM_trim(); //Odstrani OK\r\n in_handle = COM_gets( ); //uzmi rx_buff in_handle += 2; //Preskoci prvo pojavljivanje \r\n for( i = 0; ( i < len ) && ( *in_handle++ != '\n' ); i++) //trci kroz niz sve dok ne nadjes '\n' ; //greska if( i >= len ) in_handle = '\0'; return in_handle; //Sve je OK else return ( in_handle ); //pointer na prvi txt znak u poruci

Page 70: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

70

decode.c

/*fja koja ispituje sta je stiglo od komandi putem poruke * ujedno jedna od najvaznijih f-ja.Prostim dodavanjem novih komandi u niz AM_CMD moguce * je prosiriti broj komandi koje mikrokontroler prepoznaje .Naravno tada treba promeniti * i vrednost za CMD_COUNT */ #include <string.h> #include <stdio.h> #include <stdlib.h> #include <mega16.h> #define CMD_COUNT 3 //broj komandi koje program prepoznaje const unsigned char __flash START[] = "START"; const unsigned char __flash STOP[] = "STOP"; const unsigned char __flash REPORT[] = "REPORT"; const unsigned char __flash *AM_CMD[CMD_COUNT]="START","STOP","REPORT"; const unsigned char __flash *TrazenaKomanda; /*Kratak opis f-je decode_sms() * ulazne vrednosti * param ulaz ,pointer na telo tekstualne poruke * povratne vrednosti * * retval 0 ako je stigla komanda START,menja vrednost promenljive brzina * retval 1 ako je stigla komanda STOP * retval 2 ako je stigla komanda REPORT * retval -1 ako nije stigla ni jedna validna komanda */ int decode_sms(unsigned char *ulaz ) //Lokalne promenljive int i=0,j=0,brojac=0,m=0; unsigned char *l='\0',duzina=0; for(i=0;i<CMD_COUNT;i++) //petlja koja sluzi da se prodje kroz sve elemente niza AM_CMD j=0; TrazenaKomanda=AM_CMD[i]; //podesi trazenu komandu duzina=strlenf(TrazenaKomanda); //uzmi duzinu trazene komande do if(TrazenaKomanda[j]==ulaz[j]) brojac++; //da li je karakter trazene komande jednak elementu niza koji sadrzi tekst sms poruke if(brojac==duzina) //ako su se komanda i tekst sms poruke poklopili if(i==0) //analiziraj koja je komanda stigla l='\0'; do if(ulaz[j]>='0' && ulaz[j]<='9'&& ulaz[j]!='\0')l[m++]=ulaz[j];//ako je stigla komanda START idi do kraja poruke i pokupi brojeve i stavi ih u niz while (ulaz[++j]!='\0') ; l[m]=’\0’;//zatvori niz terminator karakterom

Page 71: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

71

brzina = atoi(l);//vrati brzinu ako je stigla sa porukom brojac=0; return(i); //vrati vrednost komande koja je stigla else brojac=0;return(i); //ako je stigla komanda koja je != START vrati samo njen indeks iz niza komandi j++;//povecaj index za jedan while (ulaz[j]!='\0' || k[j]!='\0'); brojac=0;m=0; //vrati brojac na nulu return(-1);//u slucaju da nista nije stiglo od komandi

Page 72: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

72

6 Lista komponenti

Identifikator komponente

Komentar Količina Oznaka proizvođača

Detaljan opis

ATMEGA1 mikrokontroler 1 ATMEGA16PU Mikrokontroler koji pokreće uređaj Kućište PDIP 40 Temperaturni opseg -40°C +85°C

C1,C2 Kondenzatori 2 22p/500V Keramički kondenzatori za kristal mikrokontrolera Temperaturni opseg -30°C +85°C Raster 5.08 mm

C3,C12,C15 Elekrolitski kondenzatori

3 100u/63V Elektrolitski kondenzatori vertikalni Temperaturni opseg -40°C +85°C Raster 5.0 mm

C13 Tantal kondenzator

1 100u/25V Tantal kondenzator koji mora biti postavljen što bliže priključnim krajevima napajana GSM modema Temperaturni opseg -55°C +85°C Raster 5.08 mm

C4,C5,C6,C7,C8, C9,C10,C11

Elektrolitski kondenzatori

8 1u/63V Elektrolitski kondenzatori za translator signala Temperaturni opseg -40°C +85°C Raster 2.0 mm

D1,D3,D5 LED diode crvene

3 LED crvena 3mm Za signalizaciju Difuzna LED 3mm

D2,D4 LED diode žute 2 LED žuta 3mm Za signalizaciju Difuzna LED 3mm

D6,D7 Zener diode 2 3V3/0.5W Za translator signala prema modemu Kućište DO-35 Temepaturni opseg -20°C +70°C

D8 Dioda 1 1N4005 Zaštitna dioda koja čuva stabilizator napona Kućište DO-15

D9 Diodni most-Grec za 3A

1 DC BR310 Grecov most Kvadratno kućište Temperaturni opseg -40°C +150°C Lemljenje 260°C/10s

GSM1 GSM modem 1 TELIT GM862GPRS

GSM OEM modem Molex 52991-0508 konektor

P1 Konektor za PC 1 SUB DB9 male DB9 konektor za montažu na štampu Dopuštena struja po kontaktu 5A Temperaturni opseg -55°C +125°C

R1 Otpornik 1 10k Ugljenoslojni otpornik za pullup reset pina Snaga 0.25W Temperaturni opseg -55°C +155°C

R2,R3,R4 Otpornici 3 1k Ugljenoslojni otpornici za ograničavanje stuje signalnih led dioda Snaga 0.25W Temperaturni opseg -55°C +155°C

R5 Otpornik 1 2k2 Uglenosloji otpornik za Low Pass filter Snaga 0.25W Temperaturni opseg -55°C +155°C

Page 73: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

73

R6,R7 Otpornici 2 100 Uglenosloji otpornik za ograničavanje struje kroz LED diode GSM modema Snaga 0.25W Temperaturni opseg -55°C +155°C

R8 Otpornik 1 220 Uglenosloji otpornik za stabilizator napona Snaga 0.25W Temperaturni opseg -55°C +155°C

R9 Trimer otpornik 1 4k7 Linearni trimer potenciometar za fino podešavanje napona stabilizatora Snaga 0.25W Temperaturni opseg -25°C +70°C

SW1 Tater prekidač crveni

1 Minijaturni taster normalno otvoren za montažu

Reset mikrokontrolera 50V DC/0.3A Radni vek 10000

SW2 Taster prekidač crni

1 Minijaturni taster normalno otvoren za montažu

ON/OFF modema 50V DC/0.3A Radni vek 10000

SW3 Taster prekidač crveni

1 Minijaturni taster normalno otvoren za montažu

RESET modema 50V DC/0.3A Radni vek 10000

T1 Mrežni trafo 1 220V/15V 1500mA

Mrežni transformator

U1,U2 Kola za translaciju signala

2 MAX232N Kućište DIP 16

U3 Stabilizator napona

1 LM317T Kućište TO220 Izlazni napon u opsegu 1.2 do 37V, 0.8A max Temperaturni opseg 0°C +125°C

U4 Stabilizator napona

1 MC78L05AC Kućište TO

Y1 Kristal 1 8MHz Kristal za clock mikrokonrolera

Page 74: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

74

6.1 Šeme veza

Page 75: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

75

Page 76: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

76

Page 77: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

77

Page 78: GSM kontroler zasnovan na ATMEGA16 procesoru - DIPLOMSKI RAD

78

Literatura :

♦ GM862GPRS_Hardware_user_guide.pdf , www.telit.com ♦ GM862GPRS_Software_user_guide.pdf , www.telit.com ♦ GM862_TRIZIUM_family_AT_commands.pdf, www.telit.com ♦ „Digitalno upravljanje elektromotornim pogonima”- Slobodan N.

Vukosavić ,Akademska misao ,Beograd 2003 ♦ 2466.pdf Atmel corporation , www.atmel.com ♦ CVAVRMAN.pdf , www.hpinfotech.com ♦ Getstart.pdf Atmel corporation , www.atmel.com ♦ AVR323.pdf Atmel corporation, www.atmel.com ♦ „Digitalni pogonski kontroler zasnovan na IPM inteligentnom modulu i

Atmega8 procesoru“- diplomski rad , Goran Mandić ♦ EASY AVR3 razvojni sistem, www.mikroe.com/en/tools/easyavr3/