mirror of
https://github.com/arduino/Arduino.git
synced 2024-12-11 22:24:13 +01:00
70 lines
3.2 KiB
C
Executable File
70 lines
3.2 KiB
C
Executable File
/*
|
|
icrmacros.h
|
|
|
|
A place to put useful ICR (interrupt change register) macros
|
|
|
|
If you want to support non-Arduino processors you can extend or replace
|
|
this file.
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
The latest version of this library can always be found at
|
|
http://arduiniana.org.
|
|
*/
|
|
|
|
// Abstractions for maximum portability between processors
|
|
// These are macros to associate pins to pin change interrupts
|
|
#if !defined(digitalPinToPCICR) // Courtesy Paul Stoffregen
|
|
|
|
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
|
|
|
|
#define digitalPinToPCICR(p) (((p) >= 0 && (p) <= 21) ? (&PCICR) : ((uint8_t *)0))
|
|
#define digitalPinToPCICRbit(p) (((p) <= 7) ? 2 : (((p) <= 13) ? 0 : 1))
|
|
#define digitalPinToPCMSK(p) (((p) <= 7) ? (&PCMSK2) : (((p) <= 13) ? (&PCMSK0) : (((p) <= 21) ? (&PCMSK1) : ((uint8_t *)0))))
|
|
#define digitalPinToPCMSKbit(p) (((p) <= 7) ? (p) : (((p) <= 13) ? ((p) - 8) : ((p) - 14)))
|
|
|
|
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
|
// Specifically for the Arduino Mega 2560 (or 1280 on the original Arduino Mega)
|
|
// A majority of the pins are NOT PCINTs, SO BE WARNED (i.e. you cannot use them as receive pins)
|
|
// Only pins available for RECEIVE (TRANSMIT can be on any pin):
|
|
// (I've deliberately left out pin mapping to the Hardware USARTs - seems senseless to me)
|
|
// Pins: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69
|
|
|
|
#define digitalPinToPCICR(p) ( (((p) >= 10) && ((p) <= 13)) || \
|
|
(((p) >= 50) && ((p) <= 53)) || \
|
|
(((p) >= 62) && ((p) <= 69)) ? (&PCICR) : ((uint8_t *)0) )
|
|
|
|
#define digitalPinToPCICRbit(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? 0 : \
|
|
( (((p) >= 62) && ((p) <= 69)) ? 2 : \
|
|
0 ) )
|
|
|
|
#define digitalPinToPCMSK(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? (&PCMSK0) : \
|
|
( (((p) >= 62) && ((p) <= 69)) ? (&PCMSK2) : \
|
|
((uint8_t *)0) ) )
|
|
|
|
#define digitalPinToPCMSKbit(p) ( (((p) >= 10) && ((p) <= 13)) ? ((p) - 6) : \
|
|
( ((p) == 50) ? 3 : \
|
|
( ((p) == 51) ? 2 : \
|
|
( ((p) == 52) ? 1 : \
|
|
( ((p) == 53) ? 0 : \
|
|
( (((p) >= 62) && ((p) <= 69)) ? ((p) - 62) : \
|
|
0 ) ) ) ) ) )
|
|
|
|
#else
|
|
#error This processor is not supported by SoftwareSerial
|
|
#endif
|
|
#endif
|
|
|