Das erste, was mir aufgefallen ist, ist, das a als int32_t deklariert
ist. Muss das sein? Der Atmel ist ein 8-Bit Prozessor. 32Bit
Additionen/Vergleiche sind für einen 8-Bitter recht aufwendig. Erwartest
du wirklich 2.14 Billionen Tastendrücke? Ich würde a auch nicht als int
sondern als unsigned int deklarieren.
Dann fiel mir auf, das du im Code überhaupt keine Entprellung hast! Ein
real existierender Taster prellt aber immer! Ein Tastendruck prellt
etliche male nach, so das du diesen einen Tastendruck 10, 20mal zählst.
Ist ist deshalb nicht besonders klug den Taster direkt einen Interrupt
auslösen zu lassen. Besser ist es den Taster innerhalb eines
periodischen Timerinterrupts abzufragen, oder falls du keine
zeitkritische Anwendung im Sinn hast, diesen mit der Warteschleifen
Methode abzufragen.
Entprellung: http://www.mikrocontroller.net/articles/Entprellung
Dann ist natürlich auch sofort klar weshalb dein Code nicht
funktioniert:
1 | if(a==1)
|
2 | {
|
3 | PORTB |= (1<<PB4);
|
4 | }
|
Aufgrund des Prellen ist es sehr unwahrscheinlich das a genau zu dem
einen und einzigen Zeitpunkt, wo du a abfragst den Wert 1 hat. Der
Vergleich wird also niemals true!
Außerdem ist die Position des Vergleichs schlecht gewählt. Er müsste in
der while schleife sein und ist leider auch nicht mit cli()/sei()
interruptfest gestaltet.