Adafruit Ultimate GPS - How do I use PPS to trigger interrupt?

I need some help with using the PPS on the Ultimate GPS.

I have the PPS pin from the GPS hooked to digital pin 3 on my Arduino Uno (which is interrupt 1, correct?). I want to turn on a LED that I have hooked to digital pin 13. I have the following code running on my sketch, but the LED does not turn on and off at 1 second intervals. The LED flickers on and off (and somewhat erratic). It seems somewhat timed to 1 second intervals, but not always.

Is there something I need to do to use the PPS? Like pull up/down resistors?

boolean pps_led_state = true;
int  PPS_LED = 13;

void setup () {
  pinMode(PPS_LED, OUTPUT);
  digitalWrite(PPS_LED, LOW);

  attachInterrupt(1, pps_interrupt, RISING);

void loop () { 


void pps_interrupt(){
    pps_led_state = false;
    pps_led_state = true;

  digitalWrite(PPS_LED, pps_led_state);

This is the datasheet for the GPS
GPS in question Overview | Adafruit Ultimate GPS | Adafruit Learning System

"1PPS Time Mark Output 2.8V CMOS Level"

It may be that the 2.8V signal is not high enough to work reliably on a 5V input. I think you might need a level shifter. You can probably make one with a small NPN transistor, pull-up resistor, and Base resistor. See "A transistor inverter (NOT gate)" at Transistor Circuits or this stuff on level shifting:

I'll try that out and see if it works. Thanks for the suggestion.

You need to define the interrupt pin as an input and set the internal pullup.


or just pinMode(3,INPUT_PULLUP); should be sufficient.


attachInterrupt(1, pps_interrupt, RISING);

Does the above not do that already?
I used this as my reference. I didn't see any code in their example that calls out pinMode(3,INPUT); for using Interrupt 1.

I do have
pinMode(PPS_PIN, INPUT);
in my project code. I just failed to include that when I posted it in my original message.