67 lines
1.8 KiB
C++
67 lines
1.8 KiB
C++
/**
|
||
* mega-blink-test.ino
|
||
*
|
||
* Arduino Mega 2560 GPIO test sketch used by mega-emulation.test.ts
|
||
*
|
||
* Exercises pins across multiple ATmega2560 ports:
|
||
* - Pin 13 — PORTB bit 7 (LED_BUILTIN)
|
||
* - Pins 22-29 — PORTA bits 0-7 (all HIGH in setup)
|
||
* - Pin 53 — PORTB bit 0 (SPI SS)
|
||
* - Pin 4 — PORTG bit 5
|
||
* - Pin 6 — PORTH bit 3 (PWM)
|
||
* - Pin 42 — PORTL bit 7
|
||
*
|
||
* loop(): blinks pin 13 using a busy-wait loop (avoids Timer0 ISR dependency)
|
||
* so the emulation test can detect both HIGH→LOW and LOW→HIGH transitions
|
||
* within a bounded cycle budget.
|
||
*
|
||
* NOTE: delay() is intentionally avoided here. Arduino's delay() relies on
|
||
* Timer0 overflow interrupts whose vector address differs between ATmega328P
|
||
* (used by avr8js defaults) and ATmega2560, so it would spin forever in the
|
||
* emulator. The busy-wait loop below completes in ~1.4 M CPU cycles per half-
|
||
* period — well within the 20 M cycle budget of the emulation test.
|
||
*/
|
||
|
||
/* Number of iterations per half-blink; ~14 cycles/iter × 100 000 ≈ 1.4 M cycles */
|
||
#define HALF_BLINK_ITERS 100000UL
|
||
|
||
static void busyWait(unsigned long iters) {
|
||
volatile unsigned long i;
|
||
for (i = 0; i < iters; i++) { /* nothing */ }
|
||
}
|
||
|
||
void setup() {
|
||
// LED_BUILTIN = pin 13 = PORTB bit 7
|
||
pinMode(13, OUTPUT);
|
||
digitalWrite(13, HIGH);
|
||
|
||
// PORTA: pins 22–29 (bits 0–7)
|
||
for (int i = 22; i <= 29; i++) {
|
||
pinMode(i, OUTPUT);
|
||
digitalWrite(i, HIGH);
|
||
}
|
||
|
||
// PORTB bit 0: pin 53 (SPI SS)
|
||
pinMode(53, OUTPUT);
|
||
digitalWrite(53, HIGH);
|
||
|
||
// PORTG bit 5: pin 4
|
||
pinMode(4, OUTPUT);
|
||
digitalWrite(4, HIGH);
|
||
|
||
// PORTH bit 3: pin 6
|
||
pinMode(6, OUTPUT);
|
||
digitalWrite(6, HIGH);
|
||
|
||
// PORTL bit 7: pin 42
|
||
pinMode(42, OUTPUT);
|
||
digitalWrite(42, HIGH);
|
||
}
|
||
|
||
void loop() {
|
||
digitalWrite(13, HIGH);
|
||
busyWait(HALF_BLINK_ITERS);
|
||
digitalWrite(13, LOW);
|
||
busyWait(HALF_BLINK_ITERS);
|
||
}
|