milanmetal

[RSDMK] Ping-pong --> NE RESETUJE NAKON PROMJENE

Mar 19th, 2018
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.70 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. byte slika_ispisa = 0x01;    /* promenjiva koju funkcija ping pong manipulise.
  16.                                 pocetno stanje je skroz desna diodica.
  17.                               */
  18.   byte prek_za_niz;
  19.   byte prek_za_vreme;
  20.   byte koeficijent;     /* ovim cu skalirati trajanje od 0.5 sekunde
  21.                            da dobijem sve ostale --> 1, 2, 4 sekunde.
  22.                          */
  23.   byte smer = 1; // 1 - levo, 0 - desno
  24.  
  25.  
  26.  
  27.  
  28. void timer0_ISR() interrupt 1
  29. {
  30.     sys_time++;
  31.  
  32.  
  33.     TR0 = 0;            //tajmer 0 OFF
  34.     TH0 = 0xFA;         //ucitavanje pocetne vrednosti
  35.     TL0 = 0x00;
  36.     TR0 = 1;            //tajmer 0 ON
  37. }
  38.  
  39. unsigned long millis()
  40. {
  41.     unsigned long tmp;
  42.  
  43.     EA = 0;             //zabrana prekida
  44.     tmp = sys_time;     //ocitavanje vremena
  45.     EA = 1;             //dozvola prekida
  46.  
  47.     return tmp;
  48. }
  49.  
  50. void delay_ms(unsigned long d)
  51. {
  52.   unsigned long t0 = millis();
  53.   while(millis() - t0 < d);
  54. }
  55.  
  56. void podesi_trajanje(byte prekidaci, byte *koeficijent) {
  57.     switch(prekidaci) {
  58.       case 0x00:
  59.       // je l ima ovo cudo uopste mogucnost rada sa float i double?
  60.       // neka je ovo koeficijent za trajanje 0.5 sec
  61.         *koeficijent = 1;
  62.       break;
  63.       case 0x01:
  64.       // onda u sekundi imam takva dva
  65.         *koeficijent = 2;
  66.       break;
  67.       case 0x02:
  68.       // u 2 sekunde imam takva 4
  69.         *koeficijent = 4;
  70.       break;
  71.       case 0x03:
  72.       // u 4 sekunde imam 8 takvih
  73.         *koeficijent = 8;
  74.       break;
  75.     }
  76. }
  77.  
  78. void podesi_niz(byte prekidaci, byte ping_pong){
  79.   switch(prekidaci) {
  80.     case 0x00:
  81.       CRV_PREK  = ping_pong;
  82.     break;
  83.     case 0x01:
  84.       ZUTE      = ping_pong;
  85.     break;
  86.     case 0x02:
  87.       ZELENE    = ping_pong;
  88.     break;
  89.     case 0x03:
  90.       PLAVE     = ping_pong;
  91.     break;
  92.   }
  93. }
  94.  
  95. void ping_pong(byte *slika_ispisa, byte *smer, byte koeficijent){
  96.   switch(*smer) {
  97.     case 1:
  98.       *slika_ispisa <<= 1;
  99.       if (*slika_ispisa == 0x80) {
  100.         // kad je stanje 1000 0000, ne pomeraj, nego obrci smer
  101.         *smer = 0;
  102.       }
  103.     break;
  104.  
  105.     case 0:
  106.       *slika_ispisa >>= 1;
  107.       if (*slika_ispisa == 0x01) {
  108.         *smer = 1;
  109.       }
  110.     break;
  111.   }
  112.  
  113.   // svako pomeranje isprati delayom
  114.   // broj koraka 15, referentno vrijeme pola sekunde kao najmanje trajanje
  115.   // ping pong intervala, posto imas 15 koraka najmanji interval dijelis sa 15
  116.   // i mnozis sa koeficijentom koji kaze koliko takvih koraka imas ako zelis da
  117.   // ih vozis 1, 2, 4 sekundi
  118.   delay_ms(koeficijent * (500 / 15));
  119. }
  120.  
  121. void main()
  122. {
  123.   //inicijalizacija tajmera 0:
  124.     TMOD = 0x01;            //tajmer 2 -> 16-bitni mod
  125.     ET0 = 1;                //dozvola prekida tajmera 0
  126.     TR0 = 1;                //tajmer 0 ON
  127.  
  128.     EA = 1;                 //dozvola prekida
  129.  
  130.     while(1){
  131.         // 0011 1111 je stanje prekidaca kada su ukljucena dva lijeva
  132.         // ~0011 1111 = 1100 0000
  133.         // 1100 0000 & 1100 0000 ===> ostavlja samo lijeva dva bita.
  134.         // 11xx xxxx >> 6 je 0000 0011
  135.         // sada prek_za_niz poredis sa vrijednostima iz tabele 00, 01, 10, 11
  136.         prek_za_niz   = (~CRV_PREK & 0xC0) >> 6;
  137.         // ovde je maska 0000 0011 pa ne moram nista da shiftujem
  138.         prek_za_vreme = ~CRV_PREK & 0x03;
  139.    
  140.         //CRV_PREK = 0xAA;
  141.         podesi_trajanje(prek_za_vreme, &koeficijent);
  142.    
  143.         // manipulisi polozajem diodice.
  144.         ping_pong(&slika_ispisa, &smer, koeficijent);
  145.    
  146.         // sliku ispisa saljemo na niz dioda.
  147.         podesi_niz(prek_za_niz, slika_ispisa); 
  148.     }
  149. }
Add Comment
Please, Sign In to add comment