ATmega16 8-Bit Timer Beispiel 2
10. November 2011
Das Beispiel soll die Verwendung eines Timer Compare Interrupts - für einen Treffer beim Vergleich OCR0 mit TCNT0 des 8-Bit Timers Timer0 des ATmega16 - demonstrieren.
Stimmen die beiden Werte (128) in OCR0 und TCNT0 überein, so wird der Interrupt ausgelöst und die ISR ausgeführt. Ansonsten gibt es hier nicht viel zu sagen (siehe auch das erste Timer Beispiel).
.include "m16def.inc"
.LIST
.LISTMAC
.CSEG
rjmp start
.ORG OC0addr ; Nach einem Timer0 Compare springe
rjmp ISR_TIMER0 ; zu dieser ISR und führe sie aus
.ORG $2A
start:
ldi r16, LOW(RAMEND) ; Stack init.
out SPL, r16
ldi r16, HIGH(RAMEND)
out SPH, r16
ser r16
out DDRA, r16
ldi r16, 0
out PORTA, r16
; ldi r16, 1 << CS00 ; Kein Prescale-Wert (nur Systemtakt)
ldi r16, (1 << CS02) | (1 << CS00)
out TCCR0, r16 ; Prescale-Wert 1024 verwenden
ldi r16, 1 << OCF0 ; Timer Compare Flag auf den
out TIFR, r16 ; Wert 1 setzen (Treffer soll
ldi r16, 1 << OCIE0 ; dann einen Timer Compare
out TIMSK, r16 ; Interrupt auslösen
ldi r16, 128
out OCR0, r16
ser r16
out DDRB, r16
sei ; setze das I-Flag in SREG
loop:
nop ; nach 1024 Cycles wird der Wert im
; Timer/Counter0 Register um eins erhöht
; nach ca. 132000 Takten gibt es einen
; Treffer (gleicher Wert in TCNT0 und OCR0)
rjmp loop
ISR_TIMER0:
push r16 ; rette akt. Inhalt von R16 auf Stack
in r16, SREG ; lies akt. Inhalt von SREG ein
push r16 ; und rette diesen auf den Stack
in r16, PORTB ; lies PortB aus
inc r16
out PORTB, r16 ; und schreibe das Resultat wieder an PortB
pop r16
out SREG, r16
pop r16
reti
.EXIT
Stimmen die beiden Werte (128) in OCR0 und TCNT0 überein, so wird der Interrupt ausgelöst und die ISR ausgeführt. Ansonsten gibt es hier nicht viel zu sagen (siehe auch das erste Timer Beispiel).
Kommentare, Ideen oder Vorschläge willkommen!
HILFE
Code-Beispiele werden mit den BBCodes [code][/code] dargestellt.
Jedes Tag muss eine Zeile für sich allein haben, d.h der Beispiel-Code
muss wirklich ZWISCHEN den Tags stehen. Beispiel:
Alles was zwischen den beiden Tags [register] und [/register] eingetragen wird, ist nur für registrierte (und eingeloggte) User sichtbar.
[code] ACHTUNG! HIER UMBRUCH WICHTIG. TAG [code] MUSS ALLEIN STEHEN
#include <stdio.h>
int main( void ){
return 0;
} ACHTUNG! HIER UMBRUCH WICHTIG. NACHFOLGENDES TAG [/code] MUSS ALLEIN STEHEN
[/code]Alles was zwischen den beiden Tags [register] und [/register] eingetragen wird, ist nur für registrierte (und eingeloggte) User sichtbar.
Dein Name *
Deine Email
Deine Website
Vorschau