Advertisement
milanmetal

[RSDMK] Ping-pong --> reseti + 1 dioda se vrti

Mar 19th, 2018
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.36 KB | None | 0 0
  1.        #include <REGX52.H> //biblioteka sa definicijama registara
  2.  
  3. #define F_CLK 18432000
  4. #define F_INT 1000
  5.  
  6. typedef unsigned char byte;
  7.  
  8. unsigned char xdata CRV_PREK    _at_ 0x8000;
  9. unsigned char xdata ZELENE      _at_ 0x8001;
  10. unsigned char xdata ZUTE        _at_ 0x8002;
  11. unsigned char xdata PLAVE       _at_ 0x8003;
  12.  
  13. unsigned long sys_time = 0;
  14.  
  15. // Budjavi Keil iz nekog razloga zahtjeva da se promjenjive izbace izvan maina
  16. // zato na ovaj nacin radjeno nema potrebe da se koristi slanje po adresi u funkcijama dole
  17. // to je ostalo jer sam prvo napravio verziju gdje su ovih 4-5 promenjivih ispod
  18. // definisane u mainu i onda se alat bunio i ja ih izbacim... mrzi me da uklanjam sve
  19. // vezano za slanje po adresi, samo zanemarite jer sada mogu da se koriste kao globalne promenjive.
  20. byte slika_ispisa = 0x01;    /* promenjiva koju funkcija ping pong manipulise.
  21.                                 pocetno stanje je skroz desna diodica.
  22.                               */
  23.   byte prek_za_niz;
  24.   byte prek_za_vreme;
  25.   byte koeficijent;     /* ovim cu skalirati trajanje od 0.5 sekunde
  26.                            da dobijem sve ostale --> 1, 2, 4 sekunde.
  27.                          */
  28.   byte smer = 1; // 1 - levo, 0 - desno
  29.  
  30.  
  31.  
  32.  
  33. void timer0_ISR() interrupt 1
  34. {
  35.     sys_time++;
  36.  
  37.  
  38.     TR0 = 0;            //tajmer 0 OFF
  39.     TH0 = 0xFA;         //ucitavanje pocetne vrednosti
  40.     TL0 = 0x00;
  41.     TR0 = 1;            //tajmer 0 ON
  42. }
  43.  
  44. unsigned long millis()
  45. {
  46.     unsigned long tmp;
  47.  
  48.     EA = 0;             //zabrana prekida
  49.     tmp = sys_time;     //ocitavanje vremena
  50.     EA = 1;             //dozvola prekida
  51.  
  52.     return tmp;
  53. }
  54.  
  55. void delay_ms(unsigned long d)
  56. {
  57.   unsigned long t0 = millis();
  58.   while(millis() - t0 < d);
  59. }
  60.  
  61. void podesi_trajanje(byte prekidaci, byte *koeficijent) {
  62.     switch(prekidaci) {
  63.       case 0x00:
  64.       // je l ima ovo cudo uopste mogucnost rada sa float i double?
  65.       // neka je ovo koeficijent za trajanje 0.5 sec
  66.         *koeficijent = 1;
  67.       break;
  68.       case 0x01:
  69.       // onda u sekundi imam takva dva
  70.         *koeficijent = 2;
  71.       break;
  72.       case 0x02:
  73.       // u 2 sekunde imam takva 4
  74.         *koeficijent = 4;
  75.       break;
  76.       case 0x03:
  77.       // u 4 sekunde imam 8 takvih
  78.         *koeficijent = 8;
  79.       break;
  80.     }
  81. }
  82.  
  83. void podesi_niz(byte prekidaci, byte ping_pong){
  84.   switch(prekidaci) {
  85.     case 0x00:
  86.       CRV_PREK  = ping_pong;
  87.       ZUTE      = 0xff;
  88.       ZELENE    = 0xff;
  89.       PLAVE     = 0xff;
  90.     break;
  91.     case 0x01:
  92.       CRV_PREK  = 0xff;
  93.       ZUTE      = ping_pong;
  94.       ZELENE    = 0xff;
  95.       PLAVE     = 0xff;
  96.     break;
  97.     case 0x02:
  98.       CRV_PREK  = 0xff;
  99.       ZUTE      = 0xff;
  100.       ZELENE    = ping_pong;
  101.       PLAVE     = 0xff;
  102.     break;
  103.     case 0x03:
  104.       CRV_PREK  = 0xff;
  105.       ZUTE      = 0xff;
  106.       ZELENE    = 0xff;
  107.       PLAVE     = ping_pong;
  108.     break;
  109.   }
  110. }
  111.  
  112. void ping_pong(byte *slika_ispisa, byte *smer, byte koeficijent){
  113.   switch(*smer) {
  114.     case 1:
  115.       *slika_ispisa <<= 1;
  116.       if (*slika_ispisa == 0x80) {
  117.         // kad je stanje 1000 0000, ne pomeraj, nego obrci smer
  118.         *smer = 0;
  119.       }
  120.     break;
  121.  
  122.     case 0:
  123.       *slika_ispisa >>= 1;
  124.       if (*slika_ispisa == 0x01) {
  125.         *smer = 1;
  126.       }
  127.     break;
  128.   }
  129.  
  130.   // svako pomeranje isprati delayom
  131.   // broj koraka 15, referentno vrijeme pola sekunde kao najmanje trajanje
  132.   // ping pong intervala, posto imas 15 koraka najmanji interval dijelis sa 15
  133.   // i mnozis sa koeficijentom koji kaze koliko takvih koraka imas ako zelis da
  134.   // ih vozis 1, 2, 4 sekundi
  135.   delay_ms(koeficijent * (500 / 15));
  136. }
  137.  
  138. void main()
  139. {
  140.   //inicijalizacija tajmera 0:
  141.     TMOD = 0x01;            //tajmer 2 -> 16-bitni mod
  142.     ET0 = 1;                //dozvola prekida tajmera 0
  143.     TR0 = 1;                //tajmer 0 ON
  144.  
  145.     EA = 1;                 //dozvola prekida
  146.  
  147.     while(1){
  148.         // 0011 1111 je stanje prekidaca kada su ukljucena dva lijeva
  149.         // ~0011 1111 = 1100 0000
  150.         // 1100 0000 & 1100 0000 ===> ostavlja samo lijeva dva bita.
  151.         // 11xx xxxx >> 6 je 0000 0011
  152.         // sada prek_za_niz poredis sa vrijednostima iz tabele 00, 01, 10, 11
  153.         prek_za_niz   = (~CRV_PREK & 0xC0) >> 6;
  154.         // ovde je maska 0000 0011 pa ne moram nista da shiftujem
  155.         prek_za_vreme = ~CRV_PREK & 0x03;
  156.    
  157.         //CRV_PREK = 0xAA;
  158.         podesi_trajanje(prek_za_vreme, &koeficijent);
  159.    
  160.         // manipulisi polozajem diodice.
  161.         ping_pong(&slika_ispisa, &smer, koeficijent);
  162.    
  163.         // sliku ispisa saljemo na niz dioda.
  164.         podesi_niz(prek_za_niz, ~slika_ispisa);
  165.     }
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement