Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <REGX52.H> //biblioteka sa definicijama registara
- #define F_CLK 18432000
- #define F_INT 1000
- typedef unsigned char byte;
- unsigned char xdata CRV_PREK _at_ 0x8000;
- unsigned char xdata ZELENE _at_ 0x8001;
- unsigned char xdata ZUTE _at_ 0x8002;
- unsigned char xdata PLAVE _at_ 0x8003;
- unsigned long sys_time = 0;
- byte slika_ispisa = 0x01; /* promenjiva koju funkcija ping pong manipulise.
- pocetno stanje je skroz desna diodica.
- */
- byte prek_za_niz;
- byte prek_za_vreme;
- byte koeficijent; /* ovim cu skalirati trajanje od 0.5 sekunde
- da dobijem sve ostale --> 1, 2, 4 sekunde.
- */
- byte smer = 1; // 1 - levo, 0 - desno
- void timer0_ISR() interrupt 1
- {
- sys_time++;
- TR0 = 0; //tajmer 0 OFF
- TH0 = 0xFA; //ucitavanje pocetne vrednosti
- TL0 = 0x00;
- TR0 = 1; //tajmer 0 ON
- }
- unsigned long millis()
- {
- unsigned long tmp;
- EA = 0; //zabrana prekida
- tmp = sys_time; //ocitavanje vremena
- EA = 1; //dozvola prekida
- return tmp;
- }
- void delay_ms(unsigned long d)
- {
- unsigned long t0 = millis();
- while(millis() - t0 < d);
- }
- void podesi_trajanje(byte prekidaci, byte *koeficijent) {
- switch(prekidaci) {
- case 0x00:
- // je l ima ovo cudo uopste mogucnost rada sa float i double?
- // neka je ovo koeficijent za trajanje 0.5 sec
- *koeficijent = 1;
- break;
- case 0x01:
- // onda u sekundi imam takva dva
- *koeficijent = 2;
- break;
- case 0x02:
- // u 2 sekunde imam takva 4
- *koeficijent = 4;
- break;
- case 0x03:
- // u 4 sekunde imam 8 takvih
- *koeficijent = 8;
- break;
- }
- }
- void podesi_niz(byte prekidaci, byte ping_pong){
- switch(prekidaci) {
- case 0x00:
- CRV_PREK = ping_pong;
- break;
- case 0x01:
- ZUTE = ping_pong;
- break;
- case 0x02:
- ZELENE = ping_pong;
- break;
- case 0x03:
- PLAVE = ping_pong;
- break;
- }
- }
- void ping_pong(byte *slika_ispisa, byte *smer, byte koeficijent){
- switch(*smer) {
- case 1:
- *slika_ispisa <<= 1;
- if (*slika_ispisa == 0x80) {
- // kad je stanje 1000 0000, ne pomeraj, nego obrci smer
- *smer = 0;
- }
- break;
- case 0:
- *slika_ispisa >>= 1;
- if (*slika_ispisa == 0x01) {
- *smer = 1;
- }
- break;
- }
- // svako pomeranje isprati delayom
- // broj koraka 15, referentno vrijeme pola sekunde kao najmanje trajanje
- // ping pong intervala, posto imas 15 koraka najmanji interval dijelis sa 15
- // i mnozis sa koeficijentom koji kaze koliko takvih koraka imas ako zelis da
- // ih vozis 1, 2, 4 sekundi
- delay_ms(koeficijent * (500 / 15));
- }
- void main()
- {
- //inicijalizacija tajmera 0:
- TMOD = 0x01; //tajmer 2 -> 16-bitni mod
- ET0 = 1; //dozvola prekida tajmera 0
- TR0 = 1; //tajmer 0 ON
- EA = 1; //dozvola prekida
- while(1){
- // 0011 1111 je stanje prekidaca kada su ukljucena dva lijeva
- // ~0011 1111 = 1100 0000
- // 1100 0000 & 1100 0000 ===> ostavlja samo lijeva dva bita.
- // 11xx xxxx >> 6 je 0000 0011
- // sada prek_za_niz poredis sa vrijednostima iz tabele 00, 01, 10, 11
- prek_za_niz = (~CRV_PREK & 0xC0) >> 6;
- // ovde je maska 0000 0011 pa ne moram nista da shiftujem
- prek_za_vreme = ~CRV_PREK & 0x03;
- //CRV_PREK = 0xAA;
- podesi_trajanje(prek_za_vreme, &koeficijent);
- // manipulisi polozajem diodice.
- ping_pong(&slika_ispisa, &smer, koeficijent);
- // sliku ispisa saljemo na niz dioda.
- podesi_niz(prek_za_niz, slika_ispisa);
- }
- }
Add Comment
Please, Sign In to add comment