setInterval not working after save()?

Posted on
  • Hi,
    The following (much cut down) code works fine when uploaded from the IDE but after using save() and power cycling it appears as if setInterval has no effect. The LCD and clock then update as quickly as possible (the clock goes through a day in about 6 seconds).

    On power-up or after using load() it exhibits this problem.
    However, if I then press the physical reset button or use E.reboot() from the IDE it will run properly.

    I may just be that I'm not setting things up properly for using save() with setInterval (I rarely use save).

    This is on an original Espruino board with added 32.168kHz crystal.
    Firmware is version 2v03.21 but with some fonts compiled in.

    Any ideas?
    Thanks,
    Jamie

    let data_rec = Array(7)
    let lcd = undefined
    let Tmin = undefined
    let Tmax = undefined
    
    function LCD_init(spi) {
      let lcd = require("PCD8544").connect(spi,A6,B0,B1,­ function() {
        lcd.clear()
        lcd.flip()
        }
       )
      return lcd
    }
    
    function LCD_update() {
      lcd.clear()
      let d = new Date().toISOString()
      // split the datetime string to fit the screen
      lcd.drawString(d.split('T')[0].replace('­-','.').replace('-','.'),0,0)
      lcd.drawString(d.split('T')[1].split('.'­)[0],50,0)
      // update display with data
      lcd.drawString(data_rec[6],20,20)
      lcd.flip()
    }
    
    function data_update() {
      // updates the data_rec with data from other sources
      data_rec[6]=analogRead(C1)*3.3*3/2
    }
    
    function onInit() {
      clearInterval()
      clearWatch()
    
      // initialize the rtc from the DS3231
      I2C1.setup({sda:B9,scl:B8})
      rtc = require("DS3231_J").connect(I2C1)
      let t = rtc.timeArray()
      setTime((new Date(t[0],t[1]-1,t[2],t[3],t[4],t[5],0).­getTime())/1000)
      data_rec = [new Date(), 0,0, 0.0, 0.0, 'K', 1, 0.0]
    
      // initialize the LCD
      SPI1.setup({sck:A5, mosi:A7})
      lcd = LCD_init(SPI1)
      setTimeout(function() {
        setInterval(LCD_update, 500)
        }, 1000)
    
      // timeout used here to allow for the initial data reading to complete
      setTimeout(function () {setInterval(data_update,1000)}, 1500)
    }
    
  • It sounds like you're doing everything fine. Do you get any error messages when you load()?

    I guess you could try initialising the LCD and DS3231 after a delay in case that's a issue? Maybe the DS3231 takes a while to work after power is applied - if you got the wrong time out of it then maybe setTime sets the time to something invalid and that breaks the timeouts?

    You could try running dump() to see if any intervals/timeouts are actually set up to run, and maybe check getTime() or new Date() to see if the time is what you expect it should be.

    Finally, it's unlikely I ever checked what happens if you reset the time to something else and then immediately create intervals, so I guess you could try setting the time inside a timeout?

  • @Gordon I finally got time to implement your suggestions and the results were all consistent with a clock that is running way too fast so I tried it on a second Espruino board and the code worked fine.
    No errors on load() except the occasional I2C bus confusion from the previous

    I think this particular board may just require a longer delay for the LSE clock to settle down as it works once powered and then the reset button pressed.

    This is probably due to borderline capacitance on the 32.768KHz crystal circuit (which I had added).

    So, it appears that resetting the time and then immediately creating intervals does work.

    Thanks,
    Jamie

  • @Robin Thanks for the pointers. I did have a bit of trouble with that bit.

  • Great - thanks for letting us know!

    You might find that cutting the trace for the C15 pin helps you out - having a long wire on one of the oscillator pins won't help at all.

    Also, sometimes (if it was working before) just giving the board a good clean with something like isopropyl alcohol can make a massive difference :)

  • Post a reply
    • Bold
    • Italics
    • Link
    • Image
    • List
    • Quote
    • code
    • Preview
About

setInterval not working after save()?

Posted by Avatar for jlawson @jlawson

Actions