E pa ja sam razumio da ti ne znas heksadecimalni sistem.
Onda ovako:
Ovo je glavni program:
Code:
{
ea = 1; //dozvola prekida
tr0 = 1; //ukljucivanje tajmera tr0
p1 = 0; //ovo sam pogledaj sta je, ja ne znam jer ne radim sa 8051
//niti znam za koji kompajler je ovaj program, pretpostavljam da je znacenje
//ovoga da je port p1 izlazni, a to bi trebao biti port na koji su povezani displeji, tj preko koga
// oba displeja dobijaju podatak koji treba da prikazu.
p2.1 = 0; // pin 1 porta 2 se konfigurise kao izlazni. Ovo je port preko koga prvi displej dobija napajanje, tj. ukljucuje se.
p2.2 = 0; // pin 2 porta 2 se konfigurise kao izlazni. Ovo je port preko koga drugi displej dobija napajanje, tj. ukljucuje se.
// ovdje je zavrsena inicijalizacija, u tom djelu programa je konfigurisan mikrokontroler
// za zadatak koji treba da obavlja i ovaj dio koda se vise nece izvrsavati
while(1) {} //Ovo je beskonacna petlja i glavni program nista ne radi samo se vrti u njoj
//Ideja je da se samo ceka na neki prekidni zahtjev (od tajmera) koji ce prekinuti ovo vrcenje u krug.
// Kad stigne neki prekid, ovdje ce se prekinuti izvrsavanje ove petlje, izvrsice se odgovarajuca prekidna
// rutina, a kad se ona zavrsi, tok programa se opet vraca ovdje i opet se vrti u krug ne radeci nista
// sve dok opet ne stigne neki prekid
// Necu ti dalje ovdje objasnjavati razne detalje prekida, bolje progooglaj, trazi "interrupt"
}
Ovo je prekidna rutina koja ce se izvrsavati svaki put kad stigne prekid od tajmera tr0
Code:
void timer0 interrupt 1 //ovim se kaze da kad timer0 posalje prekidni zahtjev da treba da se izvrava ova funkcija
{ static data prolaz = 0; //ovo je staticka promjenjiva, njena vrednost ostaje zapamcena i nakon sto se izvrsavanje
// funkcije zavrsi. Ovdje sluzi da se zapamti sta je bilo ukljuceno/iskljuceno prosli put, pa da se
// sledeci put uradi suprotno
ea = 0; // Onemogucavaju se prekidi. Kad se izvrsava ova funkcija to znaci da je jedan prekid vec stigao,
// i ako se ne bi zabranili dodatni prekidi, moglo bi se desiti da neki prekidni zahtjev stigne u toku
// izvrsavanje ove funkcije, pa da dolazi do ugnjezdjavanja ovih funkcija, sto ovdje nije potrebno
// omoguciti jer ima samo jedna vrsta prekida. Inace se to radi u situacijama kad ima vise vrsta
// prekida razlicitog prioriteta. Procitaces o tome sigurno tamo gdje budes nasao nesto o prekidima.
tr0 = 0; // iskljucuje se timer 0;
tf0 = 0; // isto kao i za p1, pronadji sam sta je tf0, ili sacekaj da se javi neko ko zna. Pretpostavljam da znaci u koju stranu
// ce tajmer da broji (unapred ili unazad).
th0 = 0x80; // timer0 je 16-bitni, th0 predstavlja gornjih 8 bitova, a
tl0 = 0x00; // a tl0 donjih 8 bitova tako da je ukupna vrednost koja se upisuje u tajmer 0x8000, tj 0000 1000 0000 0000 binarno.
// To je 2048 decimalno i tajmer odbrojava od te vrednosti do 0 (u slucaju da broji npr. unazad), i kad dodje do 0 on
// posalje zahtjev za prekid.
// To brojanje se ne desava sad, ovdje se samo pripremaju te vrednosti, a otpocece se sa brojanjem kad se izadje iz
// iz ove funkcije, tj. tajmer ce odbrojavati svoje dok se glavni program bude vrtio u while(1) petlji.
// Ako pogledas dolje pri kraju ove funkcije ima naredba koja ukljucuje tajmer i on tek tada pocinje da broji.
switch (prolaz) // U naredbi switch se naizmjenicno ukljucuje pin p2.1 ili pin p2.2
case 0 : // u slucaju da je prolaz == 0
p1 = B[prolaz]; // na oba displeja se salje podatak sa lokacije B[0]
p2.1 = 1 // ali se ukljucuje samo onaj koji je prikljucen na pin p2.1
p2.2 = 0; // dok se ovaj na pinu p2.2 gasi
prolaz = 1; // ovim se pripremamo za sledeci ulazak u ovu funkciju, i ako se npr. u ovom sada pozivu
// izvrsio ovaj dio naredbe switch, u sledecem ce ovaj donji,
break;
case 1: // u ovom djelu se pali drugi displej a na njega ide vrednost sa lokacije B[1]
p1 = B[prolaz]; // I kako to sve radi?
p2.1 = 0; // Brojac broji od 2048 do 0 i svaki put kad dodje do kraja on posalje prekid i tada se izvrsava ova funkcija.
p2.2 = 1; // Ova funkcija jedanput ispise B[0] na jednom displeju, a drugi je za to vreme ugasen,
prolaz = 0; // A kad timer sledeci put odbroji do 0, onda ova funkcija ispise B[1] na drugom displeju,
break; // a prvi je ugasen. Sve se to odigrava dovoljno brzo da ljudsko oko ne primjecuje to treperenje i cini se da
// oba displeja rade istovremeno neprekidno.
}
tr0 = 1; // ovdje se tajmer opet ukljucuje (a gore ranije smo vec ucitali u njega 2048) i on opet pocinje da odbrojava
ea = 1; // ovdje opet dozvoljavamo prekide, jer ako to zaboravimo, nikad vise necemo moci primiti prekid od tajmera
// i jedan displej ce ostati da svjetli stalno, a drugi nikako, vec kako se zadesilo u tom trenutku
}
Eto, nadam se da ce ti pomoci na ispitu.
Ovo si dobio jer si bio posten, pa si rekao o kojoj se skoli radi i sto nisi nastavio u sumanutom tonu.
A i zato sto mrzim profesore koji nemaju literaturu za svoj predmet.
Pozdrav.
[Ovu poruku je menjao Odin D. dana 16.10.2008. u 00:17 GMT+1]