180 likes | 395 Views
MIKROPROCESORSKI SISTEMI SEMINARSKI RAD. REALIZACIJA SEMAFORA NA BAZI MIKROKONTROLERA AT89S8253 Student :Nebojša Pavlović 10312. UVOD. 1.Projektni zadatak 2.Razrada 3.Analiza i opis mikrokontrolera AT89S8253 4.Softver 5.Hardver 6.Lab. vežbe za studente. Projektni zadatak.
E N D
MIKROPROCESORSKI SISTEMISEMINARSKI RAD REALIZACIJA SEMAFORA NA BAZI MIKROKONTROLERA AT89S8253 Student:Nebojša Pavlović 10312
UVOD 1.Projektni zadatak 2.Razrada 3.Analiza i opis mikrokontrolera AT89S8253 4.Softver 5.Hardver 6.Lab. vežbe za studente
Projektni zadatak Realizovati mikroračunar,baziran na mikrokontroleru AT89S8253 tako da se mikroračunar koristi kao kontroler rada tri ulična semafora,koja rade u režimu „zeleni talas“,semafori su raspoređeni kao na sl.1.
Razrada Kao početni primer uzet je primer gde se vozila kreću brzinom od 60km/h i gde je rastojanje između semafora 500m.To znači da je vozilu potrebno 30s da pređe rastojanje od jednog do drugog semafora. Semafor za pešake je realizovan tako što se vodilo racuna da se crveno svetlo za pešake ne pali istog trenutka kada i zeleno za vozila,već posle izvesnog vremena kako bi pešaci mogli bezbedno da pređu ulicu. Ka semaforima ide 15 ontrolnih linija od mikrokontrolera,proizvoljno je odlučeno da se za izlaze koriste portovi 0 i 1,i to svih osam pinova porta 0 i sedam pinova porta 1. Pri normalnom radu semafora jedna tipična sekvenca stanja za jedan ciklus je sledeća: 1. upaljeno crveno za vozila i upaljeno zeleno za pešake 2. gasi se zeleno i pali crveno za pešake 3. pali se žuto dok još uvek svetli crveno na semaforu za vozila 4. gase se crveno i žuto, pali se zeleno 5. gasi se zeleno, žuto blinkne 2 puta i pali se crveno za vozila 6. gasi se crveno i pali zeleno za pešake
Analiza i opis mikrokontrolera AT89S8253 • - Kompatibilan je sa Microsoft-51 procesorom • - 12KB fleš memorija • - SPI serijski unos za učitavanje programa • - 10 000 ciklusa upis/brisanje • - 2KB EEPROM memorija • - 100 000 ciklusa upis/brisanje (64-bajtna korisnička matrica) • - Napon napajanja od 2.7V do 5.5 V • - Frekvencija od 0 do 24 MHz • - Memorijsko zaključavanje u 3 nivoa • - 256 x 8-bitni unutrašnji RAM • - 32 I/O linije za programiranje • - Tri 16-bitna Tajmer/Brojač • - 9 generatora prekida • - Poboljšani UART serijski port sa centriranjem detekcije greške i automatskim prepoznavanjem adrese • - Male snage napajanja • - Uspostavljanje prekida u niskom režimu rada • - Programabilni tajmeri • - Dvostruki pokazivač podataka • - Isključivanje pomoću znaka (Power-off Flag) • - Fleksibilni ISP programator (byte i page modovi) • - Page mode: 64 byte/page za kodnu memoriju, 32 byte/page za memoriju podataka • - 4-nivo poboljšani kontrolor prekida • - Programabilna x2 clock opcije • - Unutrašnji Power-on Reset • - 42-pin PDIP model kućišta za redukovanje EMS emisije • - Zeleni (Pb/Holide-free) opcija kućišta
Analiza i opis mikrokontrolera AT89S8253 • Detaljna struktura mikrokontrolera AT89S53:
Analiza i opis mikrokontrolera AT89S8253 • Opis pinova:
Softver • Za razvoj softvera korišćeno je razvojno okruzenje Keil koje predstavlja najpopularniji alat za rad sa mikrokontrolerima familije 8051. Program je pisan u cistom C jeziku. • Softver za kontrolu rada semafora bazira se na merenju vremena i promeni stanja izlaza na portovima po isteku određenog vremena, shodno tabeli stanja. Kao osnovni vremenski kvant koristi se vremenski period od 1s. Za precizno generisanje vremenskog intervala koristimo hardverski tajmer mikrokontrolera. Ovaj period se generiše korišćenjem interapta tajmera Timer0, koji se javlja na 10ms i koristimo pomoćni softverski brojač koji je inicijalno postavljen na 100 i dekrementira se svakim ulaskom u interapt rutinu.
Softver • Timer0 se inicijalno, a nakon toga i pri svakom ulasku u interapt rutinu postavlja na 0xB800 heksadecimalno, odnosno 47104 decimalno. Pri korišćenoj frekvenciji kristala od 11.0592MHz, tajmer će se inkrementirati svakih 1/(11.0592MHz/6)=542,5nS. Da bi smo dobili period od 10mS, 10mS/542,5nS=18432. Znači pošto se radi o 16-bitnom tajmeru, znači da ima opseg brojanja od 0 do 65535, da bi se desio interapt u registar tajmera 0 potrebno je upisati vrednost 65536-18432=47104. Vrednost se postavlja svaki put kada se interapt dogodi. U viši 8-bitni registar 16-bitnog registra T0, TH0 upisujemo 0xB8, a u niži 8-bitni registar TL0 upisuje se 0x00. • Kada promenjiva T01s postane jednaka 0, u glavnoj main petlji postavljamo fleg da je istekla jedna sekunda i T01s ponovo postavljamo na 100 da bi se postupak ponavljao if(!T01s){ //ispitujemo da li je istekla 1s (da li je T01s==0) T01s_end=1; //ako jeste postvljamo marker na 1 T01s=100; //ucitavamo novu vrednost za brojac }
Softver • Naredna if petlja proverava i kada istekne sekunda uvećava softverski brojač T01s_count, i isto tako briše fleg T01s_end. Zatim kroz switch uslov ispitujemo u kojoj smo trenutno sekundi i shodno tome delujemo na kontrolne signale, tj. palimo ili gasimo svetla na semaforu. if(T01s_end){ //ako je istekla sekunda T01s_end=0; //brisemo marker T01s_count++; //uvecavamo brojac sekundi switch(T01s_count) //ispitujemo koja je trenutno sekunda { case 10://10s, pale se na semaforima za pesake 1 i 3 P1_ZELENA=0; //zelena svetla P1_CRVENA=1; P3_ZELENA=0; P3_CRVENA=1; break; ... • Kada dostignemo 60-tu sekundu, nakon akcije resetuje se brojač sekundi na nulu, čime se proces ponavlja sa periodom od 60s. Znači jedan ciklus prolaska semafora kroz gore navedena stanja traje 60s. case 60: //60s, na semaforima 1 i 3 pali se crveno, na semaforu 2 zeleno S1_ZUTA=1; S1_CRVENA=0; S3_ZUTA=1; S3_CRVENA=0; S2_ZUTA=1; S2_CRVENA=1; S2_ZELENA=0; T01s_count=0;//resetujemo brojac sekundi na nulu,da bi ponovili ciklus break;
Softver • Vidimo da se na kraju inicijalizacije vrši pozivanje funkcije StartUp() kojom se stanja na semaforu postavljaju u inicijalno stanje po uključivanju uređaja: //Inicijalno: Semafor 1: upaljeno crveno, na pesackom - crvena, //semafor 2: upaljeno zeleno, na pesackom - crvena, //semafor 3: upaljeno crveno, na pesackom - crvena void StartUp() { S1_CRVENA=0; P1_CRVENA=0; S2_ZELENA=0; P2_CRVENA=0; S3_CRVENA=0; P3_CRVENA=0; }
Softver • Na početku samog programa izvršena su podešavanja samog procesora: void main(void) { CLKREG=0x01; //postavljamo procesr u rezim X2, 6 takta za jedan ciklus WDTCON=0x00; //iskljucicanje Watchdog tajmera TMOD=0X01;//Timer 0 je postavlja u rezim 16-bitnog brojaca TH0=0xB8;//postavljanje vrednosti registra T0 TL0=0x00;//da bi generisali 10ms, upisuje se 65536-18432=47104 ET0 = 1; //dozvola interapta tajmera 0 TR0 = 1; //startovanja tajmera 0 EA = 1; //globalna dozvoja interapta T01s=0; //inicijalizacija promenjive T01s_count=0; //inicijalizacija promenjive StartUp(); //inicijalno postavljanje izlaza
Softver • Kompletan listing koda u C-u: #include <REG8253.H> //include file za 89S8253 //Dodeljivanje imena LED diodama na odgovarajucim pinovima porta 0 i 1 sbit S1_ZELENA=P0^0; sbit S1_ZUTA=P0^1; sbit S1_CRVENA=P0^2; sbit P1_ZELENA=P0^3; sbit P1_CRVENA=P0^4; sbit S2_ZELENA=P0^5; sbit S2_ZUTA=P0^6; sbit S2_CRVENA=P0^7; sbit P2_ZELENA=P1^0; sbit P2_CRVENA=P1^1; sbit S3_ZELENA=P1^2; sbit S3_ZUTA=P1^3; sbit S3_CRVENA=P1^4; sbit P3_ZELENA=P1^5; sbit P3_CRVENA=P1^6; unsigned char T01s=100; //pom. promenjiva koja nam sluzi da generisemo 1s, 100*10ms unsigned char T01s_count=0; //brojac sekundi bit T01s_end; //bit koji pokazuje da je istekla 1s void StartUp(); //deklaracija funkcije //Interapt rutina tajmera 0, koja se izvrsava svakih 10ms void timer0_ISR (void) interrupt 1 { TF0=0; //brisanje flega timera 0 TH0=0xB8; //postavljanje vrednosti registra T0 TL0=0x00; // da bi generisali 10ms, upisuje se 65536-18432=47104 T01s--; //umanjujemo T01s } void main(void) { CLKREG=0x01; //postavljamo procesr u rezim X2, 6 takta za jedan ciklus WDTCON=0x00; //iskljucicanje Watchdog tajmera TMOD=0X01; //Timer 0 je postavlja u rezim 16-bitnog brojaca TH0=0xB8; //postavljanje vrednosti registra T0 TL0=0x00; // da bi generisali 10ms, upisuje se 65536-18432=47104
Softver ET0 = 1; //dozvola interapta tajmera 0 TR0 = 1; //startovanja tajmera 0 EA = 1; //globalna dozvoja interapta T01s=0; //inicijalizacija promenjive T01s_count=0; //inicijalizacija promenjive StartUp(); //inicijalno postavljanje izlaza while (1) { //neprekidna petlja if(!T01s){ //ispitujemo da li je istekla 1s (da li je T01s==0) T01s_end=1; //ako jeste postvljamo marker na 1 T01s=100; //ucitavamo novu vrednost za brojac } if(T01s_end){ //ako je istekla sekunda T01s_end=0; //brisemo marker T01s_count++; //uvecavamo brojac sekundi switch(T01s_count) //ispitujemo koja je trenutno sekunda { case 10: //10s, pale se na semaforima za pesake 1 i 3 P1_ZELENA=0; //zelena svetla P1_CRVENA=1; P3_ZELENA=0; P3_CRVENA=1; break; case 17: //17s, pali se na semaforu za pesake 2 crveno svetlo P2_ZELENA=1; P2_CRVENA=0; break; case 20: //20s, pali se na semaforima za pesake 1 i 3 crveno svetlo P1_ZELENA=1; P1_CRVENA=0; P3_ZELENA=1; P3_CRVENA=0; break; case 27: //27s, na semaforima 1 i 3 pali se i zuto, ocekuje se zeleno S1_ZUTA=0; //na semaforu 2 pali se zuto, koje u naredne 3 sekunde 2 puta S3_ZUTA=0; //blinkne kao obavestenje da ce da usledi promena na crveno S2_ZELENA=1; S2_ZUTA=0; break; case 28: //28s,zuto treperi
Softver S2_ZUTA=1; break; case 29: //29s,zuto treperi S2_ZUTA=0; break; case 30: //30s, na semaforima 1 i 3 pali se zeleno, na semaforu 2crveno S1_CRVENA=1; S1_ZUTA=1; S1_ZELENA=0; S3_CRVENA=1; S3_ZUTA=1; S3_ZELENA=0; S2_CRVENA=0; S2_ZUTA=1; break; case 40: //40s, na semaforu za pesake 2 pali se zeleno P2_ZELENA=0; P2_CRVENA=1; break; case 50: //50s, na semaforu za pesake 2 pali secrveno P2_ZELENA=1; P2_CRVENA=0; break; //27s, na semaforima 2 pali se i zuto, ocekuje se zeleno case 57: //na semaforu 1 i 3 pali se zuto, koje u naredne 3 sekunde 2 puta S1_ZELENA=1; //blinkne kao obavestenje da ce da usledi promena na crveno S1_ZUTA=0; S3_ZELENA=1; S3_ZUTA=0; S2_ZUTA=0; break; case 58: //58s,zuto treperi S1_ZUTA=1; S3_ZUTA=1; break;
Softver case 59: //59s,zuto treperi S1_ZUTA=0; S3_ZUTA=0; break; case 60: //60s, na semaforima 1 i 3 pali se crveno, na semaforu 2 zeleno S1_ZUTA=1; S1_CRVENA=0; S3_ZUTA=1; S3_CRVENA=0; S2_ZUTA=1; S2_CRVENA=1; S2_ZELENA=0; T01s_count=0; //resetujemo brojac sekundi na nulu, da bi ponovili ciklus break; default: break; } } } } //Inicijalno: Semafor 1: upaljeno crveno, na pesackom - crvena, //semafor 2: upaljeno zeleno, na pesackom - crvena, //semafor 3: upaljeno crveno, na pesackom - crvena void StartUp() { S1_CRVENA=0; P1_CRVENA=0; S2_ZELENA=0; P2_CRVENA=0; S3_CRVENA=0; P3_CRVENA=0; }
Hardver • Rad semafora prikazuju LED koje su smestene odvojeno na raster ploči a napajaju se sa ploče na kojoj je smesten mikrokontroler. Na raster ploči nalaze se, takodje, i baferi preko kojih se diode sprežu sa mikrokontrolerom. Blok šema sistema na raster ploči prikazana je na slici 16.
Lab.vežbe za studente • PRIMER 1 Izmeniti postojeći program tako da vozilo koje se kreće konstantnom brzinom od 50km/h,prođe na zeleno svetlo kroz sva tri semafora.Uzeti da je rastojanje između semafora 400m. • PRIMER 2 Izmeniti postojeći program tako da pri prelasku sa zelenog na crveno svetlo za vozače zuto svetlo trepne tri puta pre nego što se upali crveno svetlo. • PRIMER 3 Izmeniti postojeći program tako da vreme koje je potrebno pešacima da bezbedno pređu ulicu bude 6s,tj. da se creveno za pešake upali 6s pre nego što se upali zeleno svetlo za vozila i da se zeleno za pešake upali 6s posle nego što se upali crveno za vozila.