My Marlin configs for Fabrikator Mini and CTC i3 Pro B
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

fastio.cpp 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. /**
  2. * Marlin 3D Printer Firmware
  3. * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
  4. *
  5. * Based on Sprinter and grbl.
  6. * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
  7. *
  8. * This program is free software: you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation, either version 3 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program. If not, see <https://www.gnu.org/licenses/>.
  20. *
  21. */
  22. /**
  23. * Fast I/O for extended pins
  24. */
  25. #ifdef __AVR__
  26. #include "fastio.h"
  27. #ifdef FASTIO_EXT_START
  28. #include "../shared/Marduino.h"
  29. #define _IS_EXT(P) WITHIN(P, FASTIO_EXT_START, FASTIO_EXT_END)
  30. void extDigitalWrite(const int8_t pin, const uint8_t state) {
  31. #define _WCASE(N) case N: WRITE(N, state); break
  32. switch (pin) {
  33. default: digitalWrite(pin, state);
  34. #if _IS_EXT(70)
  35. _WCASE(70);
  36. #endif
  37. #if _IS_EXT(71)
  38. _WCASE(71);
  39. #endif
  40. #if _IS_EXT(72)
  41. _WCASE(72);
  42. #endif
  43. #if _IS_EXT(73)
  44. _WCASE(73);
  45. #endif
  46. #if _IS_EXT(74)
  47. _WCASE(74);
  48. #endif
  49. #if _IS_EXT(75)
  50. _WCASE(75);
  51. #endif
  52. #if _IS_EXT(76)
  53. _WCASE(76);
  54. #endif
  55. #if _IS_EXT(77)
  56. _WCASE(77);
  57. #endif
  58. #if _IS_EXT(78)
  59. _WCASE(78);
  60. #endif
  61. #if _IS_EXT(79)
  62. _WCASE(79);
  63. #endif
  64. #if _IS_EXT(80)
  65. _WCASE(80);
  66. #endif
  67. #if _IS_EXT(81)
  68. _WCASE(81);
  69. #endif
  70. #if _IS_EXT(82)
  71. _WCASE(82);
  72. #endif
  73. #if _IS_EXT(83)
  74. _WCASE(83);
  75. #endif
  76. #if _IS_EXT(84)
  77. _WCASE(84);
  78. #endif
  79. #if _IS_EXT(85)
  80. _WCASE(85);
  81. #endif
  82. #if _IS_EXT(86)
  83. _WCASE(86);
  84. #endif
  85. #if _IS_EXT(87)
  86. _WCASE(87);
  87. #endif
  88. #if _IS_EXT(88)
  89. _WCASE(88);
  90. #endif
  91. #if _IS_EXT(89)
  92. _WCASE(89);
  93. #endif
  94. #if _IS_EXT(90)
  95. _WCASE(90);
  96. #endif
  97. #if _IS_EXT(91)
  98. _WCASE(91);
  99. #endif
  100. #if _IS_EXT(92)
  101. _WCASE(92);
  102. #endif
  103. #if _IS_EXT(93)
  104. _WCASE(93);
  105. #endif
  106. #if _IS_EXT(94)
  107. _WCASE(94);
  108. #endif
  109. #if _IS_EXT(95)
  110. _WCASE(95);
  111. #endif
  112. #if _IS_EXT(96)
  113. _WCASE(96);
  114. #endif
  115. #if _IS_EXT(97)
  116. _WCASE(97);
  117. #endif
  118. #if _IS_EXT(98)
  119. _WCASE(98);
  120. #endif
  121. #if _IS_EXT(99)
  122. _WCASE(99);
  123. #endif
  124. #if _IS_EXT(100)
  125. _WCASE(100);
  126. #endif
  127. }
  128. }
  129. uint8_t extDigitalRead(const int8_t pin) {
  130. #define _RCASE(N) case N: return READ(N)
  131. switch (pin) {
  132. default: return digitalRead(pin);
  133. #if _IS_EXT(70)
  134. _RCASE(70);
  135. #endif
  136. #if _IS_EXT(71)
  137. _RCASE(71);
  138. #endif
  139. #if _IS_EXT(72)
  140. _RCASE(72);
  141. #endif
  142. #if _IS_EXT(73)
  143. _RCASE(73);
  144. #endif
  145. #if _IS_EXT(74)
  146. _RCASE(74);
  147. #endif
  148. #if _IS_EXT(75)
  149. _RCASE(75);
  150. #endif
  151. #if _IS_EXT(76)
  152. _RCASE(76);
  153. #endif
  154. #if _IS_EXT(77)
  155. _RCASE(77);
  156. #endif
  157. #if _IS_EXT(78)
  158. _RCASE(78);
  159. #endif
  160. #if _IS_EXT(79)
  161. _RCASE(79);
  162. #endif
  163. #if _IS_EXT(80)
  164. _RCASE(80);
  165. #endif
  166. #if _IS_EXT(81)
  167. _RCASE(81);
  168. #endif
  169. #if _IS_EXT(82)
  170. _RCASE(82);
  171. #endif
  172. #if _IS_EXT(83)
  173. _RCASE(83);
  174. #endif
  175. #if _IS_EXT(84)
  176. _RCASE(84);
  177. #endif
  178. #if _IS_EXT(85)
  179. _RCASE(85);
  180. #endif
  181. #if _IS_EXT(86)
  182. _RCASE(86);
  183. #endif
  184. #if _IS_EXT(87)
  185. _RCASE(87);
  186. #endif
  187. #if _IS_EXT(88)
  188. _RCASE(88);
  189. #endif
  190. #if _IS_EXT(89)
  191. _RCASE(89);
  192. #endif
  193. #if _IS_EXT(90)
  194. _RCASE(90);
  195. #endif
  196. #if _IS_EXT(91)
  197. _RCASE(91);
  198. #endif
  199. #if _IS_EXT(92)
  200. _RCASE(92);
  201. #endif
  202. #if _IS_EXT(93)
  203. _RCASE(93);
  204. #endif
  205. #if _IS_EXT(94)
  206. _RCASE(94);
  207. #endif
  208. #if _IS_EXT(95)
  209. _RCASE(95);
  210. #endif
  211. #if _IS_EXT(96)
  212. _RCASE(96);
  213. #endif
  214. #if _IS_EXT(97)
  215. _RCASE(97);
  216. #endif
  217. #if _IS_EXT(98)
  218. _RCASE(98);
  219. #endif
  220. #if _IS_EXT(99)
  221. _RCASE(99);
  222. #endif
  223. #if _IS_EXT(100)
  224. _RCASE(100);
  225. #endif
  226. }
  227. }
  228. #if 0
  229. /**
  230. * Set Timer 5 PWM frequency in Hz, from 3.8Hz up to ~16MHz
  231. * with a minimum resolution of 100 steps.
  232. *
  233. * DC values -1.0 to 1.0. Negative duty cycle inverts the pulse.
  234. */
  235. uint16_t set_pwm_frequency_hz(const float &hz, const float dca, const float dcb, const float dcc) {
  236. float count = 0;
  237. if (hz > 0 && (dca || dcb || dcc)) {
  238. count = float(F_CPU) / hz; // 1x prescaler, TOP for 16MHz base freq.
  239. uint16_t prescaler; // Range of 30.5Hz (65535) 64.5KHz (>31)
  240. if (count >= 255. * 256.) { prescaler = 1024; SET_CS(5, PRESCALER_1024); }
  241. else if (count >= 255. * 64.) { prescaler = 256; SET_CS(5, PRESCALER_256); }
  242. else if (count >= 255. * 8.) { prescaler = 64; SET_CS(5, PRESCALER_64); }
  243. else if (count >= 255.) { prescaler = 8; SET_CS(5, PRESCALER_8); }
  244. else { prescaler = 1; SET_CS(5, PRESCALER_1); }
  245. count /= float(prescaler);
  246. const float pwm_top = round(count); // Get the rounded count
  247. ICR5 = (uint16_t)pwm_top - 1; // Subtract 1 for TOP
  248. OCR5A = pwm_top * ABS(dca); // Update and scale DCs
  249. OCR5B = pwm_top * ABS(dcb);
  250. OCR5C = pwm_top * ABS(dcc);
  251. _SET_COM(5, A, dca ? (dca < 0 ? COM_SET_CLEAR : COM_CLEAR_SET) : COM_NORMAL); // Set compare modes
  252. _SET_COM(5, B, dcb ? (dcb < 0 ? COM_SET_CLEAR : COM_CLEAR_SET) : COM_NORMAL);
  253. _SET_COM(5, C, dcc ? (dcc < 0 ? COM_SET_CLEAR : COM_CLEAR_SET) : COM_NORMAL);
  254. SET_WGM(5, FAST_PWM_ICRn); // Fast PWM with ICR5 as TOP
  255. //SERIAL_ECHOLNPGM("Timer 5 Settings:");
  256. //SERIAL_ECHOLNPAIR(" Prescaler=", prescaler);
  257. //SERIAL_ECHOLNPAIR(" TOP=", ICR5);
  258. //SERIAL_ECHOLNPAIR(" OCR5A=", OCR5A);
  259. //SERIAL_ECHOLNPAIR(" OCR5B=", OCR5B);
  260. //SERIAL_ECHOLNPAIR(" OCR5C=", OCR5C);
  261. }
  262. else {
  263. // Restore the default for Timer 5
  264. SET_WGM(5, PWM_PC_8); // PWM 8-bit (Phase Correct)
  265. SET_COMS(5, NORMAL, NORMAL, NORMAL); // Do nothing
  266. SET_CS(5, PRESCALER_64); // 16MHz / 64 = 250KHz
  267. OCR5A = OCR5B = OCR5C = 0;
  268. }
  269. return round(count);
  270. }
  271. #endif
  272. #endif // FASTIO_EXT_START
  273. #endif // __AVR__