OK. I'll just read along and comment as I go:
- readTime() --- you do check for an error on start and address select, but then you just return, with no indication that the read failed. Obviously in a real clock, it's not going to fail, and if it does, what would you even do? But during development, you want to know if there's an error. May I offer a suggestion? Dump error messages to the UART at some very slow "can't go wrong" baud rate. If something goes wrong, just whack one of those FTDI things on the line, or a logic analyzer or scope with serial decode features.
- Same with updateTime(). Don't you at least want to return an error code?
- EIMSK - have you considered edge polarity? Not sure if it matters here, just checking, since there's no code or comment to that effect.
- Not 100% sure what's going on with the debounce line. Are you debouncing for 750ms? That's really long...
- What are the globals min1...etc for? I only see min1/min2 being used, in the ISR. If that's how they're always going to be, declare them in the ISR. Globals are confusing.
- I'm not sure what the ISR has to do with the debounce variable. You should explain that.