瀏覽代碼

AVM: Init project

Vladimir N. Shilov 11 年之前
當前提交
822d2178a0
共有 9 個文件被更改,包括 492 次插入0 次删除
  1. 二進制
      AppNotes.7z
  2. 61 0
      ReadMe.txt
  3. 405 0
      avm.asm
  4. 26 0
      avm.hex
  5. 二進制
      avm.lay
  6. 二進制
      avm.spl7
  7. 二進制
      avto-v-meter-2.DSN
  8. 二進制
      avto-v-meter.DSN
  9. 二進制
      model.DSN

二進制
AppNotes.7z


+ 61 - 0
ReadMe.txt

@@ -0,0 +1,61 @@
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+Схема "вариант 4"
+При входном диапазоне 0-20В, входном делителе на 4, и двух управляющих линях, 
+получим:
+Ctl1	Ctl2	Out
+1	0	Uout=Uin-10V
+1	Z	Uout=(Uin-10V)/2
+0	0	Uout=Uin
+0	Z	Uout=Uin/2
+Z	0	Uout=Uin/2
+Z	Z	Uout=Uin/4
+
+Ctl2 равное лог1 (+5В) -- не применимо
+
+Итого:
+напряжение от 0 до 5 -- напрямую, точность 20мВ
+напряжения от 5  до 10 -- делим на два, точность 40мВ
+напряжение от 10 до 15 -- -10, точность 20мВ
+напряжения от 15  до 20 -- -10 и делим на два, точность 40мВ
+
+А можно просто взять 20В, поделить на 4. полусим точность около 80мВ.
+И если применить оверсэмплинг, то можно попробовать улучшить результат.
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+Если я правильно понял, для oversampling необходимо налиие шумов, поэтому 
+опорное напряжение можно взять от стабилитрона с входных 12В, без всяких 
+конденсаторов. Также можно не увлекатся фильтрацией питания и избавлением от 
+пульсаций, а также отказаться от всяких мер по экранированию измерительных 
+цепей. Также не стоит использовать спящий режим для измерений.
+Уровень шума в измеряемом сигнале, или опорном напряжении должен быть на 
+уровне 1-2LSB, при опорном в 5В -- это 5-10 мВ.
+
+При питании от розетки, можно просто распределить измерения в течении 
+одного периода 100Гц.
+
+Для oversampling нужно произвести 4^n измерений (где n - количество 
+дополнительных бит результата), суммировать результат и разделить на 2^n
+Потом произвести действия по калибровке и можно вычеслять результат.
+На асме ещё нужно принять меры для сохранения дробной части.
+
+Например, 2 доп бита.
+Делаем 16 измерений, суммируем, делим на 4. Дальше как обычно -- умножаем на 
+опорное в миливольтах, и делим на 4096 (ведб результат у нас теперь 12 бит). 
+Получаем результат в миливольтах, с дискретностью опора/4096.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+2014.10.08
+таки запаял и запустил :-)
+если не учитывать косяк на плате -- то всё удачно. почти.
+ 1. низкая скорость обновления -- нужно увеличивать раз в несколько.
+ 2. яркость бешеная -- нужно увеличить резисторы ом до 200-300. заодно 
+    уменьшиться нагрев стаба. потребление около 100 мА.
+ 3. прыгают показания -- нужно усреднять.
+ 4. подправить значение опорного напряжения под реальное (4.985 В)
+ 5. можно гасить ведущий "0".
+
+
+ - в делителе таймера была ошибка. в итоге частота была ~75 Гц. похоже на правду.
+ - исправил таймер и поправил плату.
+ - отпочковал версию 2.

+ 405 - 0
avm.asm

