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