;******************************************************************************
; Verwendete Hardware:
; AVR Testboard Board mit 90S2313 Prozessor
;
; Erstellt: Dezember 2001, Klaus Leidinger
;
; Programm zum Testen der AVR Board Hardware.
; Lauflicht an beiden Ports. Achtung: PortD.7 gibt es nicht ;-)
; 
; Das Timing erfolgt über Interrupts.
;
;******************************************************************************

.include "2313def.inc"	;Festlegen des verwendeten Chips

.def Anzeige=r19
.def temp1=r18
.def result=r16
.def temp=r17 

;Werte für 0,5 sec Timer bei 4MHZ Quarz
;.equ T1Lval=0xee
;.equ T1Hval=0x85
;Werte für 0,5 sec Timer bei 8MHZ Quarz
.equ T1Lval=0xdc	
.equ T1Hval=0x0b

; Start des Programmcodes
.cseg

.org $0000 
	rjmp reset		;Reset extern oder Watchdog
.org $0001 
	reti ;rjmp INT0_int	;Externer Interrupt INT0
.org $0002 
	reti ;rjmp INT1_int	;Externer Interrupt INT1
.org $0003 
	reti ;rjmp Timer1_capt	;Timer 1 capture Mode
.org $0004 
	reti ;rjmp Timer1_comp	;Timer 1 compare Mode
.org $0005 
	rjmp Timer1_over	;Timer 1 overflow
.org $0006 
	reti ;rjmp Timer0_over	;Timer 0 overflow
.org $0007 
	reti ;rjmp UART_rxc	;Serial RX complete Handler
.org $0008 
	reti ;rjmp UART_dre	;Serial UDR empty Handler
.org $0009 
	reti ;rjmp UART_txc	;Serial TX complete Handler
.org $000A 
	reti ;rjmp ANA_comp	;Analog comperator
	
.db "Testprogramm für Microcontroller Board AVR 90S2313 Version 1.0"


;Beginn des Programmcodes

reset:	ldi r16,low(RAMEND)
	out SPL,r16

	ldi r16,0x00
	out TCCR1A,r16  	;Timer 1 disconnect OC1 + PWM
	ldi r16,0x03
	out TCCR1B,r16		;Timer 1 prescaling 1/64
	ldi r16,T1Lval
	out TCNT1L,r16		;Timer low value
	ldi r16,T1Hval
	out TCNT1H,r16		;Timer high value
	ldi r16,0x80
	out TIMSK,r16		;Timer1 overflow enabled
	sei			;Enable global Interrupts
	
        ldi result,$ff          ;Port B -> output
        out DDRB,result
        out DDRD,result		;Port D -> output	

Startprog:
	
	sei		;Enable global Interrupts
;Auswahl ob High oder Low geschoben wird
	ldi Anzeige,$0		;LED on (Low)
	sec			;set Carry (H wird durch die Ports geschoben)
;	ldi Anzeige,$ff		;LED off (High)
;	clc			;clear Carry (L wird durch die Ports geschoben)

loop:	out PORTB,Anzeige
	out PORTD,Anzeige
	rjmp loop		;Timing durch Interrupts
	
			

;Beginn der Unterprogramme und Interruptroutinen
         
Timer1_over:			;Interrupt 500ms
	rol Anzeige		;Zählerstand 
	ldi r16,T1Lval		;Timer reload
	out TCNT1L,r16		;Timer low value
	ldi r16,T1Hval
	out TCNT1H,r16		;Timer high value
	reti

.EXIT ;letzte Zeile des Programmes

