mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timerinterrupt mit tiny15


Autor: Harald Lienert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

kann mir vielleicht irgend jemand sagen, wie ich es hinbekomme, das
mein avr einen Timerinterrupt auslöst?

Konkret:
ich möchte nach bestimmter Zeit Int-Serviceroutine anspringen.
Theoretisch ist ja alles klar, ich weiß nur nicht wie ichs dem AVR
sagen soll:

1. Interrupt Enable für Timer1
2. Festlegen der ISR Adresse (z.B. T1_INT:)
3. Laden des TCCR1 mit 0b10001101 (1/256)
4. Laden des Compare Registers OCR1A

So, und nun soll er einfach bei Comparematch den Int auslösen
Aber wie?? Bitte ASM

Hier ein Codeschnipsel:

RESET:

ldi  Temp, 0b10001101  ;1/256
out TCCR1, Temp

ldi  Temp, 0xf0  ;Compare register
out OCR1A, Temp

LOOP:
...
RJMP LOOP

T1_INT:
...
RETI

Autor: Werner A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du den ganzen Code geschickt hättest, hätte man auch "Fehler"
suchen können, aber so musst Du halt vergleichen ;-)

--------
.include "tn15def.inc"    ;

;Konstanten für Register
.def temp  = r16
.def temp2 = r17

.ORG  0x00
  rjmp RESET      ;Reset Interrupt
  rjmp EXT_INT0    ;Externer Interupt
  rjmp PIN_CHANGE    ;Pin Change
  rjmp TIM1_CMP    ;Timer Compare 1
  rjmp TIM1_OVF    ;Timer Overflow 1
  rjmp TIM0_OVF    ;Timer Overflow 0
  rjmp EE_RDY      ;EEprom ready
  rjmp ANA_COMP    ;Analog Compare
  rjmp ADC0      ;ADC


;hier nicht benötige Interupts
EXT_INT0:
PIN_CHANGE:
;TIM1_CMP:
;TIM1_OVF:
TIM0_OVF:
EE_RDY:
ANA_COMP:
ADC0:
  reti

RESET:
  ldi temp, (1<<CS10)|(1<<CS13)  ;Clock/16
  out TCCR1, temp

  ldi temp, (1<<DDB0)|(1<<DDB1)  ;PB.0/1 = Ausgang
      out DDRB, temp

  ldi temp, (1<<OCIE1)| (1<<TOIE1)
;Interupt TimerOverflow/TimerCompare aktivieren
  out TIMSK, temp
  sei                   ;Interrupts allgemein aktivieren


loop:
  in temp, PINB        ;Taste einlesen
  sbrc temp, 2            ;Taste gedrückt?
  rjmp _zaehl1

  ldi timer_compare, 0x00    ;niedriger TimerCompare Wert

  rjmp _zaehl_ende
_zaehl1:
  ldi timer_compare, 0xF0    ;hoher TimerCompare Wert

_zaehl_ende:
  out OCR1A, timer_compare

  rjmp loop               ; Endlosschleife

TIM1_CMP:
  sbi PORTB, 1    ;beim Timeroverflow LED aus
  reti


TIM1_OVF:
  cbi PORTB, 1    ;Bei erreichen der Zählgrenze LED an
  reti

Autor: Harald Lienert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort, ich habe aber noch einige Unklarheiten:

Was lade ich in das Temp-Register?

Kannst du mit vielleicht sagen was es mit den 1<< auf sich hat?

ldi temp, (1<<CS10)|(1<<CS13)  ;Clock/16
out TCCR1, temp

ldi temp, (1<<DDB0)|(1<<DDB1)  ;PB.0/1 = Ausgang
out DDRB, temp

ldi temp, (1<<OCIE1)| (1<<TOIE1)
out TIMSK, temp

Autor: Harald Lienert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort,

ich habe aber da noch eine Frage:

was bedeutet das 1<<??



ldi temp, (1<<CS10)|(1<<CS13)  ;Clock/16
out TCCR1, temp

ldi temp, (1<<DDB0)|(1<<DDB1)  ;PB.0/1 = Ausgang
out DDRB, temp

ldi temp, (1<<OCIE1)| (1<<TOIE1)
out TIMSK, temp

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi...

Der Operator << bedeutet linksschieben.
1<<4 bedeutet, dass eine 1 4 mal nach links geschoben wird und damit 16
ergibt.

Diese Darstellung wird benutzt, weil sie beim Setzen einzelner Bits in
Steuerregistern (z.B. TIMSK für Timer) mehr Übersicht bietet, denn die
Bits in den Steuerregister haben Namen (siehe Datenblatt), die
aussagekräftiger sind als ihre Bitposition.

| ist der Operator für bitweises Oder. Damit werden mehrere Bits
zusammengefasst.

ldi temp, (1<<OCIE1)| (1<<TOIE1)
bedeutet demnach, dass eine 1 um OCIE1 nach links geschoben wird geORT
mit einer 1, die um TOIE1 nach links geschoben wird. Vereinfacht gesagt
wurden die Bits OCIE1 und TOIE1 gesetzt, alle anderen Bits gelöscht.

Dies ist bedeuten aussagekräftiger als das Setzen irgendeines
Hex-Wertes, dessen Inhalt man nur über das Datenblatt erfährt. Im Laufe
der Zeit prägt man sich die von ATMEL definierten Symbolnamen für
I/O-Register und deren Bits aber ein...

Bit- & Bytebruch... - ...HanneS...

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.