/*
		*************************************************************************************
		*	Thermometer mit Tsic306															*
		*	-----------------------															*
		*																					*
		*	Da die Anzeige nur 3 stellig ist, werden Temperaturen von -9.9 bis +99,9 mit	*
		*	einer Auflösung von 0,1 °C angezeigt. Bei -50 bis -10 Grad und 100 bis 150 Grad	*
		*	beträgt die Auflösung 1 °C.														*
		*	Ein nicht (oder falsch) angeschlossener Sensor, wird im Display als "S-E" 		*
		*	(Sensor Error) angezeigt. Paritätsfehler z.B. durch zu lange Kabel, werden	*
		*	in Display als "P-E" (Parity Error) angezeigt									*
		*																					*
		*	Hardware: 																		*
		*	Portview-Modul mit AT-Mega8/48 http://www.avr-projekte.de/portview.htm			*
		*	Dezimalpunkt über 120R an PC5													*
		*	TSIC Daten an PC0																*
		*	TSIC VCC (Sensor Ein) an PC1													*
		*																					*
		*	Version vom 19.11.2011 															*
		*																					*
		*	Autor: J.Woetzel / juergen@avr-projekte.de										*
		*************************************************************************************
*/
;.list
;-------------------------------------------------------------------------------------------------------														
#define mega48				;Einen der beiden AVRs auskommentieren
;#define mega8
;-------------------------------------------------------------------------------------------------------														
#if defined mega48
#include "m48def.inc"
#endif
;-------------------------------------------------------------------------------------------------------
#if defined mega8
#include "m8def.inc"
#endif
;-------------------------------------------------------------------------------------------------------
;Register
;---------------------
.def	null	=	r0		;Konstante
.def	s		=	r1		;S-Register
.def	tick	=	r2		;ISR Counter
.def	chr1	=	r3		;4* Zwischenspeicher für 7-Segm.
.def	chr2	=	r4
.def	chr3	=	r5
.def	chr4	=	r6
.def	pnp1	=	r7		;Konstanten zum schnelleren schalten der
.def	pnp2	=	r8		;PNPs in der ISR
.def	pnp3	=	r9
.def	temp1	=	r16		;Trash       
.def	temp2	=	r17
.def	temp3	=	r18
.def	temp4	=	r19
.def	seg0	=	r20		;7Seg. Anzeige, Hunderter
.def	seg1	=	r21		;Zehner
.def	seg2	=	r22		;Einer
.def	rawlow	=	r24		;Rohwerte TSIC
.def	rawhigh	=	r25       
;----------------------
.def	flags	=	r23		;Programmflags
;----------------------		;Die einzelnen Bits 
.equ	minus	=	0		;Minusgrade
.equ	par_err	=	1		;Paritätsfehler
.equ	nc_err	=	7		;Kein Sensor
;-----------------------
.equ	tsic_dat	= 0		;TSIC Datenleitung an PortC0
.equ	tsic_vcc	= 1		;TSIC Versorgungsspannung an PortC1
.equ	DP			= 5		;Dezimalpunkt an PortC5
;*************************************************************************************************
;AVR Sprungvektoren
;*************************************************************************************************
	.org 0
	rjmp	reset
	.org	OC1Aaddr
	rjmp	isr
;***************************************************************************************************************														
;										Init
;***************************************************************************************************************
reset:
	;-------------------------------------
	;Stackinit, nur Mega8 (macht der Mega48 alleine)
	;-------------------------------------
	#if defined mega8
		ldi		temp1, LOW(RAMEND)	
		out		SPL, temp1
		ldi		temp1, HIGH(RAMEND)
		out		SPH, temp1
	#endif
	;-------------------------------------
	;Ports init
	;-------------------------------------
		ldi		temp1,1<<tsic_vcc|1<<DP	;VCC|Dezimalpunkt = Ausgang
		out		ddrc,temp1
;		sbi		portc,1<<tsic_dat		;Pullup
		ldi		temp1,0b11100000
		out		ddrd,temp1				;gem. Anoden = Ausgang
		out		portd,temp1				;gem. Anoden Aus
		ldi		temp1,$ff
		out		ddrb,temp1				;Segmente (Kathoden) Ausgang
		out		portb,temp1
	;-------------------------------------
	;Timer1 Interrupt (CTC) und Watchdog anwerfen
	;-------------------------------------
	#if defined mega48
		;-------------------
		;Mega48 Timer
		;-------------------
		ldi		temp1,high(8000-1)		;Vergleichswert =8000 ergibt
		sts		OCR1AH,temp1			;bei 8MHz genau 1000Hz (ISR alle 1mS)
		ldi		temp1,low(8000-1)
		sts		OCR1AL,temp1
		ldi		temp1,1<<WGM12|1<<CS10	;Prescaler=1 Timer Compare ein	
		sts		tccr1b,temp1
		ldi		temp1,1<<ocie1a			;Interrupt bei Timer Compare ein
		sts		TIMSK1,temp1
		;-------------------
		;Watchdog
		;-------------------
		wdr
		lds temp1, WDTCSR
		ori temp1, (1<<WDCE) | (1<<WDE)	;Prescaler Bits ändern|Watchdog System Reset
		sts WDTCSR, temp1
		ldi temp1, (1<<WDE) | (1<<WDP2) | (1<<WDP0);Watchdog System Reset||Reset in 0,5 Sek.
		sts WDTCSR, temp1
	#else
		;-------------------
		;Mega8 Timer
		;-------------------
		ldi		temp1,high(8000-1)		;Vergleichswert =8000 ergibt
		out		OCR1AH,temp1			;bei 8MHz genau 1000Hz (ISR alle 1mS)
		ldi		temp1,low(8000-1)
		out		OCR1AL,temp1
		ldi		temp1,1<<WGM12|1<<CS10	;Prescaler=1 Timer Compare ein	
		out		tccr1b,temp1
		ldi		temp1,1<<ocie1a			;Interrupt bei Timer Compare ein
		out		TIMSK,temp1
		;---------------------------------------------------------------------
		;Watchdog Init
		;-------------------
		;Wenn kein (oder falsch) Sensor angeschlossen ist würde das Programm
		;ewig den Datenpin des TSIC abfragen
		;---------------------------------------------------------------------
		wdr
		lds temp1, WDTCR
		ori temp1, (1<<WDCE) | (1<<WDE)	;Prescaler Bits ändern|Watchdog System Reset
		out WDTCR, temp1
		ldi temp1, (1<<WDE) | (1<<WDP2) | (1<<WDP0);Watchdog System Reset||Reset in 0,52 Sek.
		out WDTCR, temp1
	#endif			
	;-------------------------------------
	;Programmvariable init
	;-------------------------------------
		;Werte zum schalten der PNPs in der ISR. Als Konstante laden um Zeit zu sparen
		ldi		temp1,1<<pd5|1<<pd6		;PNP Transistor, gem. Anode, Stelle 1, Einschalten (PD7=0)
		mov		pnp1,temp1
		ldi		temp1,1<<pd5|1<<pd7		;PNP Transistor, gem. Anode, Stelle 2, Einschalten (PD6=0)
		mov		pnp2,temp1
		ldi		temp1,1<<pd6|1<<pd7		;PNP Transistor, gem. Anode, Stelle 3, Einschalten (PD5=0)
		mov		pnp3,temp1
		clr		null					;Konstante 0
		clr		flags					;Programmflags
		sei								;ISR Los	

		in		temp1,MCUSR				;Watchdog oder Powerup Reset?
		sbrc	temp1,WDRF				;Wenn Watchdogreset, Sprung in Fehlerroutine
		rjmp	No_TSIC
;**********************************************************************************														
;										Hauptschleife
;**********************************************************************************
main:	rcall	gettemp
		rcall	wait05
		rjmp	main
;***********************************************************************************														
;										Unterprg.
;***********************************************************************************
;-----------------------------------------------------------------
;Warten
;-----------------------------------------------------------------
wait1s:
		rcall	wait				;1 Sekunde warten
		rcall	wait
