;IS NOG NIET UITGETEST ! 08/04/2013
;Voltmeter 0,00 ... 4,99 V ,uitlezing Charlyplexing 5 bit -> 20 leds
;3x zeven segment cijfers = 21 leds,links cijfer segment(b)altijd aan
;ingangsweerstand 102,4kohm
;losse diode op ISP prikken, verwijderen voor programmeren

;rel.sprongen vanaf spronginstructie(niet volgende),moet voor assembler

;fusebits , HIERNA ENKEL NOG MET 12V TE VERANDEREN !
;voor Tiny13A: H: $FE (geenResetpin)  L: $4A geeft 9,6/8=1,2MHz en Waakhond aan

	.DEVICE		ATtiny13A

;R0 masker voor aanpassen groepen leds
.DEF	Stat=R1		;bewaren vlaggen
.DEF	Idx =R2		; en Zl tijdens interrupt
.DEF	AnaL=R3		;meetgegevens uit ADC
.DEF	AnaH=R4		;en omzetten binair->decimaal
		;R11...R15 toestand 5 groepen van 4 leds
.DEF	Grp=R16		;verwijst naar R11...R15
.DEF	Bit=R17		;bit voor groep aan 1,2,4,8,16
.DEF	Tlr=R18		;voor omzetten Grp->Bit
.DEF	Mfq=R19		;teller 10x/sec meten
.DEF	Wp =R20		;vanalles

.DEF	Zl =R30		;index-reg,teller,hulp omzetten
.DEF	Zh =R31		;=0

.EQU	SREG	=$3F
.EQU	SPL	=$3D
.EQU	GIMSK	=$3B
.EQU	GIFR	=$3A
.EQU	TIMSK	=$39
.EQU	TIFR	=$38
.EQU	SPMCSR	=$37
.EQU	OCRA	=$36
.EQU	MCUCR	=$35
.EQU	MCUSR	=$34
.EQU	TCCRB	=$33
.EQU	TCNT	=$32
.EQU	OSCCAL	=$31
.EQU	BODCR	=$30
.EQU	TCCRA	=$2F
.EQU	DWDR	=$2E
.EQU	OCR0B	=$29
.EQU	GTCCR	=$28
.EQU	CLKPR	=$26
.EQU	PRR	=$25
.EQU	WDTCR	=$21
.EQU	EEARL	=$1E
.EQU	EEDR	=$1D
.EQU	EECR	=$1C
.EQU	PBuit	=$18
.EQU	PBdir	=$17
.EQU	PINB	=$16
.EQU	PCMSK	=$15
.EQU	DIDR	=$14
.EQU	ACSR	=$08
.EQU	ADMUX	=$07
.EQU	ADCSRA	=$06
.EQU	ADCH	=$05
.EQU	ADCL	=$04
.EQU	ADCSRB	=$03

;----------------------------------------------------------------------------

.ORG	0
		RJMP	Init
		RETI
		RETI
		RJMP	TimOvf
		RETI
		RETI
		RETI
		RETI
		RETI
		RETI	;ADC 

;----------------------------------------------------------------------------

;		alleen in groep 2,3 en 4 -> 3bytes/cijfer =3x10 bytes (T-vlag=1)  voor de honderdsten
LSTh:	.DW	$0E1C,$0C13,$100C,$0A1C,$1C15,$140E,$0C0C,$1416,$160E		;0...5
	.DW	$0E14,$1C17,$100C,$0E1C,$1C13,$160E								;6...9

;		groepen 1,2,3 en 4 -> 4bytes/cijfer =4x10 bytes	(T-vlag=1)	  de tienden
LSTt:	.DW	$061E,$1818,$040A,$1808,$061B,$1018,$060B,$1818,$040F,$1808 	;0...4
	.DW	$0607,$1818,$0617,$1818,$060A,$1808,$061F,$1818,$060F,$1818 	    ;5...9

;		groepen 0,2 en 3 -> 3bytes/cijfer =3x5 (+1vulling)bytes (T-vlag=0)	eenheden
LSTe:	.DW	$050F,$0909,$0804,$0513,$1909,$0905,$041D,$FF08 	 		;0...4

LSTm:	.DW	$0E05,$081F,$FF16  ; ^^^ (te groot)

;---------------------------------------------------------------------------

Init:			CLI				;vooreerst geen interrupts
			WDR				;en niet bijten
			LDI		Zh,$9F		;geheugentop
			OUT		SPL,Zh		;in stack-wijzer
			CLR		Zh		;=nul
			OUT		PBdir,Zh	;alles in
			OUT		PBuit,Zh	;niks aan
			OUT		ADMUX,Zh	;Vcc=Ref,PB5=ADCin,bits tegen rechts
			LDI		Wp,$20
			OUT		DIDR,Wp		;PB5 geen dig.-in
			LDI		Wp,$80
			OUT		ACSR,Wp		;geen comparator
			LDI		Wp,3
			OUT		TCCRB,Wp	;presc.1/64 =1,2MHz/64=19kHz, 53s/tik =5ms per100 tikken
			LDI		Wp,2
			OUT		TIMSK,Wp	;Tovf Int.ena. (bit1)
			LDI		Wp,$68
			OUT		MCUCR,Wp	;PUD geen trek naar+ , SLEEP->ADC
			LDI		Wp,$98		;woeftijd verandering toestaan
			OUT		WDTCR,Wp	;en evt.int-vlag weg
			LDI		Wp,$8D		;nieuwe wachttijd
			OUT		WDTCR,Wp	;1/2 seconde
			LDI		Grp,11		;-> 1ste groep leds
			SER		Zl		;start met ^^^(FF zeker te groot)
			LDI		Mfq,12		;eerste meting over 1/20 sec.
			SEI				;interrupt aan

