Advertisement
milanmetal

[AVR/C] Zadatak / Kolokvijum 27.12 u 15:00

Dec 27th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.84 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. //makroi za kontrolu pinova preko kojih je kontroler povezan sa 74HC165:
  4. #define SCL_HI (PORTC |= (1<<5))
  5. #define SCL_LO (PORTC &= ~(1<<5))
  6. #define SDA (PINC & (1 << 4))
  7. #define SHLD_HI (PORTB |= (1<<5))
  8. #define SHLD_LO (PORTB &= ~(1<<5))
  9.  
  10. unsigned char sekvenca = 0xff;
  11. unsigned char prekidaci = 0; //ocitaj_prekidace();
  12.  
  13. unsigned char poslednjeStanje = 0;
  14.  
  15. unsigned char ocitaj_prekidace()
  16. {
  17.     unsigned char i, tmp = 0, mask = 0x80;
  18.     //impuls za upis stanja prekidaca u registar
  19.     SHLD_HI;
  20.     SHLD_LO;
  21.     SHLD_HI;
  22.  
  23.     for (i=0; i<8; i++)
  24.     {
  25.         SCL_LO;
  26.         SCL_HI; //generisanje aktivne ivice takta
  27.  
  28.         if (SDA) //provera stanja ulaznog pina
  29.         tmp |= mask;
  30.         mask >>= 1;
  31.     }
  32.     return tmp;
  33. }
  34.  
  35.  
  36. void podesiSekvencu(){
  37.     switch(prekidaci){
  38.         case 0xff:
  39.             if(poslednjeStanje != prekidaci) {
  40.                 sekvenca = ~0xfc;  
  41.                 poslednjeStanje = 0xff;
  42.             }
  43.         break;
  44.  
  45.         case 0xfe:
  46.             if(poslednjeStanje != prekidaci) {
  47.                 sekvenca = ~0xf0;  
  48.                 poslednjeStanje = 0xfe;
  49.             }
  50.         break;
  51.  
  52.         case 0xfd:
  53.             if(poslednjeStanje != prekidaci) {
  54.                 sekvenca = ~0xc0;  
  55.                 poslednjeStanje = 0xfd;
  56.             }
  57.         break;
  58.  
  59.         case 0xfc:
  60.             if(poslednjeStanje != prekidaci) {
  61.                 sekvenca = ~0x24;  
  62.                 poslednjeStanje = 0xfc;
  63.             }
  64.         break;
  65.     }
  66. }
  67.  
  68. void rotiraj() {
  69.     unsigned char MSB = sekvenca & 0x80;    // ciljam skroz levi bit 0x80 = 1000 0000
  70.     sekvenca = sekvenca << 1;               // pomeram jedno mesto levo
  71.  
  72.     if(MSB & 0x80) {                                               
  73.         sekvenca |= 1;                      // OR sekvence sa 1, odnosno +1, LSB postaje 1
  74.     }
  75.     _delay_ms(500);
  76. }
  77. int main(void)
  78. {
  79.     DDRD = 0xff; //port D -> izlaz
  80.     DDRC = 0x20; //PC5 -> izlaz
  81.     DDRB = 0x30; //PB5 i PB4 -> izlazi
  82.  
  83.     PORTB = ~0x10; //ukljucenje tranzistora Q0
  84.     while (1) {
  85.         prekidaci = ocitaj_prekidace();
  86.         podesiSekvencu();
  87.  
  88.         PORTD = ~sekvenca;
  89.         rotiraj();
  90.     }
  91.     return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement