DrAzzy:
NbTopsFan needs to be declared volatile, since it's modified in an ISR but accessed outside of one, otherwise accesses to it could be optimized away.
I agree, not sure how I missed that.
DrAzzy:
Edit: AAH! You're using delay with interrupts globally disabled! Delay relies on the timekeeping interrupt firing in the background to count the time; without it, delay() will hang...
BINGO! We have a winner. I was not aware of that but it shall be duly noted for the future. Let me rework this and I will get back to you. Thank you for your help so far.