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