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.

pins_arduino.c 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627
  1. /*
  2. pins_arduino.c - pin definitions for the Arduino board
  3. Part of Arduino / Wiring Lite
  4. Copyright (c) 2005 David A. Mellis
  5. This library is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU Lesser General Public
  7. License as published by the Free Software Foundation; either
  8. version 2.1 of the License, or (at your option) any later version.
  9. This library is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. Lesser General Public License for more details.
  13. You should have received a copy of the GNU Lesser General
  14. Public License along with this library; if not, write to the
  15. Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  16. Boston, MA 02111-1307 USA
  17. Changelog
  18. -----------
  19. 11/25/11 - ryan@ryanmsutton.com - Add pins for Sanguino 644P and 1284P
  20. $Id$
  21. */
  22. #include <avr/io.h>
  23. #include "wiring_private.h"
  24. #include "pins_arduino.h"
  25. // On the Arduino board, digital pins are also used
  26. // for the analog output (software PWM). Analog input
  27. // pins are a separate set.
  28. // ATMEL ATMEGA8 & 168 / ARDUINO
  29. //
  30. // +-\/-+
  31. // PC6 1| |28 PC5 (AI 5)
  32. // (D 0) PD0 2| |27 PC4 (AI 4)
  33. // (D 1) PD1 3| |26 PC3 (AI 3)
  34. // (D 2) PD2 4| |25 PC2 (AI 2)
  35. // PWM+ (D 3) PD3 5| |24 PC1 (AI 1)
  36. // (D 4) PD4 6| |23 PC0 (AI 0)
  37. // VCC 7| |22 GND
  38. // GND 8| |21 AREF
  39. // PB6 9| |20 AVCC
  40. // PB7 10| |19 PB5 (D 13)
  41. // PWM+ (D 5) PD5 11| |18 PB4 (D 12)
  42. // PWM+ (D 6) PD6 12| |17 PB3 (D 11) PWM
  43. // (D 7) PD7 13| |16 PB2 (D 10) PWM
  44. // (D 8) PB0 14| |15 PB1 (D 9) PWM
  45. // +----+
  46. //
  47. // (PWM+ indicates the additional PWM pins on the ATmega168.)
  48. // ATMEL ATMEGA1280 / ARDUINO
  49. //
  50. // 0-7 PE0-PE7 works
  51. // 8-13 PB0-PB5 works
  52. // 14-21 PA0-PA7 works
  53. // 22-29 PH0-PH7 works
  54. // 30-35 PG5-PG0 works
  55. // 36-43 PC7-PC0 works
  56. // 44-51 PJ7-PJ0 works
  57. // 52-59 PL7-PL0 works
  58. // 60-67 PD7-PD0 works
  59. // A0-A7 PF0-PF7
  60. // A8-A15 PK0-PK7
  61. // ATMEL ATMEGA644P / SANGUINO
  62. //
  63. // +---\/---+
  64. // INT0 (D 0) PB0 1| |40 PA0 (AI 0 / D31)
  65. // INT1 (D 1) PB1 2| |39 PA1 (AI 1 / D30)
  66. // INT2 (D 2) PB2 3| |38 PA2 (AI 2 / D29)
  67. // PWM (D 3) PB3 4| |37 PA3 (AI 3 / D28)
  68. // PWM (D 4) PB4 5| |36 PA4 (AI 4 / D27)
  69. // MOSI (D 5) PB5 6| |35 PA5 (AI 5 / D26)
  70. // MISO (D 6) PB6 7| |34 PA6 (AI 6 / D25)
  71. // SCK (D 7) PB7 8| |33 PA7 (AI 7 / D24)
  72. // RST 9| |32 AREF
  73. // VCC 10| |31 GND
  74. // GND 11| |30 AVCC
  75. // XTAL2 12| |29 PC7 (D 23)
  76. // XTAL1 13| |28 PC6 (D 22)
  77. // RX0 (D 8) PD0 14| |27 PC5 (D 21) TDI
  78. // TX0 (D 9) PD1 15| |26 PC4 (D 20) TDO
  79. // RX1 (D 10) PD2 16| |25 PC3 (D 19) TMS
  80. // TX1 (D 11) PD3 17| |24 PC2 (D 18) TCK
  81. // PWM (D 12) PD4 18| |23 PC1 (D 17) SDA
  82. // PWM (D 13) PD5 19| |22 PC0 (D 16) SCL
  83. // PWM (D 14) PD6 20| |21 PD7 (D 15) PWM
  84. // +--------+
  85. //
  86. #define PA 1
  87. #define PB 2
  88. #define PC 3
  89. #define PD 4
  90. #define PE 5
  91. #define PF 6
  92. #define PG 7
  93. #define PH 8
  94. #define PJ 10
  95. #define PK 11
  96. #define PL 12
  97. #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  98. const uint16_t PROGMEM port_to_mode_PGM[] = {
  99. NOT_A_PORT,
  100. &DDRA,
  101. &DDRB,
  102. &DDRC,
  103. &DDRD,
  104. &DDRE,
  105. &DDRF,
  106. &DDRG,
  107. &DDRH,
  108. NOT_A_PORT,
  109. &DDRJ,
  110. &DDRK,
  111. &DDRL,
  112. };
  113. const uint16_t PROGMEM port_to_output_PGM[] = {
  114. NOT_A_PORT,
  115. &PORTA,
  116. &PORTB,
  117. &PORTC,
  118. &PORTD,
  119. &PORTE,
  120. &PORTF,
  121. &PORTG,
  122. &PORTH,
  123. NOT_A_PORT,
  124. &PORTJ,
  125. &PORTK,
  126. &PORTL,
  127. };
  128. const uint16_t PROGMEM port_to_input_PGM[] = {
  129. NOT_A_PIN,
  130. &PINA,
  131. &PINB,
  132. &PINC,
  133. &PIND,
  134. &PINE,
  135. &PINF,
  136. &PING,
  137. &PINH,
  138. NOT_A_PIN,
  139. &PINJ,
  140. &PINK,
  141. &PINL,
  142. };
  143. const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
  144. // PORTLIST
  145. // -------------------------------------------
  146. PE , // PE 0 ** 0 ** USART0_RX
  147. PE , // PE 1 ** 1 ** USART0_TX
  148. PE , // PE 4 ** 2 ** PWM2
  149. PE , // PE 5 ** 3 ** PWM3
  150. PG , // PG 5 ** 4 ** PWM4
  151. PE , // PE 3 ** 5 ** PWM5
  152. PH , // PH 3 ** 6 ** PWM6
  153. PH , // PH 4 ** 7 ** PWM7
  154. PH , // PH 5 ** 8 ** PWM8
  155. PH , // PH 6 ** 9 ** PWM9
  156. PB , // PB 4 ** 10 ** PWM10
  157. PB , // PB 5 ** 11 ** PWM11
  158. PB , // PB 6 ** 12 ** PWM12
  159. PB , // PB 7 ** 13 ** PWM13
  160. PJ , // PJ 1 ** 14 ** USART3_TX
  161. PJ , // PJ 0 ** 15 ** USART3_RX
  162. PH , // PH 1 ** 16 ** USART2_TX
  163. PH , // PH 0 ** 17 ** USART2_RX
  164. PD , // PD 3 ** 18 ** USART1_TX
  165. PD , // PD 2 ** 19 ** USART1_RX
  166. PD , // PD 1 ** 20 ** I2C_SDA
  167. PD , // PD 0 ** 21 ** I2C_SCL
  168. PA , // PA 0 ** 22 ** D22
  169. PA , // PA 1 ** 23 ** D23
  170. PA , // PA 2 ** 24 ** D24
  171. PA , // PA 3 ** 25 ** D25
  172. PA , // PA 4 ** 26 ** D26
  173. PA , // PA 5 ** 27 ** D27
  174. PA , // PA 6 ** 28 ** D28
  175. PA , // PA 7 ** 29 ** D29
  176. PC , // PC 7 ** 30 ** D30
  177. PC , // PC 6 ** 31 ** D31
  178. PC , // PC 5 ** 32 ** D32
  179. PC , // PC 4 ** 33 ** D33
  180. PC , // PC 3 ** 34 ** D34
  181. PC , // PC 2 ** 35 ** D35
  182. PC , // PC 1 ** 36 ** D36
  183. PC , // PC 0 ** 37 ** D37
  184. PD , // PD 7 ** 38 ** D38
  185. PG , // PG 2 ** 39 ** D39
  186. PG , // PG 1 ** 40 ** D40
  187. PG , // PG 0 ** 41 ** D41
  188. PL , // PL 7 ** 42 ** D42
  189. PL , // PL 6 ** 43 ** D43
  190. PL , // PL 5 ** 44 ** D44
  191. PL , // PL 4 ** 45 ** D45
  192. PL , // PL 3 ** 46 ** D46
  193. PL , // PL 2 ** 47 ** D47
  194. PL , // PL 1 ** 48 ** D48
  195. PL , // PL 0 ** 49 ** D49
  196. PB , // PB 3 ** 50 ** SPI_MISO
  197. PB , // PB 2 ** 51 ** SPI_MOSI
  198. PB , // PB 1 ** 52 ** SPI_SCK
  199. PB , // PB 0 ** 53 ** SPI_SS
  200. PF , // PF 0 ** 54 ** A0
  201. PF , // PF 1 ** 55 ** A1
  202. PF , // PF 2 ** 56 ** A2
  203. PF , // PF 3 ** 57 ** A3
  204. PF , // PF 4 ** 58 ** A4
  205. PF , // PF 5 ** 59 ** A5
  206. PF , // PF 6 ** 60 ** A6
  207. PF , // PF 7 ** 61 ** A7
  208. PK , // PK 0 ** 62 ** A8
  209. PK , // PK 1 ** 63 ** A9
  210. PK , // PK 2 ** 64 ** A10
  211. PK , // PK 3 ** 65 ** A11
  212. PK , // PK 4 ** 66 ** A12
  213. PK , // PK 5 ** 67 ** A13
  214. PK , // PK 6 ** 68 ** A14
  215. PK , // PK 7 ** 69 ** A15
  216. };
  217. const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
  218. // PIN IN PORT
  219. // -------------------------------------------
  220. _BV( 0 ) , // PE 0 ** 0 ** USART0_RX
  221. _BV( 1 ) , // PE 1 ** 1 ** USART0_TX
  222. _BV( 4 ) , // PE 4 ** 2 ** PWM2
  223. _BV( 5 ) , // PE 5 ** 3 ** PWM3
  224. _BV( 5 ) , // PG 5 ** 4 ** PWM4
  225. _BV( 3 ) , // PE 3 ** 5 ** PWM5
  226. _BV( 3 ) , // PH 3 ** 6 ** PWM6
  227. _BV( 4 ) , // PH 4 ** 7 ** PWM7
  228. _BV( 5 ) , // PH 5 ** 8 ** PWM8
  229. _BV( 6 ) , // PH 6 ** 9 ** PWM9
  230. _BV( 4 ) , // PB 4 ** 10 ** PWM10
  231. _BV( 5 ) , // PB 5 ** 11 ** PWM11
  232. _BV( 6 ) , // PB 6 ** 12 ** PWM12
  233. _BV( 7 ) , // PB 7 ** 13 ** PWM13
  234. _BV( 1 ) , // PJ 1 ** 14 ** USART3_TX
  235. _BV( 0 ) , // PJ 0 ** 15 ** USART3_RX
  236. _BV( 1 ) , // PH 1 ** 16 ** USART2_TX
  237. _BV( 0 ) , // PH 0 ** 17 ** USART2_RX
  238. _BV( 3 ) , // PD 3 ** 18 ** USART1_TX
  239. _BV( 2 ) , // PD 2 ** 19 ** USART1_RX
  240. _BV( 1 ) , // PD 1 ** 20 ** I2C_SDA
  241. _BV( 0 ) , // PD 0 ** 21 ** I2C_SCL
  242. _BV( 0 ) , // PA 0 ** 22 ** D22
  243. _BV( 1 ) , // PA 1 ** 23 ** D23
  244. _BV( 2 ) , // PA 2 ** 24 ** D24
  245. _BV( 3 ) , // PA 3 ** 25 ** D25
  246. _BV( 4 ) , // PA 4 ** 26 ** D26
  247. _BV( 5 ) , // PA 5 ** 27 ** D27
  248. _BV( 6 ) , // PA 6 ** 28 ** D28
  249. _BV( 7 ) , // PA 7 ** 29 ** D29
  250. _BV( 7 ) , // PC 7 ** 30 ** D30
  251. _BV( 6 ) , // PC 6 ** 31 ** D31
  252. _BV( 5 ) , // PC 5 ** 32 ** D32
  253. _BV( 4 ) , // PC 4 ** 33 ** D33
  254. _BV( 3 ) , // PC 3 ** 34 ** D34
  255. _BV( 2 ) , // PC 2 ** 35 ** D35
  256. _BV( 1 ) , // PC 1 ** 36 ** D36
  257. _BV( 0 ) , // PC 0 ** 37 ** D37
  258. _BV( 7 ) , // PD 7 ** 38 ** D38
  259. _BV( 2 ) , // PG 2 ** 39 ** D39
  260. _BV( 1 ) , // PG 1 ** 40 ** D40
  261. _BV( 0 ) , // PG 0 ** 41 ** D41
  262. _BV( 7 ) , // PL 7 ** 42 ** D42
  263. _BV( 6 ) , // PL 6 ** 43 ** D43
  264. _BV( 5 ) , // PL 5 ** 44 ** D44
  265. _BV( 4 ) , // PL 4 ** 45 ** D45
  266. _BV( 3 ) , // PL 3 ** 46 ** D46
  267. _BV( 2 ) , // PL 2 ** 47 ** D47
  268. _BV( 1 ) , // PL 1 ** 48 ** D48
  269. _BV( 0 ) , // PL 0 ** 49 ** D49
  270. _BV( 3 ) , // PB 3 ** 50 ** SPI_MISO
  271. _BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI
  272. _BV( 1 ) , // PB 1 ** 52 ** SPI_SCK
  273. _BV( 0 ) , // PB 0 ** 53 ** SPI_SS
  274. _BV( 0 ) , // PF 0 ** 54 ** A0
  275. _BV( 1 ) , // PF 1 ** 55 ** A1
  276. _BV( 2 ) , // PF 2 ** 56 ** A2
  277. _BV( 3 ) , // PF 3 ** 57 ** A3
  278. _BV( 4 ) , // PF 4 ** 58 ** A4
  279. _BV( 5 ) , // PF 5 ** 59 ** A5
  280. _BV( 6 ) , // PF 6 ** 60 ** A6
  281. _BV( 7 ) , // PF 7 ** 61 ** A7
  282. _BV( 0 ) , // PK 0 ** 62 ** A8
  283. _BV( 1 ) , // PK 1 ** 63 ** A9
  284. _BV( 2 ) , // PK 2 ** 64 ** A10
  285. _BV( 3 ) , // PK 3 ** 65 ** A11
  286. _BV( 4 ) , // PK 4 ** 66 ** A12
  287. _BV( 5 ) , // PK 5 ** 67 ** A13
  288. _BV( 6 ) , // PK 6 ** 68 ** A14
  289. _BV( 7 ) , // PK 7 ** 69 ** A15
  290. };
  291. const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
  292. // TIMERS
  293. // -------------------------------------------
  294. NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX
  295. NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX
  296. TIMER3B , // PE 4 ** 2 ** PWM2
  297. TIMER3C , // PE 5 ** 3 ** PWM3
  298. TIMER0B , // PG 5 ** 4 ** PWM4
  299. TIMER3A , // PE 3 ** 5 ** PWM5
  300. TIMER4A , // PH 3 ** 6 ** PWM6
  301. TIMER4B , // PH 4 ** 7 ** PWM7
  302. TIMER4C , // PH 5 ** 8 ** PWM8
  303. TIMER2B , // PH 6 ** 9 ** PWM9
  304. TIMER2A , // PB 4 ** 10 ** PWM10
  305. TIMER1A , // PB 5 ** 11 ** PWM11
  306. TIMER1B , // PB 6 ** 12 ** PWM12
  307. TIMER0A , // PB 7 ** 13 ** PWM13
  308. NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX
  309. NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX
  310. NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX
  311. NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX
  312. NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX
  313. NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX
  314. NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA
  315. NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL
  316. NOT_ON_TIMER , // PA 0 ** 22 ** D22
  317. NOT_ON_TIMER , // PA 1 ** 23 ** D23
  318. NOT_ON_TIMER , // PA 2 ** 24 ** D24
  319. NOT_ON_TIMER , // PA 3 ** 25 ** D25
  320. NOT_ON_TIMER , // PA 4 ** 26 ** D26
  321. NOT_ON_TIMER , // PA 5 ** 27 ** D27
  322. NOT_ON_TIMER , // PA 6 ** 28 ** D28
  323. NOT_ON_TIMER , // PA 7 ** 29 ** D29
  324. NOT_ON_TIMER , // PC 7 ** 30 ** D30
  325. NOT_ON_TIMER , // PC 6 ** 31 ** D31
  326. NOT_ON_TIMER , // PC 5 ** 32 ** D32
  327. NOT_ON_TIMER , // PC 4 ** 33 ** D33
  328. NOT_ON_TIMER , // PC 3 ** 34 ** D34
  329. NOT_ON_TIMER , // PC 2 ** 35 ** D35
  330. NOT_ON_TIMER , // PC 1 ** 36 ** D36
  331. NOT_ON_TIMER , // PC 0 ** 37 ** D37
  332. NOT_ON_TIMER , // PD 7 ** 38 ** D38
  333. NOT_ON_TIMER , // PG 2 ** 39 ** D39
  334. NOT_ON_TIMER , // PG 1 ** 40 ** D40
  335. NOT_ON_TIMER , // PG 0 ** 41 ** D41
  336. NOT_ON_TIMER , // PL 7 ** 42 ** D42
  337. NOT_ON_TIMER , // PL 6 ** 43 ** D43
  338. TIMER5C , // PL 5 ** 44 ** D44
  339. TIMER5B , // PL 4 ** 45 ** D45
  340. TIMER5A , // PL 3 ** 46 ** D46
  341. NOT_ON_TIMER , // PL 2 ** 47 ** D47
  342. NOT_ON_TIMER , // PL 1 ** 48 ** D48
  343. NOT_ON_TIMER , // PL 0 ** 49 ** D49
  344. NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO
  345. NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI
  346. NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK
  347. NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS
  348. NOT_ON_TIMER , // PF 0 ** 54 ** A0
  349. NOT_ON_TIMER , // PF 1 ** 55 ** A1
  350. NOT_ON_TIMER , // PF 2 ** 56 ** A2
  351. NOT_ON_TIMER , // PF 3 ** 57 ** A3
  352. NOT_ON_TIMER , // PF 4 ** 58 ** A4
  353. NOT_ON_TIMER , // PF 5 ** 59 ** A5
  354. NOT_ON_TIMER , // PF 6 ** 60 ** A6
  355. NOT_ON_TIMER , // PF 7 ** 61 ** A7
  356. NOT_ON_TIMER , // PK 0 ** 62 ** A8
  357. NOT_ON_TIMER , // PK 1 ** 63 ** A9
  358. NOT_ON_TIMER , // PK 2 ** 64 ** A10
  359. NOT_ON_TIMER , // PK 3 ** 65 ** A11
  360. NOT_ON_TIMER , // PK 4 ** 66 ** A12
  361. NOT_ON_TIMER , // PK 5 ** 67 ** A13
  362. NOT_ON_TIMER , // PK 6 ** 68 ** A14
  363. NOT_ON_TIMER , // PK 7 ** 69 ** A15
  364. };
  365. #elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)
  366. // these arrays map port names (e.g. port B) to the
  367. // appropriate addresses for various functions (e.g. reading
  368. // and writing)
  369. const uint16_t PROGMEM port_to_mode_PGM[] =
  370. {
  371. NOT_A_PORT,
  372. &DDRA,
  373. &DDRB,
  374. &DDRC,
  375. &DDRD,
  376. };
  377. const uint16_t PROGMEM port_to_output_PGM[] =
  378. {
  379. NOT_A_PORT,
  380. &PORTA,
  381. &PORTB,
  382. &PORTC,
  383. &PORTD,
  384. };
  385. const uint16_t PROGMEM port_to_input_PGM[] =
  386. {
  387. NOT_A_PORT,
  388. &PINA,
  389. &PINB,
  390. &PINC,
  391. &PIND,
  392. };
  393. const uint8_t PROGMEM digital_pin_to_port_PGM[] =
  394. {
  395. PB, /* 0 */
  396. PB,
  397. PB,
  398. PB,
  399. PB,
  400. PB,
  401. PB,
  402. PB,
  403. PD, /* 8 */
  404. PD,
  405. PD,
  406. PD,
  407. PD,
  408. PD,
  409. PD,
  410. PD,
  411. PC, /* 16 */
  412. PC,
  413. PC,
  414. PC,
  415. PC,
  416. PC,
  417. PC,
  418. PC,
  419. PA, /* 24 */
  420. PA,
  421. PA,
  422. PA,
  423. PA,
  424. PA,
  425. PA,
  426. PA /* 31 */
  427. };
  428. const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] =
  429. {
  430. _BV(0), /* 0, port B */
  431. _BV(1),
  432. _BV(2),
  433. _BV(3),
  434. _BV(4),
  435. _BV(5),
  436. _BV(6),
  437. _BV(7),
  438. _BV(0), /* 8, port D */
  439. _BV(1),
  440. _BV(2),
  441. _BV(3),
  442. _BV(4),
  443. _BV(5),
  444. _BV(6),
  445. _BV(7),
  446. _BV(0), /* 16, port C */
  447. _BV(1),
  448. _BV(2),
  449. _BV(3),
  450. _BV(4),
  451. _BV(5),
  452. _BV(6),
  453. _BV(7),
  454. _BV(7), /* 24, port A */
  455. _BV(6),
  456. _BV(5),
  457. _BV(4),
  458. _BV(3),
  459. _BV(2),
  460. _BV(1),
  461. _BV(0)
  462. };
  463. const uint8_t PROGMEM digital_pin_to_timer_PGM[] =
  464. {
  465. NOT_ON_TIMER, /* 0 - PB0 */
  466. NOT_ON_TIMER, /* 1 - PB1 */
  467. NOT_ON_TIMER, /* 2 - PB2 */
  468. TIMER0A, /* 3 - PB3 */
  469. TIMER0B, /* 4 - PB4 */
  470. NOT_ON_TIMER, /* 5 - PB5 */
  471. NOT_ON_TIMER, /* 6 - PB6 */
  472. NOT_ON_TIMER, /* 7 - PB7 */
  473. NOT_ON_TIMER, /* 8 - PD0 */
  474. NOT_ON_TIMER, /* 9 - PD1 */
  475. NOT_ON_TIMER, /* 10 - PD2 */
  476. NOT_ON_TIMER, /* 11 - PD3 */
  477. TIMER1B, /* 12 - PD4 */
  478. TIMER1A, /* 13 - PD5 */
  479. TIMER2B, /* 14 - PD6 */
  480. TIMER2A, /* 15 - PD7 */
  481. NOT_ON_TIMER, /* 16 - PC0 */
  482. NOT_ON_TIMER, /* 17 - PC1 */
  483. NOT_ON_TIMER, /* 18 - PC2 */
  484. NOT_ON_TIMER, /* 19 - PC3 */
  485. NOT_ON_TIMER, /* 20 - PC4 */
  486. NOT_ON_TIMER, /* 21 - PC5 */
  487. NOT_ON_TIMER, /* 22 - PC6 */
  488. NOT_ON_TIMER, /* 23 - PC7 */
  489. NOT_ON_TIMER, /* 24 - PA0 */
  490. NOT_ON_TIMER, /* 25 - PA1 */
  491. NOT_ON_TIMER, /* 26 - PA2 */
  492. NOT_ON_TIMER, /* 27 - PA3 */
  493. NOT_ON_TIMER, /* 28 - PA4 */
  494. NOT_ON_TIMER, /* 29 - PA5 */
  495. NOT_ON_TIMER, /* 30 - PA6 */
  496. NOT_ON_TIMER /* 31 - PA7 */
  497. };
  498. #else
  499. // these arrays map port names (e.g. port B) to the
  500. // appropriate addresses for various functions (e.g. reading
  501. // and writing)
  502. const uint16_t PROGMEM port_to_mode_PGM[] = {
  503. NOT_A_PORT,
  504. NOT_A_PORT,
  505. &DDRB,
  506. &DDRC,
  507. &DDRD,
  508. };
  509. const uint16_t PROGMEM port_to_output_PGM[] = {
  510. NOT_A_PORT,
  511. NOT_A_PORT,
  512. &PORTB,
  513. &PORTC,
  514. &PORTD,
  515. };
  516. const uint16_t PROGMEM port_to_input_PGM[] = {
  517. NOT_A_PORT,
  518. NOT_A_PORT,
  519. &PINB,
  520. &PINC,
  521. &PIND,
  522. };
  523. const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
  524. PD, /* 0 */
  525. PD,
  526. PD,
  527. PD,
  528. PD,
  529. PD,
  530. PD,
  531. PD,
  532. PB, /* 8 */
  533. PB,
  534. PB,
  535. PB,
  536. PB,
  537. PB,
  538. PC, /* 14 */
  539. PC,
  540. PC,
  541. PC,
  542. PC,
  543. PC,
  544. };
  545. const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
  546. _BV(0), /* 0, port D */
  547. _BV(1),
  548. _BV(2),
  549. _BV(3),
  550. _BV(4),
  551. _BV(5),
  552. _BV(6),
  553. _BV(7),
  554. _BV(0), /* 8, port B */
  555. _BV(1),
  556. _BV(2),
  557. _BV(3),
  558. _BV(4),
  559. _BV(5),
  560. _BV(0), /* 14, port C */
  561. _BV(1),
  562. _BV(2),
  563. _BV(3),
  564. _BV(4),
  565. _BV(5),
  566. };
  567. const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
  568. NOT_ON_TIMER, /* 0 - port D */
  569. NOT_ON_TIMER,
  570. NOT_ON_TIMER,
  571. // on the ATmega168, digital pin 3 has hardware pwm
  572. #if defined(__AVR_ATmega8__)
  573. NOT_ON_TIMER,
  574. #else
  575. TIMER2B,
  576. #endif
  577. NOT_ON_TIMER,
  578. // on the ATmega168, digital pins 5 and 6 have hardware pwm
  579. #if defined(__AVR_ATmega8__)
  580. NOT_ON_TIMER,
  581. NOT_ON_TIMER,
  582. #else
  583. TIMER0B,
  584. TIMER0A,
  585. #endif
  586. NOT_ON_TIMER,
  587. NOT_ON_TIMER, /* 8 - port B */
  588. TIMER1A,
  589. TIMER1B,
  590. #if defined(__AVR_ATmega8__)
  591. TIMER2,
  592. #else
  593. TIMER2A,
  594. #endif
  595. NOT_ON_TIMER,
  596. NOT_ON_TIMER,
  597. NOT_ON_TIMER,
  598. NOT_ON_TIMER, /* 14 - port C */
  599. NOT_ON_TIMER,
  600. NOT_ON_TIMER,
  601. NOT_ON_TIMER,
  602. NOT_ON_TIMER,
  603. };
  604. #endif