Stuck on Interrupts

Store Forums Video Experimenter General Discussion Stuck on Interrupts

Viewing 4 posts - 31 through 34 (of 34 total)
  • Author
    Posts
  • #1382
    Michael
    Keymaster

    Sounds like you’re making progress. Memory issues are frustrating because they can be nondeterministic and hard to debug. You will save space by storing your string literals in PROGMEM, so I encourage you to try that again. To access the string, you need to do it a bit differently than normal by using the function pgm_read_word.

    Lots of explanation here: http://www.arduino.cc/en/Reference/PROGMEM

    It makes most sense when your strings are longer than a few characters. If the string is short, then you don’t really save anything because you are using memory to store the pointers to the strings….

    #1383
    joey
    Member

    Well, I got it working a lot better now although I feel dirty for not following better coding practices.

    I’m getting incorrect output from the hour, minute, month, and day bytes though. This is new.

    // This is an example of how to always present your callsign and other goodies on a VE
    // Note that there is no known way to display the degree symbol as the char chart is different
    // Also because of the VERY limited memory size on the Uno, this sketch had to be compressed
    // from it's former glory.
    // joey@stan4d.net


    #include
    #include
    #include
    #include
    #include

    TVout tv;


    // You must use uart for this to work
    // Create an instance of the TinyGPS object
    pollserial pserial;
    TinyGPS gps;

    // This is where you declare prototypes for the functions that will be
    // using the TinyGPS library.
    void getgps(TinyGPS &gps);

    // Your callsign
    const char callsign[] = "NV0N";

    //TMP36 Pin Variables
    //the analog pin the TMP36's Vout (sense) pin is connected to
    //the resolution is 10 mV / degree centigrade
    //(500 mV offset) to make negative temperatures an option
    const int temperaturePin = 0;


    void setup() {
    tv.begin(NTSC, 128, 98);
    tv.set_hbi_hook(pserial.begin(4800));
    initOverlay();
    tv.select_font(font6x8);
    tv.fill(0);
    }


    // Initialize ATMega registers for video overlay capability.
    // Must be called after tv.begin().
    void initOverlay() {
    TCCR1A = 0;
    // Enable timer1. ICES0 is set to 0 for falling edge detection on input capture pin.
    TCCR1B = _BV(CS10);

    // Enable input capture interrupt
    TIMSK1 |= _BV(ICIE1);

    // Enable external interrupt INT0 on pin 2 with falling edge.
    EIMSK = _BV(INT0);
    EICRA = _BV(ISC11);
    }

    // Required to reset the scan line when the vertical sync occurs
    ISR(INT0_vect) {
    display.scanLine = 0;
    }


    void loop() {
    tv.delay_frame(1); // flicker prevention

    // callsign

    tv.select_font(font6x8);
    tv.print(0,0, callsign);


    while(pserial.available()) { // if there is data on the RX pin...
    if(gps.encode(pserial.read())) { // if there is a new valid sentence...
    getgps(gps); // then grab the data.
    }
    } // while
    } // loop


    // The getgps function will get and print the values we want.
    void getgps(TinyGPS &gps)
    {

    char buffer[22];
    PString message(buffer, sizeof(buffer));
    float latitude, longitude;

    // time, date, temp

    int year;
    byte month, day, hour, minute, second, hundredths;
    gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);

    message.print(hour);
    message += ":";
    message.print(minute);
    message += " ";
    message.print(month);
    message += "/";
    message.print(day);
    message += "/";
    message.print(year);
    message += "Z ";
    message += " ";

    // temperature
    // Fancy TMP36 calc which converts to Farenheit and then clips to a 2 digit degree
    int temperature = int(((((analogRead(temperaturePin) * .004882814) - .5) *100) *1.8) +32);

    message.print(temperature);
    message += "F";
    tv.select_font(font4x6);
    tv.print(0,75, message);

    // we're going to reuse the buffer so we need to clear it
    message.begin();

    // coords, alt

    gps.f_get_position(&latitude, &longitude);

    // let's process!
    message.print(latitude);
    message += ", ";
    message.print(longitude);
    message += " ";

    int altitude = int(gps.f_altitude());
    message.print(altitude);
    message += "M";

    tv.print(0,85, message);
    }







    #1384
    joey
    Member

    yay working. Just wrapped it in INTs

    // This is an example of how to always present your callsign and other goodies on a VE
    // Note that there is no known way to display the degree symbol as the char chart is different
    // Also because of the VERY limited memory size on the Uno, this sketch had to be compressed
    // from it's former glory.
    // joey@stan4d.net


    #include
    #include
    #include
    #include
    #include

    TVout tv;


    // You must use uart for this to work
    // Create an instance of the TinyGPS object
    pollserial pserial;
    TinyGPS gps;

    // This is where you declare prototypes for the functions that will be
    // using the TinyGPS library.
    void getgps(TinyGPS &gps);

    // Your callsign
    const char callsign[] = "NV0N";

    //TMP36 Pin Variables
    //the analog pin the TMP36's Vout (sense) pin is connected to
    //the resolution is 10 mV / degree centigrade
    //(500 mV offset) to make negative temperatures an option
    const int temperaturePin = 0;


    void setup() {
    tv.begin(NTSC, 128, 98);
    tv.set_hbi_hook(pserial.begin(4800));
    initOverlay();
    tv.select_font(font6x8);
    tv.fill(0);
    }


    // Initialize ATMega registers for video overlay capability.
    // Must be called after tv.begin().
    void initOverlay() {
    TCCR1A = 0;
    // Enable timer1. ICES0 is set to 0 for falling edge detection on input capture pin.
    TCCR1B = _BV(CS10);

    // Enable input capture interrupt
    TIMSK1 |= _BV(ICIE1);

    // Enable external interrupt INT0 on pin 2 with falling edge.
    EIMSK = _BV(INT0);
    EICRA = _BV(ISC11);
    }

    // Required to reset the scan line when the vertical sync occurs
    ISR(INT0_vect) {
    display.scanLine = 0;
    }


    void loop() {
    tv.delay_frame(1); // flicker prevention

    // callsign

    tv.select_font(font6x8);
    tv.print(0,0, callsign);


    while(pserial.available()) { // if there is data on the RX pin...
    if(gps.encode(pserial.read())) { // if there is a new valid sentence...
    getgps(gps); // then grab the data.
    }
    } // while
    } // loop


    // The getgps function will get and print the values we want.
    void getgps(TinyGPS &gps)
    {

    char buffer[26];
    PString message(buffer, sizeof(buffer));
    float latitude, longitude;

    // time, date, temp

    int year;
    byte month, day, hour, minute, second, hundredths;
    gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);

    message.print(int(hour));
    message += ":";
    message.print(int(minute));
    message += " ";
    message.print(int(month));
    message += "/";
    message.print(int(day));
    message += "/";
    message.print(int(year));
    message += " UTC ";

    // temperature
    // Fancy TMP36 calc which converts to Farenheit and then clips to a 2 digit degree
    int temperature = int(((((analogRead(temperaturePin) * .004882814) - .5) *100) *1.8) +32);

    message.print(temperature);
    message += "F";
    tv.select_font(font4x6);
    tv.print(0,75, message);

    // we're going to reuse the buffer so we need to clear it
    message.begin();

    // coords, alt

    gps.f_get_position(&latitude, &longitude);

    // let's process!
    message.print(latitude);
    message += ", ";
    message.print(longitude);
    message += " ";

    int altitude = int(gps.f_altitude());
    message.print(altitude);
    message += "M";

    tv.print(0,85, message);
    }
    #1385
    joey
    Member

    I still get some artifacts every 10 seconds or so at the bottom of the screen. I can’t tell if it’s losing tracking or something else is going on. All the text moves to the right.

Viewing 4 posts - 31 through 34 (of 34 total)
  • You must be logged in to reply to this topic.