Hallo, bin jetzt schon stundenlang mit dem Timer 1 beschäftigt, aber der löst einfach kein interrupt aus. Als wäre er überhaupt nicht da! Habe folgendes gesetzt: .EQU TIMER_DATA = 3036 .org $05 rjmp TIMER1INTERP ldi r18,HIGH(TIMER_DATA) ldi r17,LOW(TIMER_DATA) out TCNT1H,r18 out TCNT1L,r17 ldi r16,0b00000100 out TCCR1B,r16 in r16,TIMSK ori r16,0b10000000 out TIMSK,r16 sei schlei: rjmp schlei natürlich ist das nicht ganze programm. nur die timerwichtigen daten. Wie gesagt, er startet erst garkeinen Interrupt! Habe sonst noch den AD Wandler im einsatz, jedoch ohne interrupt (sollten sich ja ohnehin nicht in die quere kommen) und lasse über den gesamten D port daten flitzen, aber sollte ja auch unabhängig voneinander arbeiten. Habe einen 4mhz quarz. Könnt ihr mir weiterhelfen? ich weiss echt nicht mehr was ich tun soll! Achja benutze einen atmega8
hmm habs jetzt hingekriegt. Habe das in r16,TIMSK ori r16,0b10000000 out TIMSK,r16 in ldi r16,(1<<toie1) verändert, und siehe da es geht! Was allerdings am ori falsch ist weiss ich nicht wirklich!
TOIE1 ist Bit 2 im Register TIMSK Wieder mal ein Beweis dafür, dass das Benutzen von direkten Bitmasken eigentlich eine konstantes Ärgerniss ist. Schlecht zu lesen, schlecht zu kontrollieren
Zumindest steht es so im Datenblatt. Und das sollte ja wohl stimmen :-) Jetzt weist du auch, warum 0b00000100 (ganz zu schweigen von 0b10000000) Mist ist und (1<<TOIE1) zu bevorzugen ist.
ldi r16,0b00000100 out TCCR1B,r16 ne das stimmt ja und lädt den prescaler
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.