浏览代码

AVM: походу -- финал...

Vladimir N. Shilov 10 年之前
父节点
当前提交
c911560c2c
共有 4 个文件被更改,包括 109 次插入81 次删除
  1. 19 2
      ReadMe.txt
  2. 64 52
      avm.asm
  3. 26 27
      avm.hex
  4. 二进制
      model.pdsprj

+ 19 - 2
ReadMe.txt

@@ -1,4 +1,4 @@
-2014.10.10
+2014.10.09
 Появились идеи для третьей версии.
 Это уже будет не авто-вольт-метр, а ups-вольт-метр:
  - основная задача -- контроль напряжения аккума в упсе.
@@ -13,4 +13,21 @@
    - преобразование результата в и запись в буфер индикатора - после 
      вывода четвёртой цифры;
  - возможно это также поможет избавиться от мельтешения цифр.
- 
+
+---
+2014.10.10 
+Если верить протеусу -- основной цикл проходит за 1.83 мсек, цикл BCD 
+занимает 106 мксек, цикл усреднения 32 мксек, а сам цикл измерений -- 
+порядка 1692 мксек.
+Никакого смысла в таком частом измерении нет -- вставил sleep в конце 
+цикла, теперь основной цикл начинается после вывода очередной цифры, т.е. 
+каждые 5 мсек.
+
+поменял таймер 1 на 0, цикл уменьшил до 4 мсек (250 Гц),
+прошивка -- 440 байт, из них 10 байт данных, ну и 32 байта в ОЗУ.
+люблю асм :-)
+
+тест в железе прошел успешно.
+
+попробую я этот вольтметр всабачить в прикуриватель и всё-таки 
+использовать в машине. а для упс-а сделать всё-таки отдельный девайс...

+ 64 - 52
avm.asm

@@ -35,8 +35,8 @@
 .def msrH	= r15
 .def temp	= r16	; ðàáî÷àÿ ïåðåìåííàÿ 
 .def tmp1	= r17
-.def cnt1	= r18	; ðàáî÷èé ñ÷¸ò÷èê
-.def cnt2	= r19	; ñ÷¸ò÷èê öèêëîâ ÀÖÏ
+.def cnt1	= r18	; ðàáî÷èé ñ÷¸ò÷èê, ñ÷¸ò÷èê öèêëîâ ÀÖÏ
+.def cnt2	= r19	; ñ÷¸ò÷èê öèêëîâ Led_Out
 .def LEDN	= r20
 ; r21
 ; r22
@@ -68,8 +68,9 @@
 .equ SCK	= 0
 .equ DATA	= 1
 .equ LOCK	= 2
-.equ T1DIVL	= 0x8F
-.equ T1DIVH	= 0xFD	; 0x10000-8MHz/64/200Hz
+;.equ T1DIVL	= 0x8F
+;.equ T1DIVH	= 0xFD	; 0x10000-8MHz/64/200Hz
+.equ T0DIV	= 0x83	; 0x100-8MHz/256/250Hz
 .equ VREF	= 500	; îïîðíîå íàïðÿæåíèå * 10 ìÂ
 .equ SPH	= 0x3e
 .equ DOT_BIT	= 5	; bit5 -- òî÷êà
@@ -119,10 +120,10 @@ Buffer:		.byte 2*BuffSize
 	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	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
+	rjmp	TIM0_OVF	; Timer0 Overflow Handler
 	reti;jmp	ANA_COMP	; Analog Comparator Handler
 	rjmp	ADCC		; ADC Conversion Handler
 ;	rjmp	EE_RDY		; EEPROM Ready Handler
@@ -136,25 +137,38 @@ RESET:
 	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
+
+;;; íàñòðîèì ÀÖÏ. îïîðà - 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
-	ldi	temp,(3<<CS10)
-	out	TCCR1B,temp
-	ldi	temp,T1DIVH
-	out	TCNT1H,temp
-	ldi	temp,T1DIVL
-	out	TCNT1L,temp	; çàïóñòèëè òàéìåð 1
+
+;;; òàéìåð0 èíòåðâàëû â 4 ìñåê (250 Hz). ïðåñêàëåð = 256
+	ldi	temp,(1<<CS02)
+	out	TCCR0B,temp
+	ldi	temp,T0DIV
+	out	TCNT0,temp	; çàïóñòèëè òàéìåð
+; ïðåðûâàíèÿ îò òàéìåðîâ
+	ldi	temp,(1<<TOIE0)
+	out	TIMSK0,temp	; ðàçðåøèì ïðåðûâàíèå ïî ïåðåïîëíåíèþ
+
+;; timer1 - ÷àñòîòà 200 ãö, ïðè òàêòîâîé 8ÌÃö, ïðåñêàëåð=64
+;	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	temp,1<<TOIE1
+;	out	TIMSK1,temp
+
+;;; init
 	ldi	LEDN,0b11101111	; ïåðâûé èíäèêàòîð
 	ldi	temp,IND_LA
 	out	DISP_DDR,temp
