HAL for digitalRead/Write() and pinMode() (#607)
This commit is contained in:
committed by
Embedded Innovation
parent
ef65d0e4df
commit
80659ddb00
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Optimized digital functions for AVR microcontrollers
|
||||
* based on http://code.google.com/p/digitalwritefast
|
||||
*/
|
||||
|
||||
#ifndef __digitalWriteFast_h_
|
||||
#define __digitalWriteFast_h_
|
||||
|
||||
#if defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA1280) || defined(ARDUINO_AVR_MEGA2560) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__)
|
||||
#define __digitalPinToPortReg(__pin) \
|
||||
(((__pin) >= 22 && (__pin) <= 29) ? &PORTA : \
|
||||
((((__pin) >= 10 && (__pin) <= 13) || ((__pin) >= 50 && (__pin) <= 53)) ? &PORTB : \
|
||||
(((__pin) >= 30 && (__pin) <= 37) ? &PORTC : \
|
||||
((((__pin) >= 18 && (__pin) <= 21) || (__pin) == 38) ? &PORTD : \
|
||||
((((__pin) <= 3) || (__pin) == 5) ? &PORTE : \
|
||||
(((__pin) >= 54 && (__pin) <= 61) ? &PORTF : \
|
||||
((((__pin) >= 39 && (__pin) <= 41) || (__pin) == 4) ? &PORTG : \
|
||||
((((__pin) >= 6 && (__pin) <= 9) || (__pin) == 16 || (__pin) == 17) ? &PORTH : \
|
||||
(((__pin) == 14 || (__pin) == 15) ? &PORTJ : \
|
||||
(((__pin) >= 62 && (__pin) <= 69) ? &PORTK : &PORTL))))))))))
|
||||
#define __digitalPinToDDRReg(__pin) \
|
||||
(((__pin) >= 22 && (__pin) <= 29) ? &DDRA : \
|
||||
((((__pin) >= 10 && (__pin) <= 13) || ((__pin) >= 50 && (__pin) <= 53)) ? &DDRB : \
|
||||
(((__pin) >= 30 && (__pin) <= 37) ? &DDRC : \
|
||||
((((__pin) >= 18 && (__pin) <= 21) || (__pin) == 38) ? &DDRD : \
|
||||
((((__pin) <= 3) || (__pin) == 5) ? &DDRE : \
|
||||
(((__pin) >= 54 && (__pin) <= 61) ? &DDRF : \
|
||||
((((__pin) >= 39 && (__pin) <= 41) || (__pin) == 4) ? &DDRG : \
|
||||
((((__pin) >= 6 && (__pin) <= 9) || (__pin) == 16 || (__pin) == 17) ? &DDRH : \
|
||||
(((__pin) == 14 || (__pin) == 15) ? &DDRJ : \
|
||||
(((__pin) >= 62 && (__pin) <= 69) ? &DDRK : &DDRL))))))))))
|
||||
#define __digitalPinToPINReg(__pin) \
|
||||
(((__pin) >= 22 && (__pin) <= 29) ? &PINA : \
|
||||
((((__pin) >= 10 && (__pin) <= 13) || ((__pin) >= 50 && (__pin) <= 53)) ? &PINB : \
|
||||
(((__pin) >= 30 && (__pin) <= 37) ? &PINC : \
|
||||
((((__pin) >= 18 && (__pin) <= 21) || (__pin) == 38) ? &PIND : \
|
||||
((((__pin) <= 3) || (__pin) == 5) ? &PINE : \
|
||||
(((__pin) >= 54 && (__pin) <= 61) ? &PINF : \
|
||||
((((__pin) >= 39 && (__pin) <= 41) || (__pin) == 4) ? &PING : \
|
||||
((((__pin) >= 6 && (__pin) <= 9) || (__pin) == 16 || (__pin) == 17) ? &PINH : \
|
||||
(((__pin) == 14 || (__pin) == 15) ? &PINJ : \
|
||||
(((__pin) >= 62 && (__pin) <= 69) ? &PINK : &PINL))))))))))
|
||||
#define __digitalPinToBit(__pin) \
|
||||
(((__pin) >= 7 && (__pin) <= 9) ? (__pin) - 3 : \
|
||||
(((__pin) >= 10 && (__pin) <= 13) ? (__pin) - 6 : \
|
||||
(((__pin) >= 22 && (__pin) <= 29) ? (__pin) - 22 : \
|
||||
(((__pin) >= 30 && (__pin) <= 37) ? 37 - (__pin) : \
|
||||
(((__pin) >= 39 && (__pin) <= 41) ? 41 - (__pin) : \
|
||||
(((__pin) >= 42 && (__pin) <= 49) ? 49 - (__pin) : \
|
||||
(((__pin) >= 50 && (__pin) <= 53) ? 53 - (__pin) : \
|
||||
(((__pin) >= 54 && (__pin) <= 61) ? (__pin) - 54 : \
|
||||
(((__pin) >= 62 && (__pin) <= 69) ? (__pin) - 62 : \
|
||||
(((__pin) == 0 || (__pin) == 15 || (__pin) == 17 || (__pin) == 21) ? 0 : \
|
||||
(((__pin) == 1 || (__pin) == 14 || (__pin) == 16 || (__pin) == 20) ? 1 : \
|
||||
(((__pin) == 19) ? 2 : \
|
||||
(((__pin) == 5 || (__pin) == 6 || (__pin) == 18) ? 3 : \
|
||||
(((__pin) == 2) ? 4 : \
|
||||
(((__pin) == 3 || (__pin) == 4) ? 5 : 7)))))))))))))))
|
||||
#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__)
|
||||
#define __digitalPinToPortReg(__pin) (((__pin) <= 7) ? &PORTB : (((__pin) >= 8 && (__pin) <= 15) ? &PORTD : (((__pin) >= 16 && (__pin) <= 23) ? &PORTC : &PORTA)))
|
||||
#define __digitalPinToDDRReg(__pin) (((__pin) <= 7) ? &DDRB : (((__pin) >= 8 && (__pin) <= 15) ? &DDRD : (((__pin) >= 8 && (__pin) <= 15) ? &DDRC : &DDRA)))
|
||||
#define __digitalPinToPINReg(__pin) (((__pin) <= 7) ? &PINB : (((__pin) >= 8 && (__pin) <= 15) ? &PIND : (((__pin) >= 8 && (__pin) <= 15) ? &PINC : &PINA)))
|
||||
#define __digitalPinToBit(__pin) (((__pin) <= 7) ? (__pin) : (((__pin) >= 8 && (__pin) <= 15) ? (__pin) - 8 : (((__pin) >= 16 && (__pin) <= 23) ? (__pin) - 16 : (__pin) - 24)))
|
||||
#elif defined(ARDUINO_AVR_LEONARDO) || defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)
|
||||
#define __digitalPinToPortReg(__pin) ((((__pin) <= 4) || (__pin) == 6 || (__pin) == 12 || (__pin) == 24 || (__pin) == 25 || (__pin) == 29) ? &PORTD : (((__pin) == 5 || (__pin) == 13) ? &PORTC : (((__pin) >= 18 && (__pin) <= 23)) ? &PORTF : (((__pin) == 7) ? &PORTE : &PORTB)))
|
||||
#define __digitalPinToDDRReg(__pin) ((((__pin) <= 4) || (__pin) == 6 || (__pin) == 12 || (__pin) == 24 || (__pin) == 25 || (__pin) == 29) ? &DDRD : (((__pin) == 5 || (__pin) == 13) ? &DDRC : (((__pin) >= 18 && (__pin) <= 23)) ? &DDRF : (((__pin) == 7) ? &DDRE : &DDRB)))
|
||||
#define __digitalPinToPINReg(__pin) ((((__pin) <= 4) || (__pin) == 6 || (__pin) == 12 || (__pin) == 24 || (__pin) == 25 || (__pin) == 29) ? &PIND : (((__pin) == 5 || (__pin) == 13) ? &PINC : (((__pin) >= 18 && (__pin) <= 23)) ? &PINF : (((__pin) == 7) ? &PINE : &PINB)))
|
||||
#define __digitalPinToBit(__pin) (((__pin) >= 8 && (__pin) <= 11) ? (__pin) - 4 : (((__pin) >= 18 && (__pin) <= 21) ? 25 - (__pin) : (((__pin) == 0) ? 2 : (((__pin) == 1) ? 3 : (((__pin) == 2) ? 1 : (((__pin) == 3) ? 0 : (((__pin) == 4) ? 4 : (((__pin) == 6) ? 7 : (((__pin) == 13) ? 7 : (((__pin) == 14) ? 3 : (((__pin) == 15) ? 1 : (((__pin) == 16) ? 2 : (((__pin) == 17) ? 0 : (((__pin) == 22) ? 1 : (((__pin) == 23) ? 0 : (((__pin) == 24) ? 4 : (((__pin) == 25) ? 7 : (((__pin) == 26) ? 4 : (((__pin) == 27) ? 5 : 6 )))))))))))))))))))
|
||||
#elif defined(ARDUINO_AVR_UNO) || defined(ARDUINO_AVR_DUEMILANOVE) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328PB__)
|
||||
#if defined(__AVR_ATmega328PB__)
|
||||
#define __digitalPinToPortReg(__pin) (((__pin) <= 7) ? &PORTD : (((__pin) >= 8 && (__pin) <= 13) ? &PORTB : (((__pin) >= 14 && (__pin) <= 19) ? &PORTC : &PORTE)))
|
||||
#define __digitalPinToDDRReg(__pin) (((__pin) <= 7) ? &DDRD : (((__pin) >= 8 && (__pin) <= 13) ? &DDRB : (((__pin) >= 14 && (__pin) <= 19) ? &DDRC : &DDRE)))
|
||||
#define __digitalPinToPINReg(__pin) (((__pin) <= 7) ? &PIND : (((__pin) >= 8 && (__pin) <= 13) ? &PINB : (((__pin) >= 14 && (__pin) <= 19) ? &PINC : &PINE)))
|
||||
#define __digitalPinToBit(__pin) (((__pin) <= 7) ? (__pin) : (((__pin) >= 8 && (__pin) <= 13) ? (__pin) - 8 : (((__pin) >= 14 && (__pin) <= 19) ? (__pin) - 14 : (((__pin) >= 20 && (__pin) <= 21) ? (__pin) - 18 : (__pin) - 22))))
|
||||
#else
|
||||
#define __digitalPinToPortReg(__pin) (((__pin) <= 7) ? &PORTD : (((__pin) >= 8 && (__pin) <= 13) ? &PORTB : &PORTC))
|
||||
#define __digitalPinToDDRReg(__pin) (((__pin) <= 7) ? &DDRD : (((__pin) >= 8 && (__pin) <= 13) ? &DDRB : &DDRC))
|
||||
#define __digitalPinToPINReg(__pin) (((__pin) <= 7) ? &PIND : (((__pin) >= 8 && (__pin) <= 13) ? &PINB : &PINC))
|
||||
#define __digitalPinToBit(__pin) (((__pin) <= 7) ? (__pin) : (((__pin) >= 8 && (__pin) <= 13) ? (__pin) - 8 : (__pin) - 14))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(ARDUINO_ARCH_AVR)
|
||||
#if !defined(digitalWriteFast)
|
||||
#define digitalWriteFast(__pin, __value) do { if (__builtin_constant_p(__pin) && __builtin_constant_p(__value)) { bitWrite(*__digitalPinToPortReg(__pin), __digitalPinToBit(__pin), (__value)); } else { digitalWrite((__pin), (__value)); } } while (0)
|
||||
#endif
|
||||
#if !defined(pinModeFast)
|
||||
#define pinModeFast(__pin, __value) do { if (__builtin_constant_p(__pin) && __builtin_constant_p(__value)) { bitWrite(*__digitalPinToDDRReg(__pin), __digitalPinToBit(__pin), (__value)); } else { pinMode((__pin), (__value)); } } while (0)
|
||||
#endif
|
||||
#if !defined(digitalReadFast)
|
||||
#define digitalReadFast(__pin) ( (bool) (__builtin_constant_p(__pin) ) ? (( bitRead(*__digitalPinToPINReg(__pin), __digitalPinToBit(__pin))) ) : digitalRead((__pin)) )
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -76,9 +76,9 @@ void AltSoftSerial::init(uint32_t cycles_per_bit)
|
||||
}
|
||||
ticks_per_bit = cycles_per_bit;
|
||||
rx_stop_ticks = cycles_per_bit * 37 / 4;
|
||||
pinMode(INPUT_CAPTURE_PIN, INPUT_PULLUP);
|
||||
digitalWrite(OUTPUT_COMPARE_A_PIN, HIGH);
|
||||
pinMode(OUTPUT_COMPARE_A_PIN, OUTPUT);
|
||||
hwPinMode(INPUT_CAPTURE_PIN, INPUT_PULLUP);
|
||||
hwDigitalWrite(OUTPUT_COMPARE_A_PIN, HIGH);
|
||||
hwPinMode(OUTPUT_COMPARE_A_PIN, OUTPUT);
|
||||
rx_state = 0;
|
||||
rx_buffer_head = 0;
|
||||
rx_buffer_tail = 0;
|
||||
|
||||
@@ -35,11 +35,11 @@ LOCAL uint8_t MY_RF24_NODE_ADDRESS = AUTO;
|
||||
#endif
|
||||
|
||||
LOCAL void RF24_csn(bool level) {
|
||||
digitalWrite(MY_RF24_CS_PIN, level);
|
||||
hwDigitalWrite(MY_RF24_CS_PIN, level);
|
||||
}
|
||||
|
||||
LOCAL void RF24_ce(bool level) {
|
||||
digitalWrite(MY_RF24_CE_PIN, level);
|
||||
hwDigitalWrite(MY_RF24_CE_PIN, level);
|
||||
}
|
||||
|
||||
LOCAL uint8_t RF24_spiMultiByteTransfer(uint8_t cmd, uint8_t* buf, uint8_t len, bool aReadMode) {
|
||||
@@ -338,10 +338,10 @@ LOCAL bool RF24_initialize(void) {
|
||||
(void)RF24_getObserveTX;
|
||||
|
||||
// Initialize pins
|
||||
pinMode(MY_RF24_CE_PIN,OUTPUT);
|
||||
pinMode(MY_RF24_CS_PIN,OUTPUT);
|
||||
hwPinMode(MY_RF24_CE_PIN,OUTPUT);
|
||||
hwPinMode(MY_RF24_CS_PIN,OUTPUT);
|
||||
#if defined(MY_RX_MESSAGE_BUFFER_FEATURE)
|
||||
pinMode(MY_RF24_IRQ_PIN,INPUT);
|
||||
hwPinMode(MY_RF24_IRQ_PIN,INPUT);
|
||||
#endif
|
||||
// Initialize SPI
|
||||
_SPI.begin();
|
||||
|
||||
+11
-11
@@ -87,8 +87,8 @@ bool RFM69::initialize(uint8_t freqBand, uint8_t nodeID, uint8_t networkID)
|
||||
{255, 0}
|
||||
};
|
||||
|
||||
digitalWrite(_slaveSelectPin, HIGH);
|
||||
pinMode(_slaveSelectPin, OUTPUT);
|
||||
hwDigitalWrite(_slaveSelectPin, HIGH);
|
||||
hwPinMode(_slaveSelectPin, OUTPUT);
|
||||
SPI.begin();
|
||||
unsigned long start = millis();
|
||||
uint8_t timeout = 50;
|
||||
@@ -318,15 +318,15 @@ void RFM69::sendFrame(uint8_t toAddress, const void* buffer, uint8_t bufferSize,
|
||||
// no need to wait for transmit mode to be ready since its handled by the radio
|
||||
setMode(RF69_MODE_TX);
|
||||
uint32_t txStart = millis();
|
||||
while (digitalRead(_interruptPin) == 0 && millis() - txStart < RF69_TX_LIMIT_MS); // wait for DIO0 to turn HIGH signalling transmission finish
|
||||
while (hwDigitalRead(_interruptPin) == 0 && millis() - txStart < RF69_TX_LIMIT_MS); // wait for DIO0 to turn HIGH signalling transmission finish
|
||||
//while (readReg(REG_IRQFLAGS2) & RF_IRQFLAGS2_PACKETSENT == 0x00); // wait for ModeReady
|
||||
setMode(RF69_MODE_STANDBY);
|
||||
}
|
||||
|
||||
// internal function - interrupt gets called when a packet is received
|
||||
void RFM69::interruptHandler() {
|
||||
//pinMode(4, OUTPUT);
|
||||
//digitalWrite(4, 1);
|
||||
//hwPinMode(4, OUTPUT);
|
||||
//hwDigitalWrite(4, 1);
|
||||
if (_mode == RF69_MODE_RX && (readReg(REG_IRQFLAGS2) & RF_IRQFLAGS2_PAYLOADREADY))
|
||||
{
|
||||
//RSSI = readRSSI();
|
||||
@@ -342,7 +342,7 @@ void RFM69::interruptHandler() {
|
||||
PAYLOADLEN = 0;
|
||||
unselect();
|
||||
receiveBegin();
|
||||
//digitalWrite(4, 0);
|
||||
//hwDigitalWrite(4, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -364,7 +364,7 @@ void RFM69::interruptHandler() {
|
||||
setMode(RF69_MODE_RX);
|
||||
}
|
||||
RSSI = readRSSI();
|
||||
//digitalWrite(4, 0);
|
||||
//hwDigitalWrite(4, 0);
|
||||
}
|
||||
|
||||
// internal function
|
||||
@@ -464,12 +464,12 @@ void RFM69::select() {
|
||||
SPI.setDataMode(SPI_MODE0);
|
||||
SPI.setBitOrder(MSBFIRST);
|
||||
SPI.setClockDivider(SPI_CLOCK_DIV4); // decided to slow down from DIV2 after SPI stalling in some instances, especially visible on mega1284p when RFM69 and FLASH chip both present
|
||||
digitalWrite(_slaveSelectPin, LOW);
|
||||
hwDigitalWrite(_slaveSelectPin, LOW);
|
||||
}
|
||||
|
||||
// unselect the RFM69 transceiver (set CS high, restore SPI settings)
|
||||
void RFM69::unselect() {
|
||||
digitalWrite(_slaveSelectPin, HIGH);
|
||||
hwDigitalWrite(_slaveSelectPin, HIGH);
|
||||
// restore SPI settings to what they were before talking to RFM69
|
||||
#if defined (SPCR) && defined (SPSR)
|
||||
SPCR = _SPCR;
|
||||
@@ -504,8 +504,8 @@ void RFM69::setHighPowerRegs(bool onOff) {
|
||||
// set the slave select (CS) pin
|
||||
void RFM69::setCS(uint8_t newSPISlaveSelect) {
|
||||
_slaveSelectPin = newSPISlaveSelect;
|
||||
digitalWrite(_slaveSelectPin, HIGH);
|
||||
pinMode(_slaveSelectPin, OUTPUT);
|
||||
hwDigitalWrite(_slaveSelectPin, HIGH);
|
||||
hwPinMode(_slaveSelectPin, OUTPUT);
|
||||
}
|
||||
|
||||
//for debugging
|
||||
|
||||
@@ -72,12 +72,12 @@ void SPIFlash::select() {
|
||||
SPI.setClockDivider(SPI_CLOCK_DIV4); //decided to slow down from DIV2 after SPI stalling in some instances, especially visible on mega1284p when RFM69 and FLASH chip both present
|
||||
SPI.begin();
|
||||
#endif
|
||||
digitalWrite(_slaveSelectPin, LOW);
|
||||
hwDigitalWrite(_slaveSelectPin, LOW);
|
||||
}
|
||||
|
||||
/// UNselect the flash chip
|
||||
void SPIFlash::unselect() {
|
||||
digitalWrite(_slaveSelectPin, HIGH);
|
||||
hwDigitalWrite(_slaveSelectPin, HIGH);
|
||||
//restore SPI settings to what they were before talking to the FLASH chip
|
||||
#ifdef SPI_HAS_TRANSACTION
|
||||
SPI.endTransaction();
|
||||
@@ -97,7 +97,7 @@ boolean SPIFlash::initialize()
|
||||
_SPCR = SPCR;
|
||||
_SPSR = SPSR;
|
||||
#endif
|
||||
pinMode(_slaveSelectPin, OUTPUT);
|
||||
hwPinMode(_slaveSelectPin, OUTPUT);
|
||||
#ifdef SPI_HAS_TRANSACTION
|
||||
_settings = SPISettings(4000000, MSBFIRST, SPI_MODE0);
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user