wait05:	rcall	wait				;0,5 Sekunden warten
wait:	wdr
		ldi		temp1,250			;250 mS in der ISR herunterzählen
wt1:	mov		tick,temp1
wt:		tst		tick
		brne	wt
		ret
;------------------------------------------------------------------------------
;TSic - Fehler
;------------------------------------------------------------------------------
	;---------------	
	;Sensor Fehler	
	;---------------	
No_Tsic:
		wdr
		cbi		PortC,TSic_VCC		;TSic aus
		sbi		PortC,DP			;DP aus
		ldi		seg0,_S				;Gibt "S-E" für Sensor Fehler aus 
		ldi		seg1,g_				;Segment g = Minuszeichen
		ldi		seg2,_E
		rjmp	main
	;---------------	
	;Paritäts Fehler	
	;---------------	
TSIC_error:
		cbi		PortC,TSic_VCC		;TSic aus
		sbi		PortC,DP			;DP aus
		ldi		seg0,_P				;Gibt "P-E" für Parity Fehler aus
		ldi		seg1,g_
		ldi		seg2,_E
		;neuer Versuch
;**********************************************************************************
;						  --- Thermometer ---
;**********************************************************************************
;-----------------------------------------------------------------
;Temperatur auslesen und aufs LED
;-----------------------------------------------------------------
gettemp:cbr		flags,1<<par_err|1<<minus	;Parity-Fehlerflag und Minus-Flag löschen
		sbi		portc,tsic_vcc		;TSic einschalten
wh:		sbis	pinc,tsic_dat		;High auf der Datenleitung abwarten
		rjmp	wh
		;-----------------------------------------
		;Messdaten holen
		;-----------------------------------------
mes:	rcall	TSIC_byte			;High Byte vom TSIC holen
		mov		rawhigh,temp3
		rcall	TSIC_byte			;Low
		mov		rawlow,temp3
		cbi		portc,tsic_vcc		;TSic abschalten
		sbrc	flags,par_err		;Parityflag testen
		rjmp	TSIC_error			;Bei Paritätsfehler, Sprung
		rjmp	calctemp			;Aus den TSIC Rohwerten die Temperatur berechnen und ausgeben

;-----------------------------------------------------------------
;Datenbyte vom TSic lesen
;-----------------------------------------------------------------
/*
Der TSic306/206 sendet 2 Bytes der den 11Bit Temperaturwert enthält.
Jedes Byte beginnt mit einem Startbit, dann folgen 8 Datenbits und am
Ende folgt noch ein Paritybit.
*/
TSIC_byte:
		clr		temp4				;Parity
		ldi		temp3,1				;Hier kommt das Datenbyte des TSIC rein	
		rcall	TStrobe_time		;Wie lange ist PinC0 (Daten TSic) low ?
w_msb:	lsl		temp3				;Eine 0 ins DatenByte schieben
		rcall	Wait_TStrobe		;TStrobe Zeit abwarten
		sbic	PinC,tsic_dat		;Wenn Tsic Datenpin auf low, die Null (lsl oben) stehen lassen				
		inc		temp3				;Ansonsten Bit setzen
		sbrc	temp3,0				;Wenn Bit auf 1...
		inc		temp4				;...zum Paritybyte addieren
wh0:	sbis	pinc,tsic_dat		;Auf High warten
		rjmp	wh0
		brcc	w_msb				;Wenn die 1 (oben, ldi temp3,1)im Carry ist, sind wir fertig
		;-----------------------------------------------------------------
		;Paritätsbit holen und auf even prüfen
		;Bei Even Parity, muss die Summe aller Bits + das Paritybit gerade sein
		;-----------------------------------------------------------------	
		rcall	Wait_TStrobe		;TStrobe Zeit abwarten
		sbic	pinc,tsic_dat
		inc		temp4				;Wenn Paritybit=1, Temp4=Temp4+1
		sbrc	temp4,0				;Zahl in Temp4 muss gerade (even Parity) sein
		sbr		flags,1<<par_err	;sonst Übertragungsfehler
wh1:	sbis	pinc,tsic_dat		;Auf High warten
		rjmp	wh1
		ret
