Code:
;********************************************************************
; Grundlagen - Rollen
; MCU: AT90S8515
; Quarz: 7,37MHz
;********************************************************************
;
.nolist
.include "C:\Programme\AVR Tools\AvrAssembler2\Appnotes\8515def.inc"
.list
;******** Konstanten **********
.equ Teiler = 0x04 ;Teiler=256
;
;Timerwerte für verschiedene Geschwindigkeiten
;.equ Timer_H = 0xfe ;0,01s
;.equ Timer_L = 0xe0
;.equ Timer_H = 0xfa ;0,05s
;.equ Timer_L = 0x61
;.equ Timer_H = 0xf4 ;0,1s
;.equ Timer_L = 0xc1
.equ Timer_H = 0xc7 ;0,5s
.equ Timer_L = 0xc5
;
.equ Bitmuster = 0b10101010
.equ Count_max = 40 ;maximaler Zählwert
.equ Ausgabe = PORTB
;
;******** Variablen (benutzte Register) ********
.def wreg = R16 ;Arbeitsregister
.def Anzeige = R17 ;Bitmuster für Ausgabeport
.def Counter = R18 ;Zähler
;
;********** Interruptvektoren **************
.org 0
rjmp main ;Sprung zum Hauptprogramm
reti ;INT0, externer Interrupt0
reti ;INT1, externer Interrupt1
reti ;TIMER1CAPT, Timer/Counter1 Capture Event
reti ;TIMER1COMPA, Timer/Counter1 Compare Match A
reti ;TIMER1COMPB, Timer/Counter1 Compare Match B
rjmp timer16 ;TIMER1OVF, Timer/Counter1 Overflow
reti ;TIMER0OVF, Timer/Counter0 Overflow
reti ;SPI, Serial Transfer Complete
reti ;UART_RX, UART_RX Complete
reti ;UART_UDRE, UART Data Register Empty
reti ;UART_TX, UART_TX Complete
reti ;ANA_COMP, Analog Comparator
;******* Interruptroutinen *************
timer16:
in wreg,SREG
push wreg
clc ;erst C-Flag löschen
rol Anzeige ;Anzeige weiterschieben
out Ausgabe,Anzeige ;und auf Port ausgeben
dec Counter ;Counter=0?
breq Flag_setzen ;dann T-Flag setzen
ldi wreg,Timer_H ;Timer wieder laden
out TCNT1H,wreg
ldi wreg,Timer_L
out TCNT1L,wreg
;
pop wreg
out SREG,wreg
ende:
reti
;
Flag_setzen:
pop wreg
out SREG,wreg
set ;T-Flag setzen
rjmp ende
;
;******* Hauptprogramm ************
main:
ldi wreg,high(RAMEND)
out SPH,wreg
ldi wreg,low(RAMEND)
out SPL,wreg
ldi wreg,0x00
out TCCR1A,wreg ;Timer1 OC1 + PWM abschalten
ldi wreg,Teiler
out TCCR1B,wreg ;Timer1 prescaling 1/256
ldi wreg,0x80
out TIMSK,wreg ;Timer1 overflow erlauben
ldi wreg,$ff ;Port B Ausgabe
out DDRB,wreg
ldi wreg,Timer_H ;Timer1 bestücken
out TCNT1H,wreg
ldi wreg,Timer_L
out TCNT1L,wreg
sei
;
start:
clt ;T-Flag löschen
ldi Counter,Count_max ;Counter und Anzeige vorbelegen
ldi Anzeige,Bitmuster
;
loop:
brts start ;wenn T-Flag gesetzt ist,dann Neuanfang
rjmp loop
Bei diesem Schnipsel würde man sicher auch ohne Doku durchsehen.
Lesezeichen