bynase.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. #include "bynase.h"
  2. #include <avr/io.h>
  3. //number of samples simple_byin should take
  4. #define NUMBER_OF_SAMPLES 200
  5. #define NUMBER_OF_BYNASE_PINS 19
  6. uint8_t outPinsA;//Arduino Pins 7..0
  7. uint8_t outPinsB;//Arduino Pins 15..8
  8. uint8_t outPinsC;//Arduino Pins 19..16
  9. uint8_t inPinsA;//Arduino Pins 7..0
  10. uint8_t inPinsB;//Arduino Pins 15..8
  11. uint8_t inPinsC;//Arduino Pins 19..16
  12. uint8_t byval_out[NUMBER_OF_BYNASE_PINS];//byvals for up to 19 output pins
  13. uint8_t byval_in[NUMBER_OF_BYNASE_PINS];//byvals for up to 19 input pins
  14. uint16_t total_in[NUMBER_OF_BYNASE_PINS];
  15. uint8_t count_in[NUMBER_OF_BYNASE_PINS];
  16. uint8_t timerSpeed;
  17. uint8_t byrandValue;//for random
  18. uint8_t byrand(void)
  19. {
  20. uint8_t v = byrandValue++;
  21. uint8_t r = 0;
  22. uint8_t q = 255;
  23. while(q) {
  24. r = (r << 1) | (v & 1);
  25. v >>= 1;
  26. q >>= 1;
  27. }
  28. return r;
  29. }
  30. void _byin(uint8_t pinNumber)
  31. {
  32. if(pinNumber < 8)
  33. {
  34. if(! (inPinsA & (1 <<(pinNumber))) )
  35. {
  36. return;//pin is not registered for bynase output
  37. }
  38. }
  39. else if(pinNumber < 15)
  40. {
  41. if(! (inPinsB & (1 <<(pinNumber-8))) )
  42. {
  43. return;//pin is not registered for bynase output
  44. }
  45. }
  46. else
  47. {
  48. if(! (inPinsC & (1 <<(pinNumber-15))) )
  49. {
  50. return;//pin is not registered for bynase output
  51. }
  52. }
  53. count_in[pinNumber]++;
  54. if(count_in[pinNumber] >= NUMBER_OF_SAMPLES)
  55. {
  56. byval_in[pinNumber] = (total_in[pinNumber] * 100) / count_in[pinNumber];
  57. count_in[pinNumber] = 0;
  58. total_in[pinNumber] = 0;
  59. }
  60. else
  61. {
  62. if(digitalRead(pinNumber) == HIGH)
  63. {
  64. total_in[pinNumber]++;
  65. }
  66. }
  67. }
  68. void byin(void)
  69. {
  70. uint8_t z;
  71. for(z=0; z<NUMBER_OF_BYNASE_PINS; z++)
  72. {
  73. _byin(z);
  74. }
  75. }
  76. void _byout(uint8_t pinNumber, uint8_t random_value)
  77. {
  78. if(pinNumber < 8)
  79. {
  80. if(! (outPinsA & (1 <<pinNumber)) )
  81. {
  82. return;//pin is not registered for bynase input
  83. }
  84. }
  85. else if(pinNumber < 15)
  86. {
  87. if(! (outPinsB & (1 <<(pinNumber-8))) )
  88. {
  89. return;//pin is not registered for bynase input
  90. }
  91. }
  92. else
  93. {
  94. if(! (outPinsC & (1 <<(pinNumber-15))) )
  95. {
  96. return;//pin is not registered for bynase input
  97. }
  98. }
  99. if (byval_out[pinNumber] >= random_value)
  100. {
  101. digitalWrite(pinNumber, HIGH);
  102. }
  103. else
  104. {
  105. digitalWrite(pinNumber, LOW);
  106. }
  107. }
  108. void byout(void)
  109. {
  110. uint8_t random_value;//only one random value for all ports
  111. random_value = ((byrand() % 99)+1);//random value between 1 and 100
  112. uint8_t z;
  113. for(z=0; z<NUMBER_OF_BYNASE_PINS; z++)
  114. {
  115. _byout(z, random_value);
  116. }
  117. }
  118. void bynase_init(uint8_t speed)
  119. {
  120. uint8_t z;
  121. uint8_t oldSREG = SREG;
  122. if(timerSpeed != speed)
  123. {
  124. for(z=0; z<NUMBER_OF_BYNASE_PINS; z++)
  125. {
  126. byval_out[z] = 0;
  127. byval_in[z] = 0;
  128. total_in[z] = 0;
  129. count_in[z] = 0;
  130. }
  131. timerSpeed = speed;
  132. cli();
  133. //INIT TIMER1
  134. TCCR1A = 0x00;
  135. TCCR1B = 0b00000001; //no prescaler
  136. TIMSK1 = 0b00000001;//enable timer overflow interrupt
  137. // byrandValue=0;
  138. // reenable interrupts.
  139. SREG = oldSREG;
  140. }
  141. }
  142. void bynase_write(uint8_t pinNumber, uint8_t value)
  143. {
  144. byval_out[pinNumber] = value;
  145. }
  146. uint8_t bynase_read(uint8_t pinNumber)
  147. {
  148. return byval_in[pinNumber];
  149. }
  150. void bynase_registerPin(uint8_t pinNumber, uint8_t mode)
  151. {
  152. if(pinNumber > (NUMBER_OF_BYNASE_PINS-1))
  153. {
  154. return;
  155. }
  156. if(mode == BYNASE_INPUT)
  157. {
  158. pinMode(pinNumber, INPUT);
  159. digitalWrite(pinNumber, LOW);
  160. if(pinNumber < 8)
  161. {
  162. inPinsA |= (1<<pinNumber);
  163. outPinsA &= (uint8_t)~(1<<pinNumber);
  164. }
  165. else if(pinNumber < 15)
  166. {
  167. inPinsB |= (1<<(pinNumber-8));
  168. outPinsB &= (uint8_t)~(1<<(pinNumber-8));
  169. }
  170. else
  171. {
  172. inPinsC |= (1<<(pinNumber-15));
  173. outPinsC &= (uint8_t)~(1<<(pinNumber-15));
  174. }
  175. }
  176. else if(mode == BYNASE_OUTPUT)
  177. {
  178. pinMode(pinNumber, OUTPUT);
  179. digitalWrite(pinNumber, LOW);
  180. if(pinNumber < 8)
  181. {
  182. outPinsA |= (1<<pinNumber);
  183. inPinsA &= (uint8_t)~(1<<pinNumber);
  184. }
  185. else if(pinNumber < 15)
  186. {
  187. outPinsB |= (1<<(pinNumber-8));
  188. inPinsB &= (uint8_t)~(1<<(pinNumber-8));
  189. }
  190. else
  191. {
  192. outPinsC |= (1<<(pinNumber-15));
  193. inPinsC &= (uint8_t)~(1<<(pinNumber-15));
  194. }
  195. }
  196. else if(mode == BYNASE_BOTH)
  197. {
  198. if(pinNumber < 8)
  199. {
  200. outPinsA |= (1<<pinNumber);
  201. inPinsA |= (1<<pinNumber);
  202. }
  203. else if(pinNumber < 15)
  204. {
  205. outPinsB |= (1<<(pinNumber-8));
  206. inPinsB |= (1<<(pinNumber-8));
  207. }
  208. else
  209. {
  210. outPinsC |= (1<<(pinNumber-15));
  211. inPinsC |= (1<<(pinNumber-15));
  212. }
  213. }
  214. else if(mode == BYNASE_NONE)
  215. {
  216. if(pinNumber < 8)
  217. {
  218. inPinsA &= (uint8_t)~(1<<pinNumber);
  219. outPinsA &= (uint8_t)~(1<<pinNumber);
  220. }
  221. else if(pinNumber < 15)
  222. {
  223. inPinsB &= (uint8_t)~(1<<(pinNumber-8));
  224. outPinsB &= (uint8_t)~(1<<(pinNumber-8));
  225. }
  226. else
  227. {
  228. inPinsC &= (uint8_t)~(1<<(pinNumber-15));
  229. outPinsC &= (uint8_t)~(1<<(pinNumber-15));
  230. }
  231. }
  232. }
  233. void bynase_unregisterPin(uint8_t pinNumber)
  234. {
  235. bynase_registerPin(pinNumber, BYNASE_NONE);
  236. }
  237. #if defined (__AVR_ATtiny84__)
  238. ISR(TIM1_OVF_vect)
  239. #elif defined(__AVR_ATmega8__)
  240. ISR(TIMER1_OVF_vect)
  241. #elif defined (__AVR_ATmega168__)
  242. ISR(TIMER1_OVF_vect)
  243. #elif defined (__AVR_ATmega328P__)
  244. ISR(TIMER1_OVF_vect)
  245. #endif
  246. {
  247. uint8_t oldSREG = SREG;
  248. cli();
  249. if( (inPinsA | inPinsB | inPinsC) >0)
  250. {
  251. byin();
  252. }
  253. if( (outPinsA |outPinsB | outPinsC) >0)
  254. {
  255. byout();
  256. }
  257. TCNT1 = 0xFFFF - (255-timerSpeed);//count 255-timerspeed times from now on at 1Mhz
  258. TIFR1 = 0xFF;//clear all pending interrups for timer1
  259. // reenable interrupts.
  260. SREG = oldSREG;
  261. }