Playing with Arduino
A page to record my playing with Arduino
digitalPinToTimer()

Abstract

The digitalPinToPort() is a macro that returns the port of a specified pin.

Source Code

The digitalPinToPort() is defined in hardware/arduino/avr/cores/arduino/Arduino.h as below.

1
#define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) )

The input is P. The macro calls pgm_read_byte() with an argument digital_pin_to_timer_PGM + (P).

The digital_pin_to_timer_PGM is defined in hardware/arduino/variants/standard/pins_arduino.h(in case of Arduino Uno). It is an array shown below. As this array is declared as PROGMEM, it is placed on flash memory rather than SRAM.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
	NOT_ON_TIMER, /* 0 - port D */
	NOT_ON_TIMER,
	NOT_ON_TIMER,
	TIMER2B,
	NOT_ON_TIMER,
	TIMER0B,
	TIMER0A,
	NOT_ON_TIMER,
	NOT_ON_TIMER, /* 8 - port B */
	TIMER1A,
	TIMER1B,
	TIMER2A,
	NOT_ON_TIMER,
	NOT_ON_TIMER,
	NOT_ON_TIMER,
	NOT_ON_TIMER, /* 14 - port C */
	NOT_ON_TIMER,
	NOT_ON_TIMER,
	NOT_ON_TIMER,
	NOT_ON_TIMER,
};

As the digital_pin_to_timer_PGM is an array, adding (P) to the digital_pin_to_timer_PGM means the (P+1)th element of the array. In C++ language, the element of array x[i] can be accessed by *(x + i). For example, if the P is 3, the fortth element(note that the elements begins with 0) of the array, that is TIMER2B, is returned.

The pgm_read_byte() is a macro to read a valiable maked as PROGMEM and is defined in hardware/tools/avr/avr/include/avr/pgmspace.h.

As a result digitalPinToTimer() returns the (P+1)th element of digital_pin_to_timer_PGM which is placed on the flash memory.

Version

Arduino 1.8.13

Last Update

June 19, 2020

inserted by FC2 system