Reset_AVR(); sembra scattare arbitrariamente ma comunque non fa il reset

Funziona perché lasci le graffe. Quel do{}while(0) è un costrutto particolare per far sì che quella macro possa apparire ovunque come se fosse una normale istruzione ed evitare cose come quella che è successa a te. Probabilmente è un po' "esagerato" in questo contesto ma fa quel che deve.