@@ -170,7 +184,8 @@ RESET:
 	mov	LED4,temp
 	ldi	bAddr,low(Buffer)
 	clr	bIdx
-; Enable interrupts
+
+;;; Enable interrupts
 	sei
 ;******************************
 ;;;;; Îñíîâíàÿ ïðîãðàììà
@@ -178,14 +193,16 @@ BEGIN:
 ;;; çàïóñêàåì èçìåðåíèÿ è ïðåîáðàçîâàíèÿ
 	clr	msrL
 	clr	msrH		; î÷èñòèëè õðàíèëèùå ðåçóëüòàòà
-	ldi	cnt2,16		; çàãðóçèëè ñ÷¸ò÷èê èçìåðåíèé
+	ldi	cnt1,16		; çàãðóçèëè ñ÷¸ò÷èê èçìåðåíèé
 	sbi	ADCSRA,ADATE	; çàïóñê free running mode
 	sbi	ADCSRA,ADIE	; ðàçðåøàåì ïðåðûâàíèÿ îò ÀÖÏ
 	sbi	ADCSRA,ADSC	; çàïóñê íîâ. ïðåîáðàçîâàíèÿ 
+
 ML1:
 ;	rjmp	PC+1		; nop x 2 -- 1 world 2 takta. èëè sleep?
-	rcall	WAIT_IRQ
-	tst	cnt2		; ãîíÿåì ïóñòîé öèêë ïîêà áóäóò ïðîèñõîäèòü 16 èçìåðåíèé
+	rcall	WAIT_IRQ	; îäèí öèêë èçìåðåíèÿ, ÅÌÍÈÏ áîëüøå 100 ìêñ...
+	tst	cnt1		; ãîíÿåì ïóñòîé öèêë ïîêà áóäóò ïðîèñõîäèòü 16 èçìåðåíèé
+
 	brne	ML1
 	cbi	ADCSRA,ADIE	; çàïðåùàåì ïðåðûâàíèÿ îò ÀÖÏ
 	cbi	ADCSRA,ADATE	; stop free running mode
@@ -294,6 +311,7 @@ MakeDigit2:
 	rcall	OUT_NIBBL	; íèááë 0, ñîòûå
 
 ;;; Êîíåö öèêëà
+	rcall	WAIT_IRQ
 	rjmp	BEGIN
 
 ;******************************
@@ -309,21 +327,6 @@ WAIT_IRQ:
 	out	MCUCR,temp	; ñî ñíà
 	ret
 
-;******************************
-; âûäà¸ò â ïîðò 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-ñãì èíä è êëàä¸ì åãî â îçó ïî àäð X
 OUT_NIBBL:
@@ -393,13 +396,14 @@ bBCDx_3:ld	temp,-Z		;get (Z) with pre-decrement
 ;;;;; Îáðàáîò÷èêè ïðåðûâàíèé
 
 ;******************************
-; Timer1 Overflow Handler
-TIM1_OVF:
+; Timer0 Overflow Handler
+TIM0_OVF:
 ; âûâîäèì äàííûå íà 7-ìè ñåãìåíòíûå èíäèêàòîðû
-; îòñ÷èòûâàåì 100 ìñåê èíòåðâàë äëÿ çàïóñêà èçìåðåíèé
 	PUSHF
 
-T1L1:
+	ldi	temp,T0DIV
+	out	TCNT0,temp	; ïåðåçàïóñòèëè òàéìåð 0
+
 	;***************************
 	; âûâîä íà èíäèêàòîð î÷åðåäíîé öèôðû
 	in	temp,DISP_PORT
@@ -407,22 +411,30 @@ T1L1:
 	out	DISP_PORT,temp	; ïîãàñèëè âñå èíäèêàòîðû
 	cbi	SER_PORT,LOCK	; ïîäãòîâèëè çàù¸ëêó
 	ld	temp,Y+		; â òåìï - òåêóùàÿ öèôðà, àäðåñ=+1
-	rcall	LEDOUT		; âûïèõíóëè î÷åðåäíîé áàéò â ðåãèñòð
+
+;;; âûïèõíåì î÷åðåäíîé áàéò â ðåãèñòð
+	ldi	cnt2,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	cnt2
+	brne	LO1
+
 	sbi	SER_PORT,LOCK	; èç 0 â 1 -- çàù¸ëêèâàíèå äàííûõ â ðåãèñòðå
 	in	temp,DISP_PORT
 	ori	temp,IND_LA
 	and	temp,LEDN
 	out	DISP_PORT,temp	; âêëþ÷àåì î÷åðåäíîé èíäèêàòîð
 	lsl	LEDN		; ñäâèíóëè - ñëåäóþùèé èíäèêàòîð
-	brlo	T1L2		; âûøëè çà ãðàíèöû? ïðîâåðêà 
+	brlo	T0L2		; âûøëè çà ãðàíèöû? ïðîâåðêà 
 	ldi	LEDN,0b11101111	; äà, çàãðóæàåì íà÷àëüíîå çíà÷åíèå
 	ldi	YL,AtLED1	; çàãðóæàåì àäðåñ 1-ãî èíäèêàòîðà
