Repetier-Firmware 0.2
Repetier/digitalWriteFast.h
Go to the documentation of this file.
00001 #if !defined(digitalPinToPortReg)
00002 #if !(defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) )
00003 
00004 
00005 // Standard Arduino Pins
00006 #define digitalPinToPortReg(P) \
00007 (((P) >= 0 && (P) <= 7) ? &PORTD : (((P) >= 8 && (P) <= 13) ? &PORTB : &PORTC))
00008 #define digitalPinToDDRReg(P) \
00009 (((P) >= 0 && (P) <= 7) ? &DDRD : (((P) >= 8 && (P) <= 13) ? &DDRB : &DDRC))
00010 #define digitalPinToPINReg(P) \
00011 (((P) >= 0 && (P) <= 7) ? &PIND : (((P) >= 8 && (P) <= 13) ? &PINB : &PINC))
00012 #define digitalPinToBit(P) \
00013 (((P) >= 0 && (P) <= 7) ? (P) : (((P) >= 8 && (P) <= 13) ? (P) - 8 : (P) - 14))
00014 
00015 #if defined(__AVR_ATmega8__)
00016 
00017 // 3 PWM
00018 #define digitalPinToTimer(P) \
00019 (((P) ==  9 || (P) == 10) ? &TCCR1A : (((P) == 11) ? &TCCR2 : 0))
00020 #define digitalPinToTimerBit(P) \
00021 (((P) ==  9) ? COM1A1 : (((P) == 10) ? COM1B1 : COM21))
00022 #else
00023 
00024 // 6 PWM
00025 #define digitalPinToTimer(P) \
00026 (((P) ==  6 || (P) ==  5) ? &TCCR0A : \
00027         (((P) ==  9 || (P) == 10) ? &TCCR1A : \
00028         (((P) == 11 || (P) ==  3) ? &TCCR2A : 0)))
00029 #define digitalPinToTimerBit(P) \
00030 (((P) ==  6) ? COM0A1 : (((P) ==  5) ? COM0B1 : \
00031         (((P) ==  9) ? COM1A1 : (((P) == 10) ? COM1B1 : \
00032         (((P) == 11) ? COM2A1 : COM2B1)))))
00033 #endif
00034 
00035 #else
00036 // Arduino Mega Pins
00037 #define digitalPinToPortReg(P) \
00038 (((P) >= 22 && (P) <= 29) ? &PORTA : \
00039         ((((P) >= 10 && (P) <= 13) || ((P) >= 50 && (P) <= 53)) ? &PORTB : \
00040         (((P) >= 30 && (P) <= 37) ? &PORTC : \
00041         ((((P) >= 18 && (P) <= 21) || (P) == 38) ? &PORTD : \
00042         ((((P) >= 0 && (P) <= 3) || (P) == 5) ? &PORTE : \
00043         (((P) >= 54 && (P) <= 61) ? &PORTF : \
00044         ((((P) >= 39 && (P) <= 41) || (P) == 4) ? &PORTG : \
00045         ((((P) >= 6 && (P) <= 9) || (P) == 16 || (P) == 17) ? &PORTH : \
00046         (((P) == 14 || (P) == 15) ? &PORTJ : \
00047         (((P) >= 62 && (P) <= 69) ? &PORTK : &PORTL))))))))))
00048 
00049 #define digitalPinToDDRReg(P) \
00050 (((P) >= 22 && (P) <= 29) ? &DDRA : \
00051         ((((P) >= 10 && (P) <= 13) || ((P) >= 50 && (P) <= 53)) ? &DDRB : \
00052         (((P) >= 30 && (P) <= 37) ? &DDRC : \
00053         ((((P) >= 18 && (P) <= 21) || (P) == 38) ? &DDRD : \
00054         ((((P) >= 0 && (P) <= 3) || (P) == 5) ? &DDRE : \
00055         (((P) >= 54 && (P) <= 61) ? &DDRF : \
00056         ((((P) >= 39 && (P) <= 41) || (P) == 4) ? &DDRG : \
00057         ((((P) >= 6 && (P) <= 9) || (P) == 16 || (P) == 17) ? &DDRH : \
00058         (((P) == 14 || (P) == 15) ? &DDRJ : \
00059         (((P) >= 62 && (P) <= 69) ? &DDRK : &DDRL))))))))))
00060 
00061 #define digitalPinToPINReg(P) \
00062 (((P) >= 22 && (P) <= 29) ? &PINA : \
00063         ((((P) >= 10 && (P) <= 13) || ((P) >= 50 && (P) <= 53)) ? &PINB : \
00064         (((P) >= 30 && (P) <= 37) ? &PINC : \
00065         ((((P) >= 18 && (P) <= 21) || (P) == 38) ? &PIND : \
00066         ((((P) >= 0 && (P) <= 3) || (P) == 5) ? &PINE : \
00067         (((P) >= 54 && (P) <= 61) ? &PINF : \
00068         ((((P) >= 39 && (P) <= 41) || (P) == 4) ? &PING : \
00069         ((((P) >= 6 && (P) <= 9) || (P) == 16 || (P) == 17) ? &PINH : \
00070         (((P) == 14 || (P) == 15) ? &PINJ : \
00071         (((P) >= 62 && (P) <= 69) ? &PINK : &PINL))))))))))
00072 
00073 #define digitalPinToBit(P) \
00074 (((P) >=  7 && (P) <=  9) ? (P) - 3 : \
00075         (((P) >= 10 && (P) <= 13) ? (P) - 6 : \
00076         (((P) >= 22 && (P) <= 29) ? (P) - 22 : \
00077         (((P) >= 30 && (P) <= 37) ? 37 - (P) : \
00078         (((P) >= 39 && (P) <= 41) ? 41 - (P) : \
00079         (((P) >= 42 && (P) <= 49) ? 49 - (P) : \
00080         (((P) >= 50 && (P) <= 53) ? 53 - (P) : \
00081         (((P) >= 54 && (P) <= 61) ? (P) - 54 : \
00082         (((P) >= 62 && (P) <= 69) ? (P) - 62 : \
00083         (((P) == 0 || (P) == 15 || (P) == 17 || (P) == 21) ? 0 : \
00084         (((P) == 1 || (P) == 14 || (P) == 16 || (P) == 20) ? 1 : \
00085         (((P) == 19) ? 2 : \
00086         (((P) == 5 || (P) == 6 || (P) == 18) ? 3 : \
00087         (((P) == 2) ? 4 : \
00088         (((P) == 3 || (P) == 4) ? 5 : 7)))))))))))))))
00089 
00090 // 15 PWM
00091 #define digitalPinToTimer(P) \
00092 (((P) == 13 || (P) ==  4) ? &TCCR0A : \
00093         (((P) == 11 || (P) == 12) ? &TCCR1A : \
00094         (((P) == 10 || (P) ==  9) ? &TCCR2A : \
00095         (((P) ==  5 || (P) ==  2 || (P) ==  3) ? &TCCR3A : \
00096         (((P) ==  6 || (P) ==  7 || (P) ==  8) ? &TCCR4A : \
00097         (((P) == 46 || (P) == 45 || (P) == 44) ? &TCCR5A : 0))))))
00098 #define digitalPinToTimerBit(P) \
00099 (((P) == 13) ? COM0A1 : (((P) ==  4) ? COM0B1 : \
00100         (((P) == 11) ? COM1A1 : (((P) == 12) ? COM1B1 : \
00101         (((P) == 10) ? COM2A1 : (((P) ==  9) ? COM2B1 : \
00102         (((P) ==  5) ? COM3A1 : (((P) ==  2) ? COM3B1 : (((P) ==  3) ? COM3C1 : \
00103         (((P) ==  6) ? COM4A1 : (((P) ==  7) ? COM4B1 : (((P) ==  8) ? COM4C1 : \
00104         (((P) == 46) ? COM5A1 : (((P) == 45) ? COM5B1 : COM5C1))))))))))))))
00105 
00106 #endif
00107 #endif
00108 
00109 #if !defined(digitalWriteFast)
00110 #define digitalWriteFast(P, V) \
00111 if (__builtin_constant_p(P) && __builtin_constant_p(V)) { \
00112                 if (digitalPinToTimer(P)) \
00113                         bitClear(*digitalPinToTimer(P), digitalPinToTimerBit(P)); \
00114                 bitWrite(*digitalPinToPortReg(P), digitalPinToBit(P), (V)); \
00115         } else { \
00116                 digitalWrite((P), (V)); \
00117         }
00118 #endif
00119 
00120 #if !defined(pinModeFast)
00121 #define pinModeFast(P, V) \
00122 if (__builtin_constant_p(P) && __builtin_constant_p(V)) { \
00123                 bitWrite(*digitalPinToDDRReg(P), digitalPinToBit(P), (V)); \
00124         } else {  \
00125                 pinMode((P), (V)); \
00126         } 
00127 #endif
00128 
00129 #if !defined(digitalReadFast)
00130 #define digitalReadFast(P) ( (int) __digitalReadFast__((P)) )
00131 #define __digitalReadFast__(P ) \
00132 (__builtin_constant_p(P) ) ? ( \
00133                 digitalPinToTimer(P) ? ( \
00134                        bitClear(*digitalPinToTimer(P), digitalPinToTimerBit(P)) ,  \
00135                              bitRead(*digitalPinToPINReg(P), digitalPinToBit(P))) : \
00136                   bitRead(*digitalPinToPINReg(P), digitalPinToBit(P)))  : \
00137                 digitalRead((P))
00138 #endif
00139 
00140 #if !defined(digitalWriteFast2)
00141 #define digitalWriteFast2(P, V) \
00142 if (__builtin_constant_p(P) && __builtin_constant_p(V)) { \
00143                 bitWrite(*digitalPinToPortReg(P), digitalPinToBit(P), (V)); \
00144         } else { \
00145                 digitalWrite((P), (V)); \
00146         }
00147 #endif
00148 
00149 #if !defined(pinModeFast2)
00150 #define pinModeFast2(P, V) \
00151 if (__builtin_constant_p(P) && __builtin_constant_p(V)) { \
00152                 if (digitalPinToTimer(P)) \
00153                         bitClear(*digitalPinToTimer(P), digitalPinToTimerBit(P)); \
00154                 bitWrite(*digitalPinToDDRReg(P), digitalPinToBit(P), (V)); \
00155         } else {  \
00156                 pinMode((P), (V)); \
00157         } 
00158 #endif
00159 
00160 #if !defined(digitalReadFast2)
00161 #define digitalReadFast2(P) ( (int) __digitalReadFast2__((P)) )
00162 #define __digitalReadFast2__(P ) \
00163 (__builtin_constant_p(P) ) ? ( \
00164                 ( bitRead(*digitalPinToPINReg(P), digitalPinToBit(P))) ) : \
00165                 digitalRead((P))
00166 #endif
 All Data Structures Files Functions Variables Typedefs Friends Defines