Auf dieser Seite werde ich in loser Folge einfache Erklärungen für häufig vorkommende Begriffe in der Programmierung angeben.
Das sollen einfache Erklärungen für Einsteiger sein, die nicht den Anspruch erheben, alle Aspekte abzudecken.
Ergänzend dazu sollten die Grundlagen von C++ (ein gutes C++ Buch - mein Favorit), die Arduino-Referenz (auch in deutsch verfügbar) und die Datenblätter der jeweiligen Hardware gelesen werden.
Also ganz ohne jegliche Kenntnisse werden Euch diese Erklärungen auch nichts bringen.
Man kann einem Blinden nunmal schlecht Farben erklären.

Begriff/BezugErklärung
Interrupt
atomic
Der ATmega328 / 2560 und andere 8 Bit Prozessoren können in einem "Prozesorbefehl" auf 1 Byte zugreifen. Dadurch kann es passieren, dass beim Lesen längerer Daten zwischendurch ein Interrupt zuschlägt und die Daten verändert. Beispiel (ohne Berücksichtigung der Byteorder): In der Variablen auf die die Interruptroutine zugreift steht 0x1234. Diese soll in eine andere Variable kopiert werden. Der MC liest das erste Byte 0x12 , dann schlägt der Interrupt zu und schreibt in die Variable 0x5678. Der MC liest danach das 2. Byte als 0x78. In der Variablen steht also 0x1278, was keinem der beiden Werte entspricht.
Das Vorgehen ist abhängig vom verwendeten MC.
Deshalb sperrt man vorher den Interrupt ( cli(); ), kopiert und gibt ihn dann wieder frei (sei(); ). oder man nutzt

#include <util/atomic.h>
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
   // kopieren
}

Bei 32 Bit MC ist das anders. Diese lesen am Stück 32 Bit, also ein ganzes (u)int (wenn sie nicht durch Pack auf eine andere Anordnung gezwungen wurden).
Interrupt
volatile
Der Optimizer des Compilers wirft alles raus, worauf im Quelltext kein Bezug vorhanden ist. Weiterhin wird nicht jede Variable immer neu aus dem Speicher gelesen, wenn sie sich bereits in einem Register des Prozessors befindet.
Das könnte bei Variablen, die auch in einer Interruptroutine geändert werden, zu Fehlern führen.
Mit dem Schlüsselwort volatile sagt man deshalb dem Compiler, dass er die Variable nicht weg optimieren soll und sie immer neu aus dem Speicher holen muss.
volatile unsigned long timestamp;