;+----------------------------------------------------------------------
;| Title		: Testprogramm für my7-Segment Add-On
;+----------------------------------------------------------------------
;| Funktion		: 
;| Auf jeder Stelle werden beginnend mit dem Dezimalpunkt alle Zahlen
;| von 0 bis 9 im Abstand von 0,5 Sek. ausgegeben.
;| Schaltung	: 
;| PD4 --> Pin 1 von 74LS138 - Stellenauswahl A (0)
;| PD5 --> Pin 2 von 74LS138 - Stellenauswahl B (1)
;| PD6 --> Pin 3 von 74LS138 - Stellenauswahl C (2)
;| PB0 --> Pin 7 von 74HC4511 - Zahlenwert A0
;| PB1 --> Pin 1 von 74HC4511 - Zahlenwert A1
;| PB2 --> Pin 2 von 74HC4511 - Zahlenwert A2
;| PB3 --> Pin 6 von 74HC4511 - Zahlenwert A3
;| PB4 --> an Dezimalpunkt
;+----------------------------------------------------------------------
;| Prozessor	: ATmega8
;| Takt		: 3,6864 MHz
;| Sprache       	: Assembler
;| Datum         	: 28.03.2010
;| Version       	: 1.0
;| Autor         	: Udo John
;+----------------------------------------------------------------------
.include	"AVR.H"
;------------------------------------------------------------------------
;Reset and Interrupt vector             ;Beschreibung
	rjmp	main	;POWER ON RESET
	reti		;Int0-Interrupt
	reti		;Int1-Interrupt
	reti		;TC2 Compare Match
	reti		;TC2 Overflow
	reti		;TC1 Capture
	reti		;TC1 Compare Match A
	reti		;TC1 Compare Match B
	reti		;TC1 Overflow
	reti		;TC0 Overflow
	reti		;SPI, STC Serial Transfer Complete
	reti		;UART Rx Complete
	reti		;UART Data Register Empty
	reti		;UART Tx Complete
	reti		;ADC Conversion Complete
	reti		;EEPROM Ready
	reti		;Analog Comparator
	reti		;TWI (I²C) Serial Interface
	reti		;Store Program Memory Ready
;------------------------------------------------------------------------
;Start, Power ON, Reset
main:	ldi	r16,hi8(RAMEND)
	out	SPH,r16
	ldi	r16,lo8(RAMEND)	;Stack Initialisierung
	out	SPL,r16	;Init Stackpointer
	ldi	r16,0b01110000
	out	DDRD,r16	;PD4...PD6 zur Ausgabe
	ldi	r16,0b00011111
	out	DDRB,r16	;PB0...PB4 zur Ausgabe
;------------------------------------------------------------------------
mainloop:	ldi	r17,0	;Stellenzähler
main1:	swap	r17	;Stelle in oberes Nibble
	out	PORTD,r17	;Stelle ausgeben
	swap	r17	;Stelle in unteres Nibble
	ldi	r16,0x1f
	out	PORTB,r16	;Dezimalpunkt ausgeben
	rcall	zeit	;warte 0,5 Sek.
	ldi	r18,0	;Zahlenwert
main2:	out	PORTB,r18	;Zahlenwert ausgeben
	rcall	zeit	;warte 0,5 Sek.
	inc	r18	;Zahlenwert inkrementieren
	cpi	r18,10
	brlo	main2	;wenn Zahlenwert < 10
	inc	r17	;nächste Stelle
	cpi	r17,6	;Stelle 6 erreicht?
	brlo	main1	;wenn Stelle < 6
	rjmp	mainloop	;sonst von vorne
;------------------------------------------------------------------------
zeit:	push	r16	;R16 zum Stapel
	push	r17	;R17 zum Stapel
	push	r18	;R18 zum Stapel
	lds	r16,SREG	;Hole Flags
	push	r16	;Flag-Register zum Stapel
	ldi	r16,0x64	;Anfangswert für 500ms
zeit1:	ldi	r17,0xc8	;Anfangswert für 5ms
zeit2:	ldi	r18,0x1d	;Anfangswert für 25µs
zeit3:	dec	r18
	brne	zeit3	;solange R18 > 0
	dec	r17
	brne	zeit2	;solange R17 > 0
	dec	r16
	brne	zeit1	;solange R16 > 0
	pop	r16	;hole Zustand der Flags
	sts	SREG,r16	;übertrage ins Flag-Register
	pop	r18	;hole R18 vom Stapel
	pop	r17	;hole R17 vom Stapel
	pop	r16	;hole R16 vom Stapel
	ret		;zurück zum Hauptprogramm
;--------------------------------------------------------------------------