#if defined mega48
			;---------------------------------------------------------------------
			;T-Strobe Zeit (etwa 62,5 µS) messen.
			;Hier für den Mega48 mit dem 8-Bit Timer/Counter0 (Compare A Match)
			;---------------------------------------------------------------------
			;Da sich T-Strobe mit der Temperatur ändert, bei jedem Byte neu messen
			;---------------------------------------------------------------------
TStrobe_time:
			out		TCNT0,null			;8Bit Timer0, Zähler=0
			ldi		temp2,1<<CS01		;Prescaler /8 vorbereiten
wdl:		sbic	PinC,tsic_dat		;Auf TSIC, neg. Flanke warten
			rjmp	wdl
			out		TCCR0B,temp2		;Timer Los
wpc:		sbis	PinC,tsic_dat		;Solange warten, bis die Datenleitung wieder High wird
			rjmp	wpc
			out		TCCR0B,null			;Timer Stop
			in		temp2,TCNT0			;Zählerstand holen...
			out		OCR0A,temp2			;...und in das Timer Vergleichsregister A schreiben
			ret
		;-----------------------------------------------------------------
		;Die oben gemessene Zeit abwarten
		;-----------------------------------------------------------------
Wait_TStrobe:
			sbi		TIFR0,OCF0A			;Vergleichsflag A löschen
			out		TCNT0,null			;Zähler=0
			ldi		temp2,1<<CS01		;Vorteiler /8 vorbereiten
wstr:		sbic	PinC,tsic_dat		;Auf neg. Flanke warten
			rjmp	wstr
			out		TCCR0B,temp2		;Timer Los
wt0:		sbis	TIFR0,OCF0A			;Auf Match warten
			rjmp	wt0
			out		TCCR0B,null			;Timer Stop
			ret
#endif
#if defined mega8
		;----------------------------------------------------------------------
		;Der Mega8 könnte das auch mit dem Timer, hier werden einfach Zyklen 
		;gezählt. 
		;----------------------------------------------------------------------
TStrobe_time:
			ldi		temp1,0
wsb:		sbic	pinc,tsic_dat		;Auf neg. Flanke warten
			rjmp	wsb
s_time:		inc		temp1				;1 Zyklen
			sbis	pinc,tsic_dat		;1 / bei skip 2
			rjmp	s_time				;2
			ret
		;-----------------------------------------------------------------
		;Die oben gemessene Zeit abwarten
		;-----------------------------------------------------------------
Wait_TStrobe:
			mov		temp2,temp1			;TStrobe -> Temp2
wst:		sbic	pinc,tsic_dat		;Auf neg. Flanke warten
			rjmp	wst
W_ST1:		nop							;1 Zyklen
			dec		temp2				;1
			brne	W_ST1				;2 / ohne Sprung 1
			ret
	#endif
;***************************************************************************************
;	11Bit Rohwert des TSic in Temperatur umrechnen
;***************************************************************************************
calctemp:
;---------------------------------------------------------------------------------------
;Werte lt. Datenblatt 
;$000=-50°, $199=-10°, $200=0°, $2ff=25°, $465=60°, $6fe=125°, $7ff=150°	
;---------------------------------------------------------------------------------------
;Wert   Formel-Datenbl.	  Meine Formel ... nach Anpassung 	Soll	
;---------------------------------------------------------------------------------------
;$199	|	-10,04		|	-10,06		|  	   -10,0	|	 -10,0					
;$200 	|	  0,02 		|	  0,00 		|		 0,0	|	   0,0		
;$2ff	|	 24,94		|	 24,90		|		25,0	|	  25,0		
;$465	|	 59,92		|	 59,86		|		60,0	|	  60,0		
;$6fe	|	124,89		|	124,80		|	   125,0	|	 125,0									
;$7ff	|	150,00		|	149,90		|	   150,1	|	 150,0		
;---------------------------------------------------------------------------------------
;Zum testen der Werte, die Auskommentierung unten entfernen
;---------------------------------------------------------------------------------------
/*
		.equ	test = $2ff
		ldi	rawlow,low(test)
		ldi	rawhigh,high(test)
*/
;---------------------------------------------------------
;Tsic Rohwert dem Soll (Tab. oben) lt. Datenblatt anpassen
;---------------------------------------------------------
;Dazu die beiden höchsten Bits (Bit10 und 9) des TSIC auswerten
;Bei TSIC Wert $000..$1ff keine Änderung	
;Bei TSIC Wert $200..3ff TSIC Wert+1
;Bei TSIC Wert $400..5ff TSIC Wert+2
;Bei TSIC Wert $600..7ff TSIC Wert+3
;--------------------------------------------------------------
		sbrc	rawhigh,1
		adiw	rawlow:rawhigh,1		;Wenn Bit9=1, Tsic+1
		sbrc	rawhigh,2
		adiw	rawlow:rawhigh,2		;Wenn Bit10=1, Tsic+2
