Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

12 лет назад
12 лет назад
12 лет назад
12 лет назад
12 лет назад
12 лет назад
12 лет назад
12 лет назад
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /*
  2. * wfi.c:
  3. * Wait for Interrupt test program
  4. *
  5. * This program demonstrates the use of the waitForInterrupt()
  6. * function in wiringPi. It listens to a button input on
  7. * BCM_GPIO pin 17 (wiringPi pin 0)
  8. *
  9. * The biggest issue with this method is that it really only works
  10. * well in Sys mode.
  11. *
  12. * Jan 2013: This way of doing things is sort of deprecated now, see
  13. * the wiringPiISR() function instead and the isr.c test program here.
  14. *
  15. * Copyright (c) 2012-2013 Gordon Henderson.
  16. ***********************************************************************
  17. * This file is part of wiringPi:
  18. * https://projects.drogon.net/raspberry-pi/wiringpi/
  19. *
  20. * wiringPi is free software: you can redistribute it and/or modify
  21. * it under the terms of the GNU Lesser General Public License as published by
  22. * the Free Software Foundation, either version 3 of the License, or
  23. * (at your option) any later version.
  24. *
  25. * wiringPi is distributed in the hope that it will be useful,
  26. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  27. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  28. * GNU Lesser General Public License for more details.
  29. *
  30. * You should have received a copy of the GNU Lesser General Public License
  31. * along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
  32. ***********************************************************************
  33. */
  34. #include <stdio.h>
  35. #include <stdlib.h>
  36. #include <wiringPi.h>
  37. // A 'key' which we can lock and unlock - values are 0 through 3
  38. // This is interpreted internally as a pthread_mutex by wiringPi
  39. // which is hiding some of that to make life simple.
  40. #define COUNT_KEY 0
  41. // What BCM_GPIO input are we using?
  42. #define BUTTON_PIN 17
  43. // Debounce time in mS
  44. #define DEBOUNCE_TIME 100
  45. // globalCounter:
  46. // Global variable to count interrupts
  47. // Should be declared volatile to make sure the compiler doesn't cache it.
  48. static volatile int globalCounter = 0 ;
  49. /*
  50. * waitForIt:
  51. * This is a thread created using the wiringPi simplified threading
  52. * mechanism. It will wait on an interrupt on the button and increment
  53. * a counter.
  54. *********************************************************************************
  55. */
  56. PI_THREAD (waitForIt)
  57. {
  58. int state = 0 ;
  59. int debounceTime = 0 ;
  60. (void)piHiPri (10) ; // Set this thread to be high priority
  61. for (;;)
  62. {
  63. if (waitForInterrupt (BUTTON_PIN, -1) > 0) // Got it
  64. {
  65. // Bouncing?
  66. if (millis () < debounceTime)
  67. {
  68. debounceTime = millis () + DEBOUNCE_TIME ;
  69. continue ;
  70. }
  71. // We have a valid one
  72. state ^= 1 ;
  73. piLock (COUNT_KEY) ;
  74. ++globalCounter ;
  75. piUnlock (COUNT_KEY) ;
  76. // Wait for key to be released
  77. while (digitalRead (BUTTON_PIN) == LOW)
  78. delay (1) ;
  79. debounceTime = millis () + DEBOUNCE_TIME ;
  80. }
  81. }
  82. }
  83. /*
  84. * setup:
  85. * Demo a crude but effective way to initialise the hardware
  86. *********************************************************************************
  87. */
  88. void setup (void)
  89. {
  90. // Use the gpio program to initialise the hardware
  91. // (This is the crude, but effective)
  92. system ("gpio edge 17 falling") ;
  93. // Setup wiringPi
  94. wiringPiSetupSys () ;
  95. // Fire off our interrupt handler
  96. piThreadCreate (waitForIt) ;
  97. }
  98. /*
  99. * main
  100. *********************************************************************************
  101. */
  102. int main (void)
  103. {
  104. int lastCounter = 0 ;
  105. int myCounter = 0 ;
  106. setup () ;
  107. for (;;)
  108. {
  109. printf ("Waiting ... ") ; fflush (stdout) ;
  110. while (myCounter == lastCounter)
  111. {
  112. piLock (COUNT_KEY) ;
  113. myCounter = globalCounter ;
  114. piUnlock (COUNT_KEY) ;
  115. delay (500) ;
  116. }
  117. printf (" Done. myCounter: %5d\n", myCounter) ;
  118. lastCounter = myCounter ;
  119. }
  120. return 0 ;
  121. }