BayEOSArduino Library
digitalWriteFast.h
1 #if !defined(digitalPinToPortReg)
2 #if !(defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) )
3 
4 
5 // Standard Arduino Pins
6 #define digitalPinToPortReg(P) \
7 (((P) >= 0 && (P) <= 7) ? &PORTD : (((P) >= 8 && (P) <= 13) ? &PORTB : &PORTC))
8 #define digitalPinToDDRReg(P) \
9 (((P) >= 0 && (P) <= 7) ? &DDRD : (((P) >= 8 && (P) <= 13) ? &DDRB : &DDRC))
10 #define digitalPinToPINReg(P) \
11 (((P) >= 0 && (P) <= 7) ? &PIND : (((P) >= 8 && (P) <= 13) ? &PINB : &PINC))
12 #define digitalPinToBit(P) \
13 (((P) >= 0 && (P) <= 7) ? (P) : (((P) >= 8 && (P) <= 13) ? (P) - 8 : (P) - 14))
14 
15 #if defined(__AVR_ATmega8__)
16 
17 // 3 PWM
18 #define digitalPinToTimer(P) \
19 (((P) == 9 || (P) == 10) ? &TCCR1A : (((P) == 11) ? &TCCR2 : 0))
20 #define digitalPinToTimerBit(P) \
21 (((P) == 9) ? COM1A1 : (((P) == 10) ? COM1B1 : COM21))
22 #else
23 
24 // 6 PWM
25 #define digitalPinToTimer(P) \
26 (((P) == 6 || (P) == 5) ? &TCCR0A : \
27  (((P) == 9 || (P) == 10) ? &TCCR1A : \
28  (((P) == 11 || (P) == 3) ? &TCCR2A : 0)))
29 #define digitalPinToTimerBit(P) \
30 (((P) == 6) ? COM0A1 : (((P) == 5) ? COM0B1 : \
31  (((P) == 9) ? COM1A1 : (((P) == 10) ? COM1B1 : \
32  (((P) == 11) ? COM2A1 : COM2B1)))))
33 #endif
34 
35 #else
36 // Arduino Mega Pins
37 #define digitalPinToPortReg(P) \
38 (((P) >= 22 && (P) <= 29) ? &PORTA : \
39  ((((P) >= 10 && (P) <= 13) || ((P) >= 50 && (P) <= 53)) ? &PORTB : \
40  (((P) >= 30 && (P) <= 37) ? &PORTC : \
41  ((((P) >= 18 && (P) <= 21) || (P) == 38) ? &PORTD : \
42  ((((P) >= 0 && (P) <= 3) || (P) == 5) ? &PORTE : \
43  (((P) >= 54 && (P) <= 61) ? &PORTF : \
44  ((((P) >= 39 && (P) <= 41) || (P) == 4) ? &PORTG : \
45  ((((P) >= 6 && (P) <= 9) || (P) == 16 || (P) == 17) ? &PORTH : \
46  (((P) == 14 || (P) == 15) ? &PORTJ : \
47  (((P) >= 62 && (P) <= 69) ? &PORTK : &PORTL))))))))))
48 
49 #define digitalPinToDDRReg(P) \
50 (((P) >= 22 && (P) <= 29) ? &DDRA : \
51  ((((P) >= 10 && (P) <= 13) || ((P) >= 50 && (P) <= 53)) ? &DDRB : \
52  (((P) >= 30 && (P) <= 37) ? &DDRC : \
53  ((((P) >= 18 && (P) <= 21) || (P) == 38) ? &DDRD : \
54  ((((P) >= 0 && (P) <= 3) || (P) == 5) ? &DDRE : \
55  (((P) >= 54 && (P) <= 61) ? &DDRF : \
56  ((((P) >= 39 && (P) <= 41) || (P) == 4) ? &DDRG : \
57  ((((P) >= 6 && (P) <= 9) || (P) == 16 || (P) == 17) ? &DDRH : \
58  (((P) == 14 || (P) == 15) ? &DDRJ : \
59  (((P) >= 62 && (P) <= 69) ? &DDRK : &DDRL))))))))))
60 
61 #define digitalPinToPINReg(P) \
62 (((P) >= 22 && (P) <= 29) ? &PINA : \
63  ((((P) >= 10 && (P) <= 13) || ((P) >= 50 && (P) <= 53)) ? &PINB : \
64  (((P) >= 30 && (P) <= 37) ? &PINC : \
65  ((((P) >= 18 && (P) <= 21) || (P) == 38) ? &PIND : \
66  ((((P) >= 0 && (P) <= 3) || (P) == 5) ? &PINE : \
67  (((P) >= 54 && (P) <= 61) ? &PINF : \
68  ((((P) >= 39 && (P) <= 41) || (P) == 4) ? &PING : \
69  ((((P) >= 6 && (P) <= 9) || (P) == 16 || (P) == 17) ? &PINH : \
70  (((P) == 14 || (P) == 15) ? &PINJ : \
71  (((P) >= 62 && (P) <= 69) ? &PINK : &PINL))))))))))
72 
73 #define digitalPinToBit(P) \
74 (((P) >= 7 && (P) <= 9) ? (P) - 3 : \
75  (((P) >= 10 && (P) <= 13) ? (P) - 6 : \
76  (((P) >= 22 && (P) <= 29) ? (P) - 22 : \
77  (((P) >= 30 && (P) <= 37) ? 37 - (P) : \
78  (((P) >= 39 && (P) <= 41) ? 41 - (P) : \
79  (((P) >= 42 && (P) <= 49) ? 49 - (P) : \
80  (((P) >= 50 && (P) <= 53) ? 53 - (P) : \
81  (((P) >= 54 && (P) <= 61) ? (P) - 54 : \
82  (((P) >= 62 && (P) <= 69) ? (P) - 62 : \
83  (((P) == 0 || (P) == 15 || (P) == 17 || (P) == 21) ? 0 : \
84  (((P) == 1 || (P) == 14 || (P) == 16 || (P) == 20) ? 1 : \
85  (((P) == 19) ? 2 : \
86  (((P) == 5 || (P) == 6 || (P) == 18) ? 3 : \
87  (((P) == 2) ? 4 : \
88  (((P) == 3 || (P) == 4) ? 5 : 7)))))))))))))))
89 
90 // 15 PWM
91 #define digitalPinToTimer(P) \
92 (((P) == 13 || (P) == 4) ? &TCCR0A : \
93  (((P) == 11 || (P) == 12) ? &TCCR1A : \
94  (((P) == 10 || (P) == 9) ? &TCCR2A : \
95  (((P) == 5 || (P) == 2 || (P) == 3) ? &TCCR3A : \
96  (((P) == 6 || (P) == 7 || (P) == 8) ? &TCCR4A : \
97  (((P) == 46 || (P) == 45 || (P) == 44) ? &TCCR5A : 0))))))
98 #define digitalPinToTimerBit(P) \
99 (((P) == 13) ? COM0A1 : (((P) == 4) ? COM0B1 : \
100  (((P) == 11) ? COM1A1 : (((P) == 12) ? COM1B1 : \
101  (((P) == 10) ? COM2A1 : (((P) == 9) ? COM2B1 : \
102  (((P) == 5) ? COM3A1 : (((P) == 2) ? COM3B1 : (((P) == 3) ? COM3C1 : \
103  (((P) == 6) ? COM4A1 : (((P) == 7) ? COM4B1 : (((P) == 8) ? COM4C1 : \
104  (((P) == 46) ? COM5A1 : (((P) == 45) ? COM5B1 : COM5C1))))))))))))))
105 
106 #endif
107 #endif
108 
109 #if !defined(digitalWriteFast)
110 #define digitalWriteFast(P, V) \
111 if (__builtin_constant_p(P) && __builtin_constant_p(V)) { \
112  if (digitalPinToTimer(P)) \
113  bitClear(*digitalPinToTimer(P), digitalPinToTimerBit(P)); \
114  bitWrite(*digitalPinToPortReg(P), digitalPinToBit(P), (V)); \
115  } else { \
116  digitalWrite((P), (V)); \
117  }
118 #endif
119 
120 #if !defined(pinModeFast)
121 #define pinModeFast(P, V) \
122 if (__builtin_constant_p(P) && __builtin_constant_p(V)) { \
123  bitWrite(*digitalPinToDDRReg(P), digitalPinToBit(P), (V)); \
124  } else { \
125  pinMode((P), (V)); \
126  }
127 #endif
128 
129 #if !defined(digitalReadFast)
130 #define digitalReadFast(P) ( (int) __digitalReadFast__((P)) )
131 #define __digitalReadFast__(P ) \
132 (__builtin_constant_p(P) ) ? ( \
133  digitalPinToTimer(P) ? ( \
134  bitClear(*digitalPinToTimer(P), digitalPinToTimerBit(P)) , \
135  bitRead(*digitalPinToPINReg(P), digitalPinToBit(P))) : \
136  bitRead(*digitalPinToPINReg(P), digitalPinToBit(P))) : \
137  digitalRead((P))
138 #endif
139 
140 #if !defined(digitalWriteFast2)
141 #define digitalWriteFast2(P, V) \
142 if (__builtin_constant_p(P) && __builtin_constant_p(V)) { \
143  bitWrite(*digitalPinToPortReg(P), digitalPinToBit(P), (V)); \
144  } else { \
145  digitalWrite((P), (V)); \
146  }
147 #endif
148 
149 #if !defined(pinModeFast2)
150 #define pinModeFast2(P, V) \
151 if (__builtin_constant_p(P) && __builtin_constant_p(V)) { \
152  if (digitalPinToTimer(P)) \
153  bitClear(*digitalPinToTimer(P), digitalPinToTimerBit(P)); \
154  bitWrite(*digitalPinToDDRReg(P), digitalPinToBit(P), (V)); \
155  } else { \
156  pinMode((P), (V)); \
157  }
158 #endif
159 
160 #if !defined(digitalReadFast2)
161 #define digitalReadFast2(P) ( (int) __digitalReadFast2__((P)) )
162 #define __digitalReadFast2__(P ) \
163 (__builtin_constant_p(P) ) ? ( \
164  ( bitRead(*digitalPinToPINReg(P), digitalPinToBit(P))) ) : \
165  digitalRead((P))
166 #endif