Pfad: Home => AVR-Übersicht => Tutorium => Teil 3

; Test 3: Board kennenlernen, Timer im Polling mode


; Was hier Neues zu lernen ist:

; - Timer im Polling modus
; - MOV-Befehl

.NOLIST
.INCLUDE "8515def.inc"
.LIST

; Universalregister definieren


.DEF   mp = R16

; Zähler für Anzahl Nulldurchgänge


.DEF   z1 = R0

; Reset-Vektor auf Adresse 0000


   RJMP   main

; Hauptprogramm beginnt hier


main:   LDI   mp,LOW(RAMEND) ;Initiate Stackpointer (Unterprogramme!)
   OUT   SPL,mp
   LDI   mp,HIGH(RAMEND)
   OUT   SPH,mp

; Software-Zähler-Register auf Null setzen

   LDI   mp,0 ; z1 kann nicht direkt gesetzt werden, da R0
   MOV   z1,mp ; Kopieren von mp in das Register z1

; Vorteiler des Zählers = 1024, 4 MHz/1024 = 3906,25 Hz

; entspricht einem Zählimpuls alle 256 Ás.
   LDI   mp,0x05 ;Initiate Timer/Counter 0 Vorteiler
   OUT   TCCR0,mp ; an Timer 0 Control Register

; Port B ist LED-Port

   LDI   mp,0xFF ; alle Bits als Ausgang
   OUT   DDRB,mp ; in Datenrichtungsregister

; Hauptprogramm-Loop fragt Zähler ab, bis dieser Null erreicht,
; dann wird der Softwarezähler um Eins erhöht und auf den LEDs
; ausgegeben. Das mit einer Frequenz von 15,25878906 Hz der Fall, entsprechend
; alle 65,536 ms.
loop:
   IN   mp,TCNT0
; Inhalt des 8-Bit-Zählers lesen
   CPI   mp,0 ; auf Null testen
   BRNE   loop ; Wenn nicht null, dann wieder loop
   RCALL   IncZ1 ; Unterprogramm Software-Zähler erhöhen
   RCALL   Display ; Unterprogramm Zählerstand ausgeben
warte:   IN   mp,TCNT0 ; Inhalt Zähler 0 lesen
   CPI   mp,0 ; auf Null testen
   BREQ   warte ; Warte bis nicht mehr Null
   RJMP   loop ; Nächste Runde

IncZ1:   INC   z1 ; Erhöhe Software-Zähler
   RET ; Kehre zurück ins Hauptprogramm

Display:
   MOV   mp,z1
; Zählerstand nach mp kopieren
   COM   mp ; Einer-Komplement XOR(FF) wg. Lampen
   OUT   PORTB,mp ; Software-Zählerstand an LEDs
   RET ; Zurück zum Hauptprogramm


©2002 by http://www.avr-asm-tutorial.net