Das hier:
> in r16,TIMSK
> ori r16,0b10000000
> out TIMSK,r16
stimmt nicht.
Das setzt nicht das TOIE1 Bit!
Das TOIE1 Bit würde gesetzt mit
in r16,TIMSK
ori r16,0b00000100
out TIMSK,r16
oder aber wie du schon rausgefunden hast, so
in r16,TIMSK
ori r16,(1<<TOIE1)
out TIMSK,r16
Schau doch mal ins Datenblatt, welches Bit TOIE1 tatsächlich
ist. 0b1000000 ist es nicht.
Und wenn du beide Versionen vergleichst, dann stellst du fest,
dass in der ersten Version ohne Datenblatt noch nicht mal klar
ist was den 0b00000100 eigentlich macht, während zumindest diese
Information bei Version 2 im Source Code enthalten ist. Daher
ist die erste Version Mist und die zweite um einiges besser.
Selbiges für den Prescaler:
ldi r16,0b00000100
out TCCR1B,r16
Welches Bit wird denn gesetzt?
ldi r16, (1<<CS12)
out TCCR1B,r16
OK. Das sagt einem ohne Blick in das Datenblatt noch nicht
worauf der Prescaler gesetzt wird. Aber zumindest sagt es
mir, dass ich einigermassen richtig bin, denn die CSxx Bits
sind für den Prescaler zuständig. Weiters sagt es mir, dass
ich mit CS1x zumindest mal an den Prescaler Bits für den
Timer 1 dran bin. Und vielleicht hab ich mir auch noch
die Reihenfolge der Prescaler Abstufungen gemerkt und weiss
daher noch, das CS12 alleine den Perscaler auf 256 setzt.
All das ist Information, die für mich als Programmierer in
ldi r16,0b00000100
nicht enthalten ist. Wenn ich wissen will was 0b00000100 auf
einem bestimmen Prozessor bewirkt, muss ich ins Datenblatt
schauen und Bits vergleichen. Erst dann kann ich weitere
Schlussfolgerungen ziehen.
Das Problem ist: Der µC macht keine Fehler. Der Programmierer
schon. Der Programmierer schreibt auch mal 0b10000000 wenn er
eigentlich 0b00000100 schreiben wollte, weil er das TOIE1
setzen wollte. Der Programmierer sollte sich angewöhnen auch
TOIE1 zu schreiben, wenn er TOIE1 meint und nicht 0b00000100,
auch wenn beides für den µC auf dasselbe hinauskommt. Wie
gesagt: der µC macht keine Fehler, der Programmierer schon.