1 | ldi A,5 ;Start mit Vorteiler / 1024
|
2 | out TCCR0B,A
|
3 | ldi A,2
|
4 | out TIMSK0,A ;Timer Interrupt freigeben
|
Schreib das nicht so!
Benutze die Bitnamen!
1 | ldi A, (1<<CS02) | (1<<CS00) ;Start mit Vorteiler / 1024
|
2 | out TCCR0B,A
|
3 | ldi A, (1<<TOIE0)
|
4 | out TIMSK0,A ;Timer Interrupt freigeben
|
Ich sehe in deinem Code nicht, wo du das einer Taste zugeordnete Bit
wieder löscht, nachdem du den Tastendruck abgearbeitet hast.
> nur ein sauberes entprellen
> der Tasten mit den hier im Forum vorgestellten Routinen will mir
> nicht so gelingen.
Das bedeutet was genau?
Gehört jetzt zwar nicht zum Problem, aber
Code so einfach wie möglich schreiben! Gerade in Assembler
1 | taste1:
|
2 | sbis pinb,2
|
3 | rjmp relais_an
|
4 | sbic pinb,2
|
5 | rjmp relais_aus
|
6 | relais_aus:
|
Ein Bit kann entweder gesetzt oder gelöscht sein, aber nicht beides
gleichzeitig. Wenn also relais_an nicht zutrifft, dann muss es
relais_aus sein. Es gibt keine andere Möglichkeit. Daher muss man das
auch nicht testen. Auch willst du hier eigentlich nicht das PIN Register
abfragen, sondern das PORT Register. Denn du willst ja wissen, was du
als letztes rausgeschrieben hast, welchen Zustand der Ausgang hat. PIN
benutzt du, wenn es sich um einen echten Eingang handelt, also jemand
von aussen am physikalischen Pin rumwerkelt (wie zb ein Taster)
1 | taste1:
|
2 | sbis PORTB,2
|
3 | rjmp relais_an
|
4 | relais_aus:
|
Auch solche Dinge solltest du vermeiden
Das ist sinnlos und zieht den Code nur unnötig in die Länge. Die
Grundidee einen gemeinsamen Rücksprungpunkt zu haben würde ich
allerdings nicht unbedingt in Frage stellen auch wenn es in diesem
konkreten Fall nicht notwendig ist. Man könnte das alles so schreiben
1 | taste1:
|
2 | sbis PORTB,2
|
3 | rjmp relais_an
|
4 | relais_aus:
|
5 | cbi PORTB,2
|
6 | rjmp Schleife
|
7 | relais_an:
|
8 | sbi PORTB,2
|
9 | rjmp Schleife
|
aber so, finde ich, ist das auch noch ok
1 | taste1:
|
2 | sbis PORTB,2
|
3 | rjmp relais_an
|
4 | relais_aus:
|
5 | cbi PORTB,2
|
6 | rjmp ende_r
|
7 | relais_an:
|
8 | sbi PORTB,2
|
9 | Ende_r:
|
10 | rjmp Schleife
|
Gerade in Assembler ist der Grat zwischen "zu kompakt" und "gerade noch
lesbar aber doch noch wartbar" sehr schmal. Aber grundsätzlich ist jede
Anweisung eine potentielle Fehlerquelle und je weniger Anweisungen du
hast, desto weniger Fehlerquellen gibt es (daher auch den überflüssigen
Test entfernen. Der bringt nichts ausser der Gefahr die falsche
Testbedingung oder den falschen Pin zu erwischen)