;---------------------------------------------------------------------------------------
;	11Bit Rohwert des TSic in Temperatur umrechnen
;	Originalformel aus dem Datenblatt T= (Digital_signal/2047*(HT-LT)+LT) [°C]
;	LT = -50,  HT = 150 als Standardwert für die Temperatur-Berechnung
;
;	Umgestellt für ASM
;	t=TSic_Wert*200 /2048-50   (die 2047 um 1 erhöht um besser rechnen zu können)
;	t=TSic_Wert*25/256-50  (gekürzt /8)
;	Da eine Stelle hinter dem Komma angezeigt wird, rechne ich die Temperatur*10 und setze
;	vor die letzte Stelle den Dezimalpunkt (Festkomma).
;
;	Temperatur*10=(TSic_Wert*250)/256-500
;---------------------------------------------------------------------------------------
		clr		temp1			;temp3/2/1 enthält durch zufügen von Temp1 (0) den TSicwert * 256
		mov		temp2,rawlow
		mov		temp3,rawhigh
		lsl		rawlow			;*2
		rol		rawhigh
		add		rawlow,temp2	;*3
		adc		rawhigh,temp3
		lsl		rawlow			;*6
		rol		rawhigh
		sub		temp1,rawlow	;*256 - *6 = *250
		sbc		temp2,rawhigh	;TSic_Wert*250 steht jetzt in temp1/temp2/temp3
		sbci	temp3,0			;Durch verwerfen des LSB (temp1) wird durch 256 geteilt	
		subi	temp2,low(500)	;500 (50.0) abziehen
		sbci	temp3,high(500)
	;Nun steht die Temperatur(*10) in temp2 (low) und temp3 (high)
	;-------------------------------------------------------------------------------
	;Ausgabe auf LED-Display. 
	;-------------------------------------------------------------------------------
		brpl	pos
		sbr		flags,1<<minus		;Wir haben Minusgrade (das merken wir uns)
		com		temp3				;16Bit negativ -> positiv wandeln (2er Komplement)
		neg		temp2
		sbci	temp3,-1
	;-------------------------------------------------------------------------------
	;16Bitwert in einzelne (Dezimal) Ziffern zerlegen 
	;-------------------------------------------------------------------------------
pos:	ldi		temp1,-1			;1000er = -1
sub1000:inc		temp1				;1000er = +1
		subi	temp2,low(1000)		;TSicwert-1000
		sbci	temp3,high(1000)
		brcc	sub1000				;Solange 1000 abziehen bis Unterlauf
		mov		chr4,temp1			;1000er wegspeichern

		ldi		temp1,10			;100er = 10
add100:	dec		temp1				;100er - 1
		subi	temp2,low(-100)		;TSicwert +100
		sbci	temp3,high(-100)
		brcs	add100				;Solange +100 bis Überlauf
		mov		chr3,temp1			;Zehner

		ldi		temp1,-1