-T1L2:
-	ldi	temp,T1DIVH
-	out	TCNT1H,temp
-	ldi	temp,T1DIVL
-	out	TCNT1L,temp	; ïåðåçàïóñòèëè òàéìåð 1
 
+T0L2:
 	POPF
 	reti
 
@@ -435,7 +447,7 @@ ADCC:
 	add	msrL,temp
 	in	temp,ADCH
 	adc	msrH,temp
-	dec	cnt2
+	dec	cnt1
 	reti
 
 ;***************************
@@ -465,13 +477,13 @@ TIM1_COMPA:	; Timer1 Compare A Handler
 TIM1_COMPB:	; Timer1 Compare B Handler
 	reti
 
-TIM0_COMPA:	; Timer0 Compare A Handler
+TIM1_OVF:	; Timer1 Overflow Handler
 	reti
 
-TIM0_COMPB:	; Timer0 Compare B Handler
+TIM0_COMPA:	; Timer0 Compare A Handler
 	reti
 
-TIM0_OVF:	; Timer0 Overflow Handler
+TIM0_COMPB:	; Timer0 Compare B Handler
 	reti
 
 ANA_COMP:	; Analog Comparator Handler

+ 26 - 27
avm.hex

@@ -1,31 +1,30 @@
 :020000020000FC
 :100000000DC0189518951895189518951895189568
-:10001000B3C01895189518951895C8C000E00EBF84
+:10001000189518951895A4C01895C3C000E00EBF98
 :100020000FED0DBF00E808B901E007B906EC06B90D
-:1000300003E00EBD0DEF0DBD0FE80CBD01E00CB9E6
-:100040004FEE00EF0ABB0BBB07E007BBDD27C4E0A8
-:1000500000E3402E502E602E702E70E68827789494
-:10006000EE24FF2430E1359A339A369A44D0332374
-:10007000E9F733983598F694E794F694E79404EF0B
-:1000800011E054D01694079416940794A72FBB2719
-:100090000D921C921197EE24FF2420E10D91E00EA9
-:1000A0000D91F01E8395803111F4A0E688272A95E2
-:1000B000A9F712968395803111F4A0E688277A2F4C
-:1000C00024E0F694E7942A95E1F73DD0A4E0BB271D
-:1000D000012D02950F70002319F40FEF0D9301C04D
-:1000E0001BD0012D906418D09F7B002D029514D059
-:1000F000002D12D0B5CF00E205BF8895002705BFBF
-:10010000089528E0C098000F10F4C19A01C0C1986A
-:10011000C09A2A95B9F70895E8EBF1E00F70E00F67
-:10012000FB1F049196FD0F7D0D930895222420E17D
-:100130001695079510F41E0C2F1C279417940794FE
-:100140002A95B1F7089520E1222411240024FF27E5
-:10015000EE0CFF1C001C111C221C2A9509F40895AA
-:10016000E3E002910D5F03FD00830081005D07FD68
-:100170000083E030B1F7ECCF0F930FB70F930BB3C1
-:10018000006F0BBBC2980991BCDFC29A0BB3006F22
-:1001900004230BBB440F10F04FEEC4E00DEF0DBD78
-:1001A0000FE80CBD0F910FBF0F91189504B1E00E31
-:1001B00005B1F01E3A95189530F32AA2E1A424F275
-:0201C00020A07D
+:1000300004E003BF03E802BF01E009BF4FEE00EF99
+:100040000ABB0BBB07E007BBDD27C4E000E3402E83
+:10005000502E602E702E70E688277894EE24FF24B0
+:1000600020E1359A339A369A45D02223E9F733981E
+:100070003598F694E794F694E79404EF11E04AD0AB
+:100080001694079416940794A72FBB270D921C92E1
+:100090001197EE24FF2420E10D91E00E0D91F01E4A
+:1000A0008395803111F4A0E688272A95A9F7129646
+:1000B0008395803111F4A0E688277A2F24E0F69406
+:1000C000E7942A95E1F733D0A4E0BB27012D0295F0
+:1000D0000F70002319F40FEF0D9301C011D0012D03
+:1000E00090640ED09F7B002D02950AD0002D08D081
+:1000F00001D0B4CF00E205BF8895002705BF089561
+:10010000EEEAF1E00F70E00FFB1F049196FD0F7D0A
+:100110000D930895222420E11695079510F41E0CE6
+:100120002F1C2794179407942A95B1F7089520E17E
+:10013000222411240024FF27EE0CFF1C001C111C9C
+:10014000221C2A9509F40895E3E002910D5F03FD56
+:1001500000830081005D07FD0083E030B1F7ECCF44
+:100160000F930FB70F9303E802BF0BB3006F0BBBE6
+:10017000C298099138E0C098000F10F4C19A01C0EC
+:10018000C198C09A3A95B9F7C29A0BB3006F04238D
+:100190000BBB440F10F04FEEC4E00F910FBF0F9157
+:1001A000189504B1E00E05B1F01E2A95189530F3AC
+:0801B0002AA2E1A424F220A020
 :00000001FF

二进制
model.pdsprj