mikrocontroller.net

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


Autor: Hansi Lein (fabian87)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hansi Lein (fabian87)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hansi Lein (fabian87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
echt? hat sich das zu früheren AT`s geändert?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hansi Lein (fabian87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  ldi    r16,0b00000100
  out    TCCR1B,r16

ne das stimmt ja und lädt den prescaler

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.







Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.