Advertisement
zdenekpetrzd

Arduino shift register reading to variables

Dec 2nd, 2017
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.73 KB | None | 0 0
  1. /* Kolik posuvných registrů je spojeno? */
  2. #define POCET_SHIFT_REGISTRU 6
  3. // ________
  4. /* Kolik vstupů má každý shift registr? */ // Paralel load -> | |_| | <- VCC
  5. #define POCET_VSTUPU POCET_SHIFT_REGISTRU * 8 // Clock -> | 7 | <- Clock enable
  6. // switch 4 -> | 4 | <- switch 5
  7. /* Kolik microsekund má trvat puls pro zachycení stavů tlačítek? */ // switch 3 -> | HC | <- switch 6
  8. #define DELKA_PULSU_USEC 5 // switch 2 -> | 6 | <- switch 7
  9. // switch 1 -> | 5 | <- switch 8
  10. /* Doporučená prodleva mezi čtením posuvných registrů.*/ // Nothing -> | 1 | <- From next
  11. #define PRODLEVA_CTENI 1 // GROUND -> |_______| <- Q7
  12.  
  13. /* Pokud je posuvných registrů více než 2, změň proměnnou na "unsigned long". Jinak "int". */
  14. #define BYTES_VAL_T unsigned long long
  15.  
  16. //════════════════════════════════════════════════════════════════════════════════════════//
  17. int ploadPin = 8; // Připojení k Parallel load pinu posuvného registru (1)
  18. int clockEnablePin = 9; // Připojení k Clock Enable pinu posuvného registru (15)
  19. int dataPin = 11; // Připojení k Q7 pinu posuvného registru (9)
  20. int clockPin = 12; // Připojení k Clock pinu posuvného registru (2)
  21.  
  22. int pozmeneno[POCET_VSTUPU]= {};
  23. unsigned long long tlacitkoOLD[POCET_VSTUPU] = {};
  24. long tlacitko[POCET_VSTUPU] = {};
  25. //int vystupy[] = {22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,
  26. // 37,38,39,40,41,42,43,44,45};
  27.  
  28. BYTES_VAL_T pinValues;
  29. BYTES_VAL_T oldPinValues;
  30.  
  31. //════════════════════════════════════════════════════════════════════════════════════════//
  32. /* Funkce pro přečtení stavů výstupů na shift regitrech a jejich zápis do integreru. */
  33. BYTES_VAL_T read_shift_regs()
  34. {
  35. unsigned long long bitVal; //Deklarace proměnné "bitVal" typu "long"
  36. BYTES_VAL_T bytesVal = 0; //Deklarace proměnné "bytesVal" typu "BYTES_VAL_T" o hodnotě "0"
  37.  
  38. /* Trigger a parallel Load to latch the state of the data lines, */
  39. digitalWrite(clockEnablePin, HIGH);
  40. digitalWrite(ploadPin, LOW);
  41. delayMicroseconds(DELKA_PULSU_USEC);
  42. digitalWrite(ploadPin, HIGH);
  43. digitalWrite(clockEnablePin, LOW);
  44.  
  45. /* Cyklus pro přečtení jednotlivých hodnot z shift registru.*/
  46. for(int i = 0; i < POCET_VSTUPU; i++)
  47. {
  48. bitVal = digitalRead(dataPin); //Hodnota každého bitu = napětí na data pinu
  49. bytesVal |= (bitVal << ((POCET_VSTUPU-1) - i)); //Přiřaď správný bit dle počtu vstupů na shiftreg a zapiš do bytesVal
  50.  
  51. digitalWrite(clockPin, HIGH); //Pošli inpuls shift registru
  52. delayMicroseconds(DELKA_PULSU_USEC); //Čekej pár microsekund
  53. digitalWrite(clockPin, LOW); //Ukonči inpuls
  54. }
  55. return(bytesVal);
  56. }
  57. //════════════════════════════════════════════════════════════════════════════════════════//
  58. void display_pin_values() //Funkce pro zapsání hodnot z shiftregistru do proměnných
  59. {
  60. for(int j = 0; j < POCET_VSTUPU; j++) //Zapisuj dokud nedojdeš k poslednímu
  61. {
  62. tlacitko[j] = bitRead(pinValues,j); //Do proměnné "tlacitko" zapiš hodnotu bitu s indexem "j"
  63. Serial.print(tlacitko[j]); //Vypiš po Serial stav
  64. }
  65. Serial.print("\r\n");
  66. }
  67. //════════════════════════════════════════════════════════════════════════════════════════//
  68. void setup()
  69. {
  70. Serial.begin(300); //Začni sériovou komunikaci ve zvolené rychlosti
  71.  
  72. // for(int i = 0; i < POCET_VSTUPU; i++) //Cyklus i=promenna vystupu
  73. // { pinMode(vystupy[i],OUTPUT); } //Změna na výstup
  74.  
  75. pinMode(ploadPin, OUTPUT); //Nahrávací (shiftregister 1 na 8 pin Arduina)
  76. pinMode(clockEnablePin, OUTPUT); //Sepnutí časovače (shiftregister 15 na 9 pin Arduina)
  77. pinMode(clockPin, OUTPUT); //Časovač (shiftregister 2 to na 12 pin Arduina)
  78. pinMode(dataPin, INPUT); //Data z 74HC165 (shiftregister 9 to 11 pin Arduina)
  79.  
  80. digitalWrite(clockPin, LOW); //Ujisti se, že clock pin je LOW
  81. digitalWrite(ploadPin, HIGH); //Nastav nahrávací pin na HIGH
  82.  
  83. pinValues = read_shift_regs(); //Hodnoty pinů = výstup z shiftregistru
  84. display_pin_values(); //Funkce zobrazení hodnot shiftregistru
  85. oldPinValues = pinValues; //Nahrazení starých hodnot novými
  86.  
  87. for(int j = 0; j < POCET_VSTUPU; j++) //Zapisuj dokud nedojdeš k poslednímu
  88. {
  89. tlacitko[j] = bitRead(pinValues,j); //Do proměnné "tlacitko" zapiš hodnotu bitu s indexem "j"
  90. tlacitkoOLD[j] = tlacitko[j];
  91. }
  92. }
  93. //════════════════════════════════════════════════════════════════════════════════════════//
  94. /*void ZapisNaLED()
  95. {
  96. for(int l = 0; l < POCET_VSTUPU; l++) //Zapiš výstupy na LED diody
  97. {
  98. if(tlacitko[l]==1) //Pokud byla do proměnné zapsána 1
  99. { digitalWrite(vystupy[l],HIGH); } //Zapiš HIGH
  100. else //Jinak
  101. { digitalWrite(vystupy[l],LOW); } //Zapiš LOW
  102. }
  103. }*/
  104. //════════════════════════════════════════════════════════════════════════════════════════//
  105. void loop()
  106. {
  107. /* Read the state of all zones.*/
  108. pinValues = read_shift_regs(); //Hodnoty pinů = výstup z shiftregistru
  109.  
  110. /* If there was a chage in state, display which ones changed.*/
  111. if(pinValues != oldPinValues) //Pokud se staré hodnoty nerovnají novým:
  112. {
  113. display_pin_values(); //Spusť funkci zobraz hodnoty
  114.  
  115. for(int m = 0; m < POCET_VSTUPU; m++){ //Cyklus pro kontrolu, zda se změnil stav tlačítek
  116. if(tlacitko[m] >> tlacitkoOLD[m]){ //Pokud se stav některého z tlačítek změnil na HIGH:
  117. Serial.print("Zjištěna změna na tlačítku:"); //Vypiš "Zjištěna změna"
  118. Serial.print(m); //Napiš na kterém z nich
  119. Serial.print("\r\n"); //Začni nový řádek
  120. pozmeneno[m] = 1; //Změněné tlačítko = m
  121. }
  122. tlacitkoOLD[m] = tlacitko[m]; //Staré tlačítko = nové
  123. }
  124. oldPinValues = pinValues; //nahrazení starých hodnot novými
  125. }
  126.  
  127. // ZapisNaLED(); //Spusť funkci Zapiš na LED
  128. delay(PRODLEVA_CTENI); //Před opakováním počkej pár microsekund
  129. }
  130. //════════════════════════════════════════════════════════════════════════════════════════//
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement