;************************************************************
;--------------Lambda-Anzeige mit LEDs---------------
;		    V2.00, 02.07.2002
;
; AVR 90S2313, 8 MHz, externer Oszillator
; Eingang Lambda-Sonde auf PIN B1
; RC-Glied 100k, 10nF oder Trimmer mit 100k
; LEDs an PINS  1  2  3  4  5  6  7  8  9 10
;              B7 D0 D1 B5 B4 D2 D3 D4 D5 D6
;
;      (c) 2001/2002 MDvP                 mailto:MDvP@gmx.de
;************************************************************
; .nolist
.include "2313def.inc"
; .list

.equ	Load	=PB2
.equ	T_low	=PB3
.equ	Fett	=PB6

.def	temp	=r16		; Scratch register
.def	temp1	=r17
.def	result	=r18		; Wandler Ergebnis
.def	Ad	=r20		; Zähler A/D-Wandlungen
.def	c0	=r21		; delay-Zähler
.def	c1	=r22		; dto



.cseg

.org $0000
		rjmp RESET      	;Reset handle
		reti
		reti
		reti
		reti
		reti
		reti
		reti
		reti
		reti
		reti

.db "  Lambda2 2.7.2002 MDvP "
;---------------------------------------
.macro	delay				; 0,125 ms delay @ 8 MHz
	ldi 	c0,@0
d1:	ldi 	c1,249
d2:	nop
	dec 	c1
	brne 	d2
	dec 	c0
	brne 	d1
.endmacro
;---------------------------------------
RESET:		ldi 	temp,low(RAMEND)
		out 	SPL,temp	; Stack-pointer init
		ldi	temp,0b10110100 ; PortB 0,1 Input, Schalter input
		out	DDRB,temp
		ldi	temp,0b11111000 ; PortB LEDs aus, Schalter PullUp
		out	PORTB,temp
		ser 	temp
		out	DDRD,temp	; PortD als Ausgang
		out	PORTD,temp	; PortD LEDs aus
		ldi	temp,0b00001110	; Watchdog 1 s
		out	WDTCR,temp
		clr     temp1   	; Dieses Regsiter bleibt NULL
		out     ACSR,temp1	; Komparator an
		out     TIMSK,temp1	; Timer aus
;----------------------------------------------------------------
Main:		wdr			; Watchdog reset
		clr	xl		; Summenregister löschen
		clr	xh
		ldi	Ad,128		; 128 mal integrieren
L0:		delay	16		; 2 ms delay
		clr	result
		sbi     PORTB,Load      ; Kondensator laden
Wait:		nop			; Schleife mit 8 Takten
		nop			; Bei 100k-Trimmer ein oder zwei
		nop			; nops entfernen für kürzeren Zähltakt
		sbic	ACSR,ACO	; Wenn Komparator
		rjmp	Ready		; dann fertig
		inc	result		; Wenn kein Überlauf
		brne	Wait		; Schleife
		dec	result
Ready:		cbi     PORTB,Load      ; Kondensator entladen
		add	xl,result	; Ergebnis addieren
		adc	xh,temp1	; dummy (0)
		dec	Ad		; Integrationszähler
		brne	L0		; Fertig?
		lsl	xl		; Summe *2
		rol	xh		; der Mittelwert ist nun in xh
		brne	L1		; Wenn Null
		inc	xh		; Dann erhöhen
L1:		ldi	zl,low(2*Daten)	; Basis-Adresse für
		ldi	zh,high(2*Daten); Vergleichsdaten (Dotgraph)
;		ldi	zl,low(2*BarDat); Basis-Adresse für
;		ldi	zh,high(2*BarDat); Vergleichsdaten (Bargraph)
		sbis	PINB,Fett	; Wenn Fett-PIN auf Masse
		adiw	zl,20		; nächsten Datensatz wählen (Dot)
;		adiw	zl,10		; nächsten Datensatz wählen (Bar)
		sbis	PINB,T_low	; Wenn 650°C-PIN auf Masse
		adiw	zl,40		; Datensatz wählen (Dot)
;		adiw	zl,20		; Datensatz wählen (Bar)
		ser	c0		; Zähler reset
L2:		lpm			; Daten lesen
		adiw	zl,1		; Nächstes Datum
		inc	c0		; Zähler erhöhen
		cp	xh,r0		; Vergleichen
		brlo	L2		; Weiter
		lsl	c0		; Zähler *2
		ldi	zl,low(2*LEDs)	; Basis-Adresse
		ldi	zh,high(2*LEDs)	; für LED-Steuerdaten (Dot)
;		ldi	zl,low(2*BAR)	; Basis-Adresse
;		ldi	zh,high(2*BAR)	; für LED-Steuerdaten (Bar)
		add	zl,c0		; Daten Adresse berechnen
		adc	zh,temp1	; dummy (0)
		lpm			; LED-Daten lesen (PortB)
		mov	yl,r0		; sichern
		adiw	zl,1		; Nächstes Datum
		lpm			; LED-Daten lesen (PortD)
		mov	yh,r0		; sichern
		out	PORTB,yl	; Ausgabe Port B
		out	PORTD,yh	; Ausgabe Port D
		rjmp	Main		; Schleife
		
;--LED-Daten----------------------------------------
Daten:

; LED Schwellwerte für Dotgraph-Anzeige (normalmode 815°C)
; Lambda = 0,75 - 1,2 in 0,05 Schritten
.db 218,212,207,201,196,190,185,179,170,136, 88, 68, 55, 43, 34, 26, 18, 11,  0,  0

; LED Schwellwerte für Dotgraph-Anzeige (fettmode 815°C)
; Lambda = 0,775 - 1,0 in 0,025 Schritten
.db 214,211,208,205,203,200,197,194,192,189,186,183,180,178,173,165,149,124,  0,  0

; LED Schwellwerte für Dotgraph-Anzeige (normalmode 650°C)
; Lambda = 0,75 - 1,2 in 0,05 Schritten
.db 249,240,231,222,213,204,194,184,170,142, 93, 72, 57, 45, 35, 27, 19, 11,  0,  0

; LED Schwellwerte für Dotgraph-Anzeige (fettmode 650°C)
; Lambda = 0,775 - 1,0 in 0,025 Schritten
.db 243,238,233,228,224,219,215,211,206,202,197,192,187,181,174,165,153,125,  0,  0

LEDs:
; LED Steuerdaten für Dot-Anzeige
.db 0b01111000,0b11111111	; LED1
.db 0b01111000,0b11111110	; LED1/2
.db 0b11111000,0b11111110	; LED2
.db 0b11111000,0b11111100	; LED2/3
.db 0b11111000,0b11111101	; LED3
.db 0b11011000,0b11111101	; LED3/4
.db 0b11011000,0b11111111	; LED4
.db 0b11001000,0b11111111	; LED4/5
.db 0b11101000,0b11111111	; LED5
.db 0b11101000,0b11111011	; LED5/6
.db 0b11111000,0b11111011	; LED6
.db 0b11111000,0b11110011	; LED6/7
.db 0b11111000,0b11110111	; LED7
.db 0b11111000,0b11100111	; LED7/8
.db 0b11111000,0b11101111	; LED8
.db 0b11111000,0b11001111	; LED8/9
.db 0b11111000,0b11011111	; LED9
.db 0b11111000,0b10011111	; LED9/10
.db 0b11111000,0b10111111	; LED10
.db 0b11111000,0b10111111	; LED10

BarDaten:

; LED Schwellwerte für Bargraph-Anzeige (normalmode 815°C)
; Lambda = 0,75 - 1,2 in 0,1 Schritten
;Nr  0   1   2   3   4   5   6   7   8   9  
.db 214,203,192,181,157, 75, 48, 29, 13, 0


; LED Schwellwerte für Bargraph-Anzeige (fettmode 815°C)
; Lambda = 0,775 - 1,0 in 0,05 Schritten
;Nr  0   1   2   3   4   5   6   7   8   9  
.db 218,212,207,201,196,190,185,179,170, 0

; LED Schwellwerte für Bargraph-Anzeige (normalmode 650°C)
; Lambda = 0,75 - 1,2 in 0,1 Schritten
;Nr  0   1   2   3   4   5   6   7   8   9  
.db 246,226,208,189,160, 82, 51, 31, 15, 0


; LED Schwellwerte für Bargraph-Anzeige (fettmode 650°C)
; Lambda = 0,775 - 1,0 in 0,05 Schritten
;Nr  0   1   2   3   4   5   6   7   8   9  
.db 249,240,231,222,213,204,194,184,170, 0


BAR:
; LED Steuerdaten für Bargraph-Anzeige
.db 0b01111000,0b11111111	; LED1
.db 0b01111000,0b11111110	; LED2
.db 0b01111000,0b11111100	; LED3
.db 0b01011000,0b11111100	; LED4
.db 0b01001000,0b11111100	; LED5
.db 0b01001000,0b11111000	; LED6
.db 0b01001000,0b11110000	; LED7
.db 0b01001000,0b11100000	; LED8
.db 0b01001000,0b11000000	; LED9
.db 0b01001000,0b10000000	; LED10
.db 0b01001000,0b10000000	; LED10