@@ -0,0 +1,405 @@
+; Àâòîð:	shilow@ukr.net
+; Äàòà:		ìàé-èþíü 2012
+; Íàçâàíèå:	avm
+; Âåðñèÿ:	1
+; Èìÿ ôàéëà: 	avm.asm, avm.spl7, avm.lay
+; Äëÿ AVR:	ATtiny24A
+; Òàêòîâàÿ ÷àñòîòà: 8MHz, âíóòðåííèé RC-ãåíåðàòîð
+; Âûïîëíÿåìûå ôóíêöèè: Àâòîìîáèëüíûé âîëüòåìòð
+; ñì. ReadMe.txt
+; ñõåìà ïî "Âàðèàíò 5"
+
+;******************************
+; èíêëóäû
+.nolist
+.include "tn24Adef.inc"
+.list
+
+;******************************
+; îïðåäëåíèÿ
+.def job0	= r0
+.def job1	= r1
+.def job2	= r2
+;.def job3	= r3
+.def LED1	= r4
+.def LED2	= r5
+.def LED3	= r6
+.def LED4	= r7
+.def msrL	= r14
+.def msrH	= r15
+.def temp	= r16	; ðàáî÷àÿ ïåðåìåííàÿ 
+.def tmp1	= r17
+.def cnt1	= r18
+.def cnt2	= r19
+.def LEDN	= r20
+.def msek5	= r24	; 5-òè ìñåê èíòåðâàëû
+.def flags	= r25
+
+;******************************
+; êîíñòàíòû
+.equ AtBCD0	= 0	;address of job0
+.equ AtBCD2	= 2	;address of job2
+.equ AtLED1	= 4	;address of LED1
+.equ MSEK100	= 7	; 7bit of flags == 0.1 sek
+.equ NEED_DOT	= 6	; íóæíà òî÷êà
+.equ DISP_PORT	= PORTA
+.equ DISP_DDR	= DDRA
+.equ LA1	= 4
+.equ LA2	= 5
+.equ LA3	= 6
+.equ LA4	= 7
+.equ SER_PORT	= PORTB
+.equ SER_DDR	= DDRB
+.equ SCK	= 0
+.equ DATA	= 1
+.equ LOCK	= 2
+.equ T1DIVL	= 0x8F
+.equ T1DIVH	= 0xFD	; 0x10000-8MHz/64/200Hz
+.equ VREF	= 500	; îïîðíîå íàïðÿæåíèå * 10 ìÂ
+.equ SPH	= 0x3e
+.equ DOT_BIT	= 5	; bit5 -- òî÷êà
+
+;******************************
+; ìàêðîñû
+; ñîõðàíÿåì â ñòåê SREG è R16
+.MACRO PUSHF
+	PUSH	R16
+	IN	R16,SREG
+	PUSH	R16
+.ENDM
+
+; âîññòàíàâëèâàåì èç ñòåêà SREG è R16 
+.MACRO POPF
+	POP	R16
+	OUT	SREG,R16
+	POP	R16
+.ENDM
+
+;******************************
+; ÿ÷åéêè â ÑÎÇÓ
+;.DSEG
+;.ORG	SRAM_START
+;Display:	.byte 4 ; 4 áàéòà äëÿ èíäèêàòîðà
+
+;******************************
+; êîíñòàíòû â EEPROM
+;.ESEG
+;smpl1:		.DW	0x0000	; sample 1
+;smpl2:		.DB	0x05	; sample 2
+
+;******************************
+; ïàìÿòü ïðîãðàìì
+.CSEG
+.ORG 0
+;******************************
+; Òàáëèöà âåêòîðîâ ïðåðûâàíèé
+	rjmp	RESET		; Reset Handler
+	reti;jmp	INT0		; IRQ0 Handler
+	reti;jmp	PCINT0		; PCINT0 Handler
+	reti;jmp	PCINT1		; PCINT1 Handler
+	reti;jmp	WDT		; Watchdog Interrupt Handler
+	reti;jmp	TIM1_CAPT	; Timer1 Capture Handler
+	reti;jmp	TIM1_COMPA	; Timer1 Compare A Handler
+	reti;jmp	TIM1_COMPB	; Timer1 Compare B Handler
+	rjmp	TIM1_OVF	; Timer1 Overflow Handler
+	reti;jmp	TIM0_COMPA	; Timer0 Compare A Handler
+	reti;jmp	TIM0_COMPB	; Timer0 Compare B Handler
+	reti;jmp	TIM0_OVF	; Timer0 Overflow Handler
+	reti;jmp	ANA_COMP	; Analog Comparator Handler
+	rjmp	ADCC		; ADC Conversion Handler
+;	rjmp	EE_RDY		; EEPROM Ready Handler
+;	rjmp	USI_STR		; USI STart Handler
+;	rjmp	USI_OVF		; USI Overflow Handler
+
+;******************************
+;;;;; Ïåðâè÷íàÿ èíèöèàëèçàöèÿ
+RESET:	ldi	temp,high(RAMEND); Main program start
+	out	SPH,temp
+	ldi	temp,low(RAMEND)
+	out	SPL,temp; Set Stack Pointer to top of RAM
+; âûêë. àíàëîã, êîìïàðàòîð 
+	ldi	temp,1<<ACD
+	out	ACSR,temp
+; íàñòðîèì ÀÖÏ. îïîðà - Vcc, êàíàë 1, íåïðåðûâíîå ïðåîáðàçîâàíèå. temp=0b00100010
+	ldi	temp,1<<MUX0
+	out	ADMUX,temp
+	ldi	temp,(1<<ADEN)|(1<<ADSC)|(6<<ADPS0)
+	out	ADCSRA,temp
+; timer1 - ÷àñòîòà 200 ãö, ïðè òàêòîâîé 8ÌÃö, ïðåñêàëåð=64, TCNT1L=0xñ0, TCNT1H=0x63
+	ldi	temp,(3<<CS10)
+	out	TCCR1B,temp
+	ldi	temp,T1DIVH
+	out	TCNT1H,temp
+	ldi	temp,T1DIVL
+	out	TCNT1L,temp	; çàïóñòèëè òàéìåð 1
+; ðàçðåøàåì ïðåðûâàíèå îò òàéìåðà
+	ldi	temp,1<<TOIE1
+	out	TIMSK1,temp
+; init
+	ldi	LEDN,0b11101111	; ïåðâûé èíäèêàòîð
+	ldi	temp,(1<<LA1)|(1<<LA2)|(1<<LA3)|(1<<LA4)
+	out	DISP_DDR,temp
+	out	DISP_PORT,temp
+	ldi	temp,(1<<SCK)|(1<<DATA)|(1<<LOCK)
+	out	SER_DDR,temp
+	ldi	msek5,20
+	clr	YH
+	ldi	YL,AtLED1	; çàãðóæàåì àäðåñ 1-ãî èíäèêàòîðà
+	ldi	temp,0x30
+	mov	LED1,temp
+	mov	LED2,temp
+	mov	LED3,temp
+	mov	LED4,temp
+; Enable interrupts
+	sei
+;******************************
+;;;;; Îñíîâíàÿ ïðîãðàììà
+BEGIN:
+
+	sbrs	flags,MSEK100	; ïîðà ïðîèçâîäèòü èçìåðåíèÿ?
+	rjmp	MLBL1		; íåò
+	;!! ADATE@ADCSRA==1, ïðè ADTS@ADCSRB==0 -- çàïóñê free running mode
+	clr	msrL
+	clr	msrH		; î÷èñòèëè õðàíèëèùå ðåçóëüòàòà
+	ldi	cnt2,16		; çàãðóçèëè ñ÷¸ò÷èê èçìåðåíèé
+	sbi	ADCSRA,ADATE	; çàïóñê free running mode
+	sbi	ADCSRA,ADIE	; ðàçðåøàåì ïðåðûâàíèÿ îò ÀÖÏ
+	sbi	ADCSRA,ADSC	; çàïóñê íîâ. ïðåîáðàçîâàíèÿ 
+ML1:	rjmp	PC+1		; nop x 2 -- 1 world 2 takta
+	tst	cnt2		; ãîíÿåì ïóñòîé öèêë ïîêà áóäóò ïðîèñõîäèòü 16 èçìåðåíèé
+	brne	ML1
+	cbi	ADCSRA,ADIE	; çàïðåùàåì ïðåðûâàíèÿ îò ÀÖÏ
+	cbi	ADCSRA,ADATE	; stop free running mode
+	lsr	msrH
+	ror	msrL
+	lsr	msrH
+	ror	msrL		; ïîäåëèëè ðåçóëüòàò íà 2^2
+	; òåïåðü ìíîæèì íà Vref è äåëèì íà 4096
+	ldi	temp,low(VREF)
+	ldi	tmp1,high(VREF)
+	rcall	MPY16U
+	lsr	job1		; âûáðîñèëè job0 == ïîäåëèëè íà 256
+	ror	job0
+	lsr	job1
+	ror	job0
+;;	lsr	job1
+;;	ror	job0
+;;	lsr	job1
+;;	ror	job0		; äîäåëèëè íà 16, èòîãî ïîäåëèëè íà 4096
+;	ldi	cnt1,4
+;ML2:	lsr	job2
+;	ror	job1
+;	dec	cnt1
+;	brne	ML2
+	mov	msrL,job0
+	mov	msrH,job1	; â MSR - íàïðÿæåíèå â 10ìÂ
+;!!! óìíîæèòü íà âõîäíîé äåëèòåëü
+;; -- íå äîäåëèëè íà 4 == óìíîæèëè òåïåðü íà 4.
+;; â ðåàëå íóæíî áóäåò ìíîæèòü íàïðèìåð íà 400 è äåëèòü íà 100 -- ïîä ðåàëüíûé äåëèòåëü.
+; òóò ìîæíî äîáàâèòü êîððåêöèþ óñèëåíèÿ.
+	rcall	bin2BCD16
+	; 4 çíà÷àùèõ öèôðû â job1:job0
+	ldi	XL,AtLED1
+	clr	XH
+	mov	temp,job1
+	swap	temp
+	rcall	OUT_NIBBL	; íèááë 3, äåñÿòêè
+	mov	temp,job1
+	sbr	flags,1<<NEED_DOT
+	rcall	OUT_NIBBL	; íèááë 2, åäèíèöû
+	cbr	flags,1<<NEED_DOT
+	mov	temp,job0
+	swap	temp
+	rcall	OUT_NIBBL	; íèááë 1, äåñÿòûå
+	mov	temp,job0
+	rcall	OUT_NIBBL	; íèááë 0, ñîòûå
+MLBL1:
+
+;******************************
+; äåëàòü íå÷åãî - ïîñïèì...
+	ldi	temp,1<<SE
+	out	MCUCR,temp	; ïðîñòîé ðåæèì ñíà
+	sleep			; ñïèì.
+	clr	temp
+	out	MCUCR,temp	; ñî ñíà
+
+	rjmp	BEGIN
+
+;******************************
+;;;;; Ïîäïðîãðàììû
+
+;******************************
+; âûäà¸ò â ïîðò 8 áèò èç temp, ïîðòèò cnt1
+LEDOUT:	ldi	cnt1,8		; ñ÷åò÷èê áèò
+LO1:	cbi	SER_PORT,SCK	; SCK=0
+	lsl	temp		; ñòàðøèé áèò â ïåðåíîñ
+	brcc	LO0		; åñëè â ïåðåíîñå 0 — ïåðåéòè
+	sbi	SER_PORT,DATA	; âûäàëè 1
+	rjmp	LOE
+LO0:	cbi	SER_PORT,DATA	; âûäàëè 0
+LOE:	sbi	SER_PORT,SCK	; SCK=1, ñäâèã äàííûõ
+	dec	cnt1
+	brne	LO1
+	ret
+
+;******************************
+;** ïåðåâîäèì ìëàäøèé íèááë temp â êîä äëÿ 7-ñãì èíä è êëàä¸ì åãî â îçó ïî àäð Y
+OUT_NIBBL:
+	ldi	ZL,low(LEDnd*2)
+	ldi	ZH,high(LEDnd*2); àäðåñ êîäîâ äëÿ èíäèêàòîðà
+	andi	temp,0x0F	; îòñåêàåì ñò íèááë. ïîëó÷àåì ñìåùåíèå
+	add	ZL,temp
+	adc	ZH,XH		; äîáàâèëè ñìåùåíèå
+	lpm	temp,Z		; ïðî÷èòàëè êîä
+	sbrc	flags,NEED_DOT	; íóæíà òî÷êà?
+	cbr	temp,1<<DOT_BIT	; âêëþ÷àåì òî÷êó
+	st	X+,temp		; çàïèñàëè êîä â ïîçèöèþ èíäèêàòîðà
+	ret
+
+;******************************
+; ïåðåìíîæåíèå äâóõ 16-ðàçðÿäíûõ âåëè÷èí, ðåçóëüòàò 3 áàéòà, ðàáî÷àÿ
+; ìíîæèìîå msrH:msrL, ìíîæèòåëü tmp1:temp, ðåçóëüòàò job2:job1:job0
+; èñïîëüçóåò cnt1
+MPY16U:	clr	job2		;clear 1 highest bytes of result
+	ldi	cnt1,16		;init loop counter
+m16u_1:	lsr	tmp1
+	ror	temp
+	brcc	noad8		;if bit 0 of multiplier set
+	add	job1,msrL	;add multiplicand Low to byte 1 of res
+	adc	job2,msrH	;add multiplicand high to byte 2 of res
+noad8:	ror	job2		;shift right result byte 2
+	ror	job1		;rotate right result byte 1
+	ror	job0		;rotate result byte 0 and multiplier Low
+	dec	cnt1		;decrement loop counter
+	brne	m16u_1		;if not done, loop more
+	ret
+
+;******************************
+;* This subroutine converts a 16-bit number (msrH:msrL) to a 5-digit 
+;* packed BCD number represented by 3 bytes (job2:job1:job0).
+;* MSD of the 5-digit number is placed in the lowermost nibble of job2.
+bin2BCD16:
+	ldi	cnt1,16		;Init loop counter
+	clr	job2		;clear result (3 bytes)
+	clr	job1
+	clr	job0
+	clr	ZH		;clear ZH
+bBCDx_1:lsl	msrL		;shift input value
+	rol	msrH		;through all bytes
+	rol	job0
+	rol	job1
+	rol	job2
+	dec	cnt1		;decrement loop counter
+	brne	bBCDx_2		;if counter not zero
+	ret			;   return
+bBCDx_2:ldi	ZL,AtBCD2+1	;Z points to result MSB + 1
+bBCDx_3:ld	temp,-Z		;get (Z) with pre-decrement
+	subi	temp,-$03	;add 0x03
+	sbrc	temp,3		;if bit 3 not clear
+	st	Z,temp		;	store back
+	ld	temp,Z		;get (Z)
+	subi	temp,-$30	;add 0x30
+	sbrc	temp,7		;if bit 7 not clear
+	st	Z,temp		;	store back
+	cpi	ZL,AtBCD0	;done all three?
+	brne	bBCDx_3		;loop again if not
+	rjmp	bBCDx_1
+
+
+;******************************
+;;;;; Îáðàáîò÷èêè ïðåðûâàíèé
+
+TIM1_OVF:	; Timer1 Overflow Handler
+; âûâîäèì äàííûå íà 7-ìè ñåãìåíòíûå èíäèêàòîðû
+; îòñ÷èòûâàåì 100 ìñåê èíòåðâàë äëÿ çàïóñêà èçìåðåíèé
+	PUSHF
+
+	dec	msek5
+	brne	T1L1
+	ldi	msek5,20
+	sbr	flags,1<<MSEK100
+
+T1L1:
+	;***************************
+	; âûâîä íà èíäèêàòîð î÷åðåäíîé öèôðû
+	ldi	temp,0xF0
+	out	DISP_PORT,temp	; ïîãàñèëè âñå èíäèêàòîðû
+	cbi	SER_PORT,LOCK	; ïîäãòîâèëè çàù¸ëêó
+	ld	temp,Y+		; â òåìï - òåêóùàÿ öèôðà, àäðåñ=+1
+	rcall	LEDOUT		; âûïèõíóëè î÷åðåäíîé áàéò â ðåãèñòð
+	sbi	SER_PORT,LOCK	; èç 0 â 1 -- çàù¸ëêèâàíèå äàííûõ â ðåãèñòðå
+	mov	temp,LEDN
+	andi	temp,0xF0
+	out	DISP_PORT,temp	; âêëþ÷àåì î÷åðåäíîé èíäèêàòîð
+	lsl	LEDN		; ñäâèíóëè - ñëåäóþùèé èíäèêàòîð
+	brlo	T1L2		; âûøëè çà ãðàíèöû? ïðîâåðêà 
+	ldi	LEDN,0b11101111	; äà, çàãðóæàåì íà÷àëüíîå çíà÷åíèå
+	ldi	YL,AtLED1	; çàãðóæàåì àäðåñ 1-ãî èíäèêàòîðà
+T1L2:
+	ldi	temp,T1DIVH
+	out	TCNT1H,temp
+	ldi	temp,T1DIVL
+	out	TCNT1L,temp	; ïåðåçàïóñòèëè òàéìåð 1
+
+	POPF
+	reti
+
+; ADC Conversion Handler
+; ñóììèðóåì ðåçóëüòàòû èçìåðåíèé, óìåíüøàåì ñ÷¸ò÷èê.
+ADCC:	in	temp,ADCL
+	add	msrL,temp
+	in	temp,ADCH
+	adc	msrH,temp
+	dec	cnt2
+	reti
+
+;***************************
+; áàéòû äëÿ âûâîäà 0-9 íà èíäèêàòîðû ñ ÎÀ, áåç òî÷êè. òî÷êà âêë óñòàíîâêîé áèòà 5
+LEDnd:	.DB	0x30,0xF3,0x2A,0xA2,0xE1,0xA4,0x24,0xF2,0x20,0xA0
+
+.exit
+
+INT0:		; IRQ0 Handler
+	reti
+
+PCINT0:		; PCINT0 Handler
+	reti
+
+PCINT1:		; PCINT1 Handler
+	reti
+
+WDT:		; Watchdog Interrupt Handler
+	reti
+
+TIM1_CAPT:	; Timer1 Capture Handler
+	reti
+
+TIM1_COMPA:	; Timer1 Compare A Handler
+	reti
+
+TIM1_COMPB:	; Timer1 Compare B Handler
+	reti
+
+TIM0_COMPA:	; Timer0 Compare A Handler
+	reti
+
+TIM0_COMPB:	; Timer0 Compare B Handler
+	reti
+
+TIM0_OVF:	; Timer0 Overflow Handler
+	reti
+
+ANA_COMP:	; Analog Comparator Handler
+	reti
+
+EE_RDY:		; EEPROM Ready Handler
+	reti
+
+USI_STR:	; USI STart Handler
+	reti
+
+USI_OVF:	; USI Overflow Handler
+	reti
+
+;
+.exit