;-------------------------------------------------------------------------				

Start:			WDR				;reset woef
			CLR		R11		;cls
			CLR		R12
			CLR		R13
			CLR		R14
			CLR		R15
			SET				;vlag-ZetBits niets overslaan

			CPI		Zl,250		;5volt of meer,mis
			LDI		Zl,LSTm<<1	;^^^
			BRCC	Mis
		
			LDI		Zl,LSTh<<1	;honderdsten in Wp
			ADD		Zl,Wp		;3bytes/cijfer
			ADD		Zl,Wp
			ADD		Zl,Wp
			RCALL	ZetBitH

			LDI		Zl,LSTt<<1	;tienden in AnaL
			LSL		AnaL		;4bytes/cijfer
			LSL		AnaL
			ADD		Zl,AnaL
			RCALL	ZetBitT

			LDI		Zl,LSTe<<1	;eenheden in AnaH
			ADD		Zl,AnaH		;3bytes/cijfer
			LSL		AnaH
			ADD		Zl,AnaH
			CLT				;vlag-twee groepen overslaan
Mis:			RCALL	ZetBits

			TST		Mfq		;elke 1/10de sec.
			BRNE	PC-1
			LDI		Mfq,20		;een meting, 20x5ms
			LDI		Zl,4		;doe 4x,dan gemiddelde
			CLR		AnaL		;beginnen
			CLR		AnaH		;met niks

Meten:			SBIC		ADCSRA,6	;adc bezig?
			RJMP	Meten			;dan wacht
			OUT		TIMSK,Zh	;geen andere int (Zh=0)
			LDI		Wp,$DC		;adc en int aan,vlag weg,start
			OUT		ADCSRA,Wp	;reset int-vlag,75kHz
			SLEEP				;wakker na einde adc

			LDI		Wp,2
			OUT		TIMSK,Wp	;TimOvf mag ook weer
			IN		Wp,ADCL		;8bit
			ADD		AnaL,Wp
			IN		Wp,ADCH		;2bit
			ADC		AnaH,Wp		;10bit bijtellen
			DEC		Zl
			BRNE	Meten

;verwerken/opsplitsen
			SWAP		AnaH		;4 metingen bijeen
			SWAP		AnaL		;resultaat/4
			LDI		Wp,$0F
			AND		Wp,AnaL		;geeft 8bit in Wp = 1/2waarde
			OR		Wp,AnaH		;9de bit (lsb)= b7 AnaL
			MOV		Zl,Wp		;voor test te groot

			CLR		AnaH
			DEC		AnaH
			INC		AnaH		;delen door
			SUBI		Wp,50		;100/2
			BRCC	PC-2			;eenheden in AnaH
			SUBI		Wp,-50		;(tienden+honderdsten)/2 (ADDI,50 is er niet)

			ROL		AnaL		;   + 1?(bit7 is 9de bit ADC)
			ROL		Wp		;x2
			CLR		AnaL
			DEC		AnaL
			INC		AnaL		;delen door
			SUBI		Wp,10		;10
			BRCC	PC-2			;tienden in AnaL
			SUBI		Wp,-10		;honderdsten (+10,er is geen ADDI)
			RJMP	Start

;-----------------------------------------------------------------

ZetBits:		LPM		R0,Z		;bitkonfiguratie
			INC		Zl		;uit lijst
			OR		R11,R0		;toevoegen
			BRTC	ZetBitH			;aan de groepen
ZetBitT:		LPM		R0,Z		;voor vertoon
			INC		Zl		;d.m.v.timer0 interrupt
			OR		R12,R0		;als vlag T=0 maar
ZetBitH:		LPM		R0,Z		;drie groepen
			INC		Zl
			OR		R13,R0
			LPM		R0,Z
			OR		R14,R0
			BRTC	PC+4			;=RET
			INC		Zl
			LPM		R0,Z
			OR		R15,R0
			RET
	

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;				elke 5ms naar hier
TimOvf:			IN		Stat,SREG	;bewaar C-vlaggen
			MOV		Idx,Zl		;en index-reg
			MOV		Zl,Grp		;deze is aan de beurt
			LDI		Tlr,162		;(1200000/64)/(256-162)=200Hz
			OUT		TCNT,Tlr	;200/5=40Hz op leds
							;R16=15,14,13,12,11
			LDI		Bit,32
			LDI		Tlr,16

			SUB		Tlr,Grp		;Tlr =  1, 2, 3, 4, 5
			LSR		Bit		;Bit = 16, 8, 4, 2, 1
			DEC		Tlr
			BRNE	PC-3

			OUT		PBdir,Tlr	;donker,Tlr=0
			OUT		PBuit,Bit	;n pin +,in Tlr ook 1
			LD		Tlr,Z		;toestand deze groep (Zh=0)
			OR		Tlr,Bit		;eigenlijk niet nodig(is al 1 in groep)
			OUT		PBdir,Tlr	;een 1 wordt -,led aan
							;een 0 zwevend,led uit
			INC		Grp		;van 11 tot 15
			SBRC		Grp,4		;als 16 
			LDI		Grp,11		;terug 11
			DEC		Mfq		;teller voor 10x/sec meten
			MOV		Zl,Idx		;herstel index-reg
			OUT		SREG,Stat	;en C-vlaggen
			RETI

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
