Im übrigen solltest du um Datentypen wie int einen Bogen machen, wenn du
nicht wirklich 16 Bit brauchst.
Solange du mit einem Zahlenbereich 0..255 auskommst, solltest du
unbedingt uint8_t nehmen.
In deinem
int test;
steckt nämlich noch eine 2-te Falle. Gut, bei dir in deinem Programm
jetzt nicht, aber grundsätzlich schon. Auf einen int kann der Prozessor
nicht atomar zugreifen (in einem Rutsch) sondern er muss das auf 2 mal
machen. Wenn jetzt genau zwischen den beiden Zugriffen die ISR ausgelöst
wird und innerhalb der ISR die Variable verändert wird, dann hat der
unterbrochene Code unter Umständen ein Problem: er hat einen int
gelesen, dessen beiden Bytes von verschiedenen Werten stammen. Und das
kann sich dann auch so auswirken, dass in dieser Kombination Werte
entstehen, die eigentlich ungültig sind.
Anhand des Dezimalsystems erklärt:
In deiner Variablen können nur Werte von 0 bis 100 stehen (inklusive).
Und jetzt nehmen wir mal an, der µC müsste die Tasuender und Hunderter
getrennt von den Zehnern und Einern einlesen (also es sind 2
Lesezugriffe notwendig). Das Programm liest also die 1 für 100. Und noch
ehe es den Rest lesen kann, kommt die ISR zum Zug und ändert den Wert
auf 99. Wird danach der 2.te Lesezugriff gemacht, dann liest dein
Hauptprogramm natürlich für Zehner und Einer die 99 aus. Die 1 aus den
Hundertern hatte es ja schon vor der Unterbrechung gelesen.
Zusammengenommen hat also dein Programm den Wert .... 199 aus der
Variablen ausgelesen. Und das war nicht im Sinne des Erfinders.
Daher: Immer den kleinsten Datentyp nehmen der passt. Und wenn geht
einen uint8_t. Denn der ist 1 Byte groß und kann in einem Rutsch aus dem
Speicher gelesen werden. Und somit gibt es da auch kein Problem mit dem
atomaren Zugriff. Denn 1 Byte lesen ist trivialerweise atomar.