+ 26 - 0
avm.hex

@@ -0,0 +1,26 @@
+:020000020000FC
+:100000000DC0189518951895189518951895189568
+:1000100090C01895189518951895A7C000E00EBFC8
+:100020000FED0DBF00E808B901E007B906EC06B90D
+:1000300003E00EBD0DEF0DBD0FE80CBD01E00CB9E6
+:100040004FEE00EF0ABB0BBB07E007BB84E1DD27E7
+:10005000C4E000E3402E502E602E702E789497FF5F
+:1000600027C0EE24FF2430E1359A339A369A00C037
+:100070003323E9F733983598F694E794F694E794A8
+:1000800004EF11E030D01694079416940794E02CF6
+:10009000F12C36D0A4E0BB27012D02951AD0012DFA
+:1000A000906417D09F7B002D029513D0002D11D0A6
+:1000B00000E205BF8895002705BFD1CF28E0C09892
+:1000C000000F10F4C19A01C0C198C09A2A95B9F7DF
+:1000D0000895E6E7F1E00F70E00FFB1F049196FD35
+:1000E0000F7D0D930895222420E11695079510F4B5
+:1000F0001E0C2F1C2794179407942A95B1F7089586
+:1001000020E1222411240024FF27EE0CFF1C001CF8
+:10011000111C221C2A9509F40895E3E002910D5F59
+:1001200003FD00830081005D07FD0083E030B1F72F
+:10013000ECCF0F930FB70F938A9511F484E1906879
+:1001400000EF0BBBC2980991B9DFC29A042F007F60
+:100150000BBB440F10F04FEEC4E00DEF0DBD0FE8E8
+:100160000CBD0F910FBF0F91189504B1E00E05B1B2
+:10017000F01E3A95189530F32AA2E1A424F220A0AB
+:00000001FF

二進制
avm.lay


二進制
avm.spl7


二進制
avto-v-meter-2.DSN


二進制
avto-v-meter.DSN


二進制
model.DSN