Forum: Mikrocontroller und Digitale Elektronik TIMER 1 ... am verzweifeln


von Hansi L. (fabian87)


Lesenswert?

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

von Hansi L. (fabian87)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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

von Hansi L. (fabian87)


Lesenswert?

echt? hat sich das zu früheren AT`s geändert?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Hansi L. (fabian87)


Lesenswert?

  ldi    r16,0b00000100
  out    TCCR1B,r16

ne das stimmt ja und lädt den prescaler

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.