sub10:	inc		temp1
		subi	temp2,10			;-10
		brcc	sub10
		subi	temp2,-10
		mov		chr2,temp1			;Einer
		mov		chr1, temp2			;Rest = 10tel
	;-------------------------------------------------------------------------------
	;Je nach Wert, den Passenden String für das nur 3-Stellige LED Display bilden
	;Mögliche Ausgaben:
	;------------------
	;10.0 ... 99.9 Grad, DP ein, Auflösung 0,1 Grad
	; 100 ... 150  Grad, DP aus, Auflösung 1   Grad
	; 0.0 ... 9.9  Grad, DP ein, Auflösung 0,1 Grad, 1. Anzeige Dunkel
	;-0.0 ... -9.9 Grad, DP ein, Auflösung 0,1 Grad, 1. Anzeige zeigt "-"
	; -10 ... -50  Grad, DP aus, Auflösung 1   Grad, 1. Anzeige zeigt "-"
	;-------------------------------------------------------------------------------
		sbrc	flags,minus		;Wenn Minusgrade, Sprung
		rjmp	ngt
		tst		chr4			;Wenn >99.9 Grad, Sprung
		brne	gr100
		tst		chr3			;Wenn 10.0 ... 99.9, Sprung
		brne	_10bis	
	;------------------
	; 0.0 ... 9.9  Grad
	;------------------
		cbi		portc,5			;DP ein
		ldi		seg0,$ff		;Leerzeichen in 1. Stelle
		rjmp	rest			;Stelle 2 und 3 ausgeben
	;------------------
	;10.0 ... 99.9 Grad
	;------------------
_10bis:	cbi		portc,5			;DP ein
		mov		temp1,chr3		;Zehner
		rcall	segx			;In 7-Seg wandeln
		lpm		seg0,z			;In 1.Stelle schreiben
		rjmp	rest			;Stelle 2 und 3 ausgeben
	;------------------
	; 100 ... 150  Grad
	;------------------
gr100:	sbi		portc,5			;DP aus
		mov		chr1,chr2		;Einer -> Zehntel
		mov		chr2,chr3		;Zehner -> Einer
		ldi		seg0,_1			;7Seg-Code für "1"
		rjmp	rest			;Stelle 2 und 3 ausgeben
	;------------------
	;Negative Werte
	;------------------
ngt:	ldi		seg0,g_			;Minuszeichen in 1. Stelle
		cbi		portc,5			;DP ein
		tst		chr3			;Wenn zwischen -0.1 ... -9.9 Grad, Sprung
		breq	rest
		sbi		portc,5			;DP aus
		mov		chr1,chr2		;Einer -> Zehntel
		mov		chr2,chr3		;Zehner -> Einer
	;--------------------------
	;2. und 3. Stelle ausgeben
	;--------------------------
rest:	mov		temp1,chr2		;Einer
		rcall	segx			;-> 7-Seg
		lpm		seg1,z			;in 2. Stelle
		mov		temp1,chr1
		rcall	segx
		lpm		seg2,z			;1/10 in 3. Stelle	
		ret
	;--------------------------------------------------------------------------------
	;Ziffer in temp1 zeigt auf 7 Segmentcode (Tabelle im Flash) 
	;--------------------------------------------------------------------------------
segx:	ldi		zl,low(segtab*2)	;Z-Pointer auf den 1. 7-Segmentcode
		ldi		zh,high(segtab*2)
		add		zl,temp1			;0..9 in temp1 addieren
		adc		zh,null
		ret
;**********************************************************************************
;						  --- ENDE Thermometer ---
;**********************************************************************************
;*************************************************************************************************
;Timerinterrrupt alle 1mS
;Da die ISR auch währed dem auslesen des TSIC auftritt, ist sie Geschwindigkeitsoptimiert.
;--------------------------------------------------------------------------------------------
;Die Maximale ISR-Dauer sind knapp 2,4µS. Der mittlere T-Strobe Wert = 62,5 µS (s. Zackwire Datenblatt)
;T-Strobe würde bei einem Interrupt max. 65µS dauern, ist also noch im grünen Bereich.
;*************************************************************************************************
;									;4
ISR:in		s,sreg					;1
	dec		tick					;1     Jede mS runterzählen
	;--------------------------------------------------------------------------------------------
	;Display Multiplexen
	;-------------------
	;Bei3 Anzeigen *1mS sind das 3mS für einen Durchlauf. Die Muxfreq. ist 1/3mS = 333.3 Hz
	;--------------------------------------------------------------------------------------------
	sbic	PortD,PD5				;1|2  War zuletzt die 3. Anzeige eingeschaltet, 1. Anzeige einschalten
	rjmp	_mux1					;2
	out		PortD,pnp1				;1    PNP Transistor, gem. Anode, Stelle 1, Einschalten (PD7=0)
	out		PortB,seg0				;1    Kathoden
	out		sreg,s					;1    Statusbits zurücklesen
	reti							;4    in der Main weitermachen
	;15 = 1,875µS
_mux1:
	sbic	PortD,PD7				;1|2  War Anz.1 an, Anz.2 einschalten
	rjmp	_mux2					;2
	out		PortD,pnp2				;1    PNP Transistor, gem. Anode, Stelle 2, Einschalten (PD6=0)
	out		PortB,seg1				;1    Kathoden
	out		sreg,s					;1    Statusbits zurücklesen
	reti							;4    in der Main weitermachen
	;18 = 2,25µS
_mux2:
	out		PortD,pnp3				;1    PNP Transistor, gem. Anode, Stelle 3, Einschalten (PD5=0)
	out		PortB,seg2				;1    Kann nur noch Stelle 3 sein
	out		sreg,s					;1    Statusbits zurücklesen
	reti							;4    in der Main weitermachen
	;19 = 2,375µS
;***************************************************************************************************************
;									--- ENDE ISR ---
;***************************************************************************************************************														

;Segment | Portpin
;-----------------------------------------------------------------------------------------------
;	a		6		|-a-|	Die 7 Segmenttabelle (a..g) ist dem Layout angepasst
;	b		5		f   b	Durch den gemeinsamen Anodenanschluss, ist eine Null am Port nötig
;	c		4		|-g-|	damit ein Segment leuchtet
;	d		3		e   c
;	e		2		|-d-|
;	f		1
;	g		0
;-------------------------------------------------------------------
;Die Zeichen 0..F als 7Segmentcode
segtab: 
.db $81,  $CF,\
	$92,  $86,\
	$CC,  $A4,\
	$A0,  $8F,\
	$80,  $84;,\
;	$88,  $E0,\
;	$B1,  $C2,\
;	$B0,  $B8
;-------------------------------------------
;Einzelne Segmente
;-------------------------------------------
.equ	a_ = 0b0111111
.equ	b_ = 0b1011111
.equ	c_ = 0b1101111
.equ	d_ = 0b1110111
.equ	e_ = 0b1111011
.equ	f_ = 0b1111101
.equ	g_ = 0b1111110
;-------------------------------------------
;Equates der Chars
.equ _	 =  0xFF	// Space
.equ _0  = 	0x81 	// 0
.equ _1  =  0xCF	// 1
.equ _2  =  0x92	// 2
.equ _3  =  0x86	// 3
.equ _4  =  0xCC	// 4
.equ _5  =  0xA4	// 5
.equ _6  =  0xA0	// 6
.equ _7  =  0x8F	// 7
.equ _8  =  0x80	// 8
.equ _9  =  0x84	// 9
.equ _A  =  0x88	// A
.equ _B  =  0xE0	// B
.equ _C  =  0xF2	// C
.equ _D  =  0xC2	// D
.equ _E  =  0xB0	// E
.equ _F  =  0xB8	// F
.equ _gg =  0x84	// g
.equ _G  =  0xA1	// G
.equ _hh =  0xE8	// h
.equ _H  =  0xC8	// H
.equ _ii =  0xEF	// i
.equ _I  =  0xCF	// I
.equ _J  =  0xC3	// J
.equ _L  =  0xF1	// L
.equ _n  =  0xEA	// n
.equ _oo =  0xE2	// o
.equ _O  =  0x81	// O
.equ _P  =  0x98	// P
.equ _q  =  0x8C	// q
.equ _r  =  0xFA	// r
.equ _S  =  0xA4	// S
.equ _t  =  0xF0	// t
.equ _uu =  0xE3	// u
.equ _U  =  0xC1	// U
.equ _Y  =  0xD8	// Y

