Forum: Mikrocontroller und Digitale Elektronik Timerinterrupt mit tiny15


von Harald Lienert (Gast)


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

von Werner A. (Gast)


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

von Harald Lienert (Gast)


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

von Harald Lienert (Gast)


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

von ...HanneS... (Gast)


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...

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.