banner left Boxtec Banner
Platzhalter BoxtecProdukteForumShopKontaktPlaygroundn/aJobs
 

HelvePic32

In guter Tradition ist der erste Test eines Boards der, die User-LED zum blinken zu bringen. Beim HelvePic32 gibt es da zwei Möglichkeiten:

1) Traditionell digitalWrite()

blink.ino
const uint8_t LEFT=0;
const uint8_t RIGHT=1;
#if defined(_BOARD_DP32_)
const uint8_t MAXWING=2;
uint8_t nP[2][8] = {{ 0,17, 9,10,11,12,13,14},{18,17, 1, 2, 3, 6, 7, 8}}; // pins of version 1.0 using DP32 board definition
#endif
#if defined(_BOARD_HELVEPIC32_)
const uint8_t MAXWING=2;
uint8_t nP[2][8] = {{ 0, 1, 2, 3, 4, 5, 6, 7},{ 8, 9,10,11,12,13,14,15}}; // pins of version 1.0 using HelvePic32 board definition
#endif
 
void setup()
{
	pinMode(nP[RIGHT][2],OUTPUT);
}
 
void loop()
{
	digitalWrite(nP[RIGHT][2], HIGH);
	delay(250);
	digitalWrite(nP[RIGHT][2], LOW);
	delay(250);
}

2) Register Manipulation

Hier bedienen wir uns eines Tricks, den wir uns in der UTFT Library abgeschaut haben. Statt das Register und die zugehörige Bitmask selbst zusammen zu suchen, kann man eine entsprechende Routine aufrufen, die einem das Portregister als auch die passende Bitmask zu einem Pin ausrechnet. Das funktioniert übrigens auch beim Arduino… Zusätzlich zum Pin-Array definieren wir ein Pointerarray pP, welches auf die Portregister zeigt und ein Bitmaskarray bP, welches die Bitmask speichert. Der nachfolgende Code verwendet dann zwei Pre-Prozessor Macros um das jeweilige Bit zu setzen (sbi) oder zu löschen (cbi). Der Code prüft auch die Architektur, so dass der Code auch auf einem Arduino laufen kann.

blink_sbicbi.ino
#define cbi(reg, bitmask) *reg &= ~bitmask
#define sbi(reg, bitmask) *reg |= bitmask
const uint8_t LEFT=0;
const uint8_t RIGHT=1;
uint8_t nP[2][8] = {{0,17, 9,10,11,12,13,14},{18,17, 1, 2, 3, 6, 7, 8}}; // pins of version 1.0 using DP32 board definitions
 
#if defined(__AVR__)
volatile uint8_t *pP[2][8];
uint8_t           bP[2][8];
#elif defined(__PIC32MX__)
volatile uint32_t *pP[2][8];
uint32_t           bP[2][8];
#endif
 
void _IO_Init() {
	for (uint8_t i=0; i<2; i++){
		for (uint8_t j=0; j<8; j++){
			pP[i][j] = portOutputRegister(digitalPinToPort(nP[i][j]));
			bP[i][j] = digitalPinToBitMask(nP[i][j]);
		}
	}
}
 
void setup()
{
	_IO_Init();
	for (uint8_t i=0; i<8; i++){
		pinMode(nP[RIGHT][i],OUTPUT);
	}
}
 
void loop()
{
	sbi(pP[RIGHT][2], bP[RIGHT][2]);
	delay(500);
	cbi(pP[RIGHT][2], bP[RIGHT][2]);
	delay(100);
}

(zur Unterscheidung sind die Delays unterschiedlich gewählt)

Was ist der Unterschied?

Das nachfolgende Bild zeigt erst das Setzen des Pins auf HIGH mit digitalWrite gefolgt von einem Aufruf zu digitalWrite, um den Pin auf LOW zu setzen. Danach die gleiche Aktion mit sbi und cbi:

Man sieht, dass mit digitalWrite der kürzeste Puls 1.2 μs lang ist, mit sbi/cbi nur 140 nS, also um einen Faktor 8-10 schneller.

HelvePic32

 
helvepic32/bspblink/start.txt · Last modified: 2016/02/24 22:09 by mathiasw
 
 

zum Seitenanfang

Letzte Aktualisierung: © boxtec internet appliances · the better security products