Ver Fonte

Recode cyrellic texts to UTF-8.

Vladimir N. Shilov há 8 anos atrás
pai
commit
d67168d1ea
2 ficheiros alterados com 142 adições e 142 exclusões
  1. 20 20
      ReadMe.txt
  2. 122 122
      avm.asm

+ 20 - 20
ReadMe.txt

@@ -1,24 +1,24 @@
 2015.06.04
 
-Четвёртая версия.
-Хочу добить, чтобы окончательно избавиться от мельтешения последних разрядов.
-Идея такая:
- - АЦП на минимальную скорость
- - мерять один раз после обновления индикатора и накапливать результат
- - через 64 измерения посчитать результат и вывести на индикатор
- - опроное напряжение перевести в миливольты.
- - на МК напаять тантал на 100 мкф 6.3 вольта
- - если частоту отображения сделать 200 Гц, то обновление инфы будет чуть чаще 
-   чем 3 раза в сек (3.125 Гц), или можно сдеть 256 Гц, для обновления
-   4 раза в секунду.
- - на 8-ми битном таймере ровных 200 или 256 Гц не сделать.
+Четвёртая версия.
+Хочу добить, чтобы окончательно избавиться от мельтешения последних разрядов.
+�дея такая:
+ - АЦП на минимальную скорость
+ - мерять один раз после обновления индикатора и накапливать результат
+ - через 64 измерения посчитать результат и вывести на индикатор
+ - опроное напряжение перевести в миливольты.
+ - на МК напаять тантал на 100 мкф 6.3 вольта
+ - если частоту отображения сделать 200 Гц, то обновление инфы будет чуть чаще 
+   чем 3 раза в сек (3.125 Гц), или можно сдеть 256 Гц, для обновления
+   4 раза в секунду.
+ - на 8-ми битном таймере ровных 200 или 256 Гц не сделать.
 
-В конце основного цикла спим и ждём любой прерывание.
-По выводу очердной цифры нужно ставить флаг, по которому запускать очередное 
-измерение.
-После 64-х измерений пересчитываем результат.
-Итого, каждое значение будет отображаться 16 циклов.
-Минимальная частота АЦП -- 50 кГц, при 8 МГц тактовой можно сделать 62.5 кГц.
+В конце основного цикла спим и ждём любой прерывание.
+По выводу очердной цифры нужно ставить флаг, по которому запускать очередное 
+измерение.
+После 64-х измерений пересчитываем результат.
+�того, каждое значение будет отображаться 16 циклов.
+Минимальная частота АЦП -- 50 кГц, при 8 МГц тактовой можно сделать 62.5 кГц.
 
-Вроде получилось, нудно проверять.
-392 байта, и 10 байт данных.
+Вроде получилось, нудно проверять.
+392 байта, и 10 байт данных.

+ 122 - 122
avm.asm

@@ -1,21 +1,21 @@
-; Автор:	shilow@ukr.net
-; Дата:		июнь 2015
-; Название:	avm
-; Версия:	4
-; Имя файла: 	avm.asm, avm.spl7, avm.lay6
-; Для AVR:	ATtiny24A
-; Тактовая частота: 8MHz, внутренний RC-генератор
-; Выполняемые функции: Автомобильный вольтемтр
-; см. ReadMe.txt
+; Автор:	shilow@ukr.net
+; Дата:		июнь 2015
+; Название:	avm
+; Версия:	4
+; �мя файла: 	avm.asm, avm.spl7, avm.lay6
+; Для AVR:	ATtiny24A
+; Тактовая частота: 8MHz, внутренний RC-генератор
+; Выполняемые функции: Автомобильный вольтемтр
+; СЃРј. ReadMe.txt
 
 ;******************************
-; инклуды
+; инклуды
 .nolist
 .include "tn24Adef.inc"
 .list
 
 ;******************************
-; опредления
+; опредления
 .def job0	= r0
 .def job1	= r1
 .def job2	= r2
@@ -30,12 +30,12 @@
 ; r11
 ; r12
 ; r13
-.def msrL	= r14	; результат измерений
+.def msrL	= r14	; результат измерений
 .def msrH	= r15
-.def temp	= r16	; рабочая переменная 
+.def temp	= r16	; рабочая переменная 
 .def tmp1	= r17
-.def cnt1	= r18	; рабочий счётчик, счётчик циклов АЦП
-.def cnt2	= r19	; счётчик циклов Led_Out
+.def cnt1	= r18	; рабочий счётчик, счётчик циклов АЦП
+.def cnt2	= r19	; счётчик циклов Led_Out
 .def LEDN	= r20
 ; r21
 ; r22
@@ -44,17 +44,17 @@
 .def flags	= r25
 ; r26 XL OUT_NIBBL
 ; r27 XH
-; r28 YL вывод на ндикатор
+; r28 YL вывод на ндикатор
 ; r29 YH
 ; r30 ZL OUT_NIBBL, BIN2BCD
 ; r31 ZH
 ;******************************
-; константы
+; константы
 .equ AtBCD0	= 0	;address of job0
 .equ AtBCD2	= 2	;address of job2
 .equ AtLED1	= 4	;address of LED1
-.equ MEASURE	= 7	; 7bit of flags -- пора мерять
-.equ NEED_DOT	= 6	; 6bit of flags -- нужна точка
+.equ MEASURE	= 7	; 7bit of flags -- пора мерять
+.equ NEED_DOT	= 6	; 6bit of flags -- нужна точка
 .equ DISP_PORT	= PORTA
 .equ DISP_DDR	= DDRA
 .equ LA1	= 4
@@ -71,21 +71,21 @@
 .equ T1DIVL	= 0x8F
 .equ T1DIVH	= 0xFD	; 0x10000-8MHz/64/200Hz
 ;.equ T0DIV	= 0x83	; 0x100-8MHz/256/250Hz
-.equ VREF	= 4980	; опорное напряжение, миливольты
+.equ VREF	= 4980	; опорное напряжение, миливольты
 .equ SPH	= 0x3e
-.equ DOT_BIT	= 5	; bit5 -- точка
-.equ BuffShift	= 4	; сколько раз сдвинуть вправо сумму буфера для усреднения
+.equ DOT_BIT	= 5	; bit5 -- точка
+.equ BuffShift	= 4	; сколько раз сдвинуть вправо сумму буфера для усреднения
 
 ;******************************
-; макросы
-; сохраняем в стек SREG и R16
+; макросы
+; сохраняем в стек SREG и R16
 .MACRO PUSHF
 	PUSH	R16
 	IN	R16,SREG
 	PUSH	R16
 .ENDM
 
-; восстанавливаем из стека SREG и R16 
+; восстанавливаем из стека SREG и R16 
 .MACRO POPF
 	POP	R16
 	OUT	SREG,R16
@@ -93,24 +93,24 @@
 .ENDM
 
 ;******************************
-; ячейки в СОЗУ
+; ячейки в СОЗУ
 ;.DSEG
 ;.ORG	SRAM_START
-;Display:	.byte 4 ; 4 байта для индикатора
+;Display:	.byte 4 ; 4 байта для индикатора
 ;Buffer:		.byte 2*BuffSize
 
 ;******************************
-; константы в EEPROM
+; константы в 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
@@ -130,18 +130,18 @@
 ;	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, 62.5 kHz
+;;; настроим АЦП. опора - Vcc, канал 1, 62.5 kHz
 	ldi	temp,1<<MUX0
 	out	ADMUX,temp
 	ldi	temp,(1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)
@@ -149,35 +149,35 @@ RESET:
 	ldi	temp,(1<<ADC1D)
 	out	DIDR0,temp
 
-;;; таймер0 интервалы в 4 мсек (250 Hz). прескалер = 256
+;;; таймер0 интервалы в 4 мсек (250 Hz). прескалер = 256
 ;	ldi	temp,(1<<CS02)
 ;	out	TCCR0B,temp
 ;	ldi	temp,T0DIV
-;	out	TCNT0,temp	; запустили таймер
-; прерывания от таймеров
+;	out	TCNT0,temp	; запустили таймер
+; прерывания от таймеров
 ;	ldi	temp,(1<<TOIE0)
-;	out	TIMSK0,temp	; разрешим прерывание по переполнению
+;	out	TIMSK0,temp	; разрешим прерывание по переполнению
 
-;; timer1 - частота 200 гц, при тактовой 8МГц, прескалер=64
+;; timer1 - частота 200 гц, при тактовой 8МГц, прескалер=64
 	ldi	temp,(3<<CS10)
 	out	TCCR1B,temp
 	ldi	temp,T1DIVH
 	out	TCNT1H,temp
 	ldi	temp,T1DIVL
-	out	TCNT1L,temp	; запустили таймер 1
-; разрешаем прерывание от таймера
+	out	TCNT1L,temp	; запустили таймер 1
+; разрешаем прерывание от таймера
 	ldi	temp,1<<TOIE1
 	out	TIMSK1,temp
 
 ;;; init
-	ldi	LEDN,FIRST_LED	; первый индикатор
+	ldi	LEDN,FIRST_LED	; первый индикатор
 	ldi	temp,IND_LA
 	out	DISP_DDR,temp
 	out	DISP_PORT,temp
 	ldi	temp,(1<<SCK)|(1<<DATA)|(1<<LOCK)
 	out	SER_DDR,temp
 	clr	YH
-	ldi	YL,AtLED1	; загружаем адрес 1-го индикатора
+	ldi	YL,AtLED1	; загружаем адрес 1-го индикатора
 	ldi	temp,0x30
 	mov	LED1,temp
 	mov	LED2,temp
@@ -187,53 +187,53 @@ RESET:
 ;;; Enable interrupts
 	sei
 ;******************************
-;;;;; Основная программа
+;;;;; Основная программа
 BEGIN:
 
-;;; Подготовимся к новым измерениям
+;;; Подготовимся к новым измерениям
 	clr	msrL
-	clr	msrH		; очистили хранилище результата
-	ldi	cnt1,64		; загрузили счётчик измерений
-	sbi	ADCSRA,ADIE	; разрешаем прерывания от АЦП
+	clr	msrH		; очистили хранилище результата
+	ldi	cnt1,64		; загрузили счётчик измерений
+	sbi	ADCSRA,ADIE	; разрешаем прерывания от АЦП
 
-;;; Конец цикла, в начале :-)
+;;; Конец цикла, в начале :-)
 MAIN_END:
 	rcall	WAIT_IRQ
 
-;;; Если при выходе из прерывания стоит флаг -- запускаем измерения
-	sbrs	flags,MEASURE	; пора мерять?
-	rjmp	CHECK_MEASURE	; если нет -- идём дальше
-	cbr	flags,1<<MEASURE ; сбросим флаг
+;;; Если при выходе из прерывания стоит флаг -- запускаем измерения
+	sbrs	flags,MEASURE	; пора мерять?
+	rjmp	CHECK_MEASURE	; если нет -- идём дальше
+	cbr	flags,1<<MEASURE ; сбросим флаг
 
-;;; запускаем новый цикл измерений
+;;; запускаем новый цикл измерений
 START_MEASURE:
-	sbi	ADCSRA,ADSC	; запуск нов. преобразования 
-	rjmp	MAIN_END	; и спим дальше
+	sbi	ADCSRA,ADSC	; запуск нов. преобразования 
+	rjmp	MAIN_END	; и спим дальше
 
-;;; Если нет флага, значит прерывание было от АЦП
+;;; Если нет флага, значит прерывание было от АЦП
 CHECK_MEASURE:
-	tst	cnt1		; закончили измерения?
-	brne	MAIN_END	; если нет -- спим дальше
+	tst	cnt1		; закончили измерения?
+	brne	MAIN_END	; если нет -- спим дальше
 
-;; закончили, отключим прерывания
+;; закончили, отключим прерывания
 	cbi	ADCSRA,ADIE
 
-;;; Здесь происходят все преобразования
+;;; Здесь происходят все преобразования
 ML1:
-;; у нас 64 измерения, оверсэмплинг. пока делим на 8
+;; у нас 64 измерения, оверсэмплинг. пока делим на 8
 	lsr	msrH
 	ror	msrL
 	lsr	msrH
 	ror	msrL
 	lsr	msrH
-	ror	msrL		; поделили результат на 2^3
+	ror	msrL		; поделили результат на 2^3
 
-;; теперь нужно умножить на Vref и поделить на 8192 -- получим миливольты на входе АЦП
-;; а затем умножить на 4, чтобы получить напряжение на входе делителя.
-;; т.е. делим на 2048
+;; теперь нужно умножить на Vref и поделить на 8192 -- получим миливольты на входе АЦП
+;; а затем умножить на 4, чтобы получить напряжение на входе делителя.
+;; т.е. делим на 2048
 	ldi	temp,low(VREF)
 	ldi	tmp1,high(VREF)
-	rcall	MPY16U		; отбросили job0 == поделили на 256
+	rcall	MPY16U		; отбросили job0 == поделили на 256
 	lsr	job1
 	ror	job0
 	lsr	job1
@@ -241,80 +241,80 @@ ML1:
 	lsr	job1
 	ror	job0
 
-;; в реале нужно будет множить например на 400 и делить на 100 -- под реальный делитель.
-; тут можно добавить коррекцию усиления.
+;; в реале нужно будет множить например на 400 и делить на 100 -- под реальный делитель.
+; тут можно добавить коррекцию усиления.
 
-; сейчас текущий результат измерний в job1:job0. Перенесём в msr
+; сейчас текущий результат измерний в job1:job0. Перенесём в msr
 	mov	msrH,job1
 	mov	msrL,job0
-; наш результат, это по сути среднее за 64 измерения, в миливольтах, по входу.
+; наш результат, это по сути среднее за 64 измерения, в миливольтах, по входу.
 
-;;; преобразуем msr в десятичный вид и положим в буфер индикатора
+;;; преобразуем msr в десятичный вид и положим в буфер индикатора
 	rcall	bin2BCD16
-	; 5 значащих цифр в job2:job1:job0
+	; 5 значащих цифр в job2:job1:job0
 	ldi	XL,AtLED1
 	clr	XH
-;; первый, старший разряд -- десятки вольт, младший нибл job2
+;; первый, старший разряд -- десятки вольт, младший нибл job2
 	mov	temp,job2
-	; проверим на ведущий 0
-	andi	temp,0x0F	; отсекаем ст ниббл
+	; проверим на ведущий 0
+	andi	temp,0x0F	; отсекаем ст ниббл
 	tst	temp
 	brne	MakeDigit3
-	ldi	temp,0xFF	; код пустого индикатора
+	ldi	temp,0xFF	; код пустого индикатора
 	st	X+,temp
 	rjmp	MakeDigit2
 MakeDigit3:
-	rcall	OUT_NIBBL	; ниббл 3, десятки
-;; второй разряд -- единицы вольт, старший нибл job1
+	rcall	OUT_NIBBL	; ниббл 3, десятки
+;; второй разряд -- единицы вольт, старший нибл job1
 MakeDigit2:
 	mov	temp,job1
 	swap	temp
 	sbr	flags,1<<NEED_DOT
 	rcall	OUT_NIBBL
 	cbr	flags,1<<NEED_DOT
-;; третий разряд -- десятые вольта, младший нибл job1
+;; третий разряд -- десятые вольта, младший нибл job1
 	mov	temp,job1
 	rcall	OUT_NIBBL
-;; четвёртый разряд -- сотые вольта, старший нибл job0
+;; четвёртый разряд -- сотые вольта, старший нибл job0
 	mov	temp,job0
 	swap	temp
 	rcall	OUT_NIBBL
 
-;;; и на новый виток
+;;; и на новый виток
 	rjmp	BEGIN
 
 
 ;******************************
-;;;;; Подпрограммы
+;;;;; Подпрограммы
 
 ;******************************
-; делать нечего - поспим... ждём любое прерывание
+; делать нечего - поспим... ждём любое прерывание
 WAIT_IRQ:
 	ldi	temp,1<<SE
-	out	MCUCR,temp	; простой режим сна
-	sleep			; спим.
+	out	MCUCR,temp	; простой режим сна
+	sleep			; СЃРїРёРј.
 	clr	temp
-	out	MCUCR,temp	; со сна
+	out	MCUCR,temp	; СЃРѕ СЃРЅР°
 	ret
 
 ;******************************
-;** переводим младший ниббл temp в код для 7-сгм инд и кладём его в озу по адр X
+;** переводим младший ниббл temp в код для 7-сгм инд и кладём его в озу по адр X
 OUT_NIBBL:
 	ldi	ZL,low(LEDnd*2)
-	ldi	ZH,high(LEDnd*2); адрес кодов для индикатора
-	andi	temp,0x0F	; отсекаем ст ниббл. получаем смещение
+	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		; записали код в позицию индикатора
+	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
+; перемножение двух 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
@@ -363,59 +363,59 @@ bBCDx_3:ld	temp,-Z		;get (Z) with pre-decrement
 
 
 ;******************************
-;;;;; Обработчики прерываний
+;;;;; Обработчики прерываний
 
 ;******************************
 ; Timer1 Overflow Handler
 TIM1_OVF:
-; выводим данные на 7-ми сегментные индикаторы
+; выводим данные на 7-ми сегментные индикаторы
 	PUSHF
 
 	ldi	temp,T1DIVH
 	out	TCNT1H,temp
 	ldi	temp,T1DIVL
-	out	TCNT1L,temp	; перезапустили таймер 1
+	out	TCNT1L,temp	; перезапустили таймер 1
 
 	;***************************
-	; вывод на индикатор очередной цифры
+	; вывод на индикатор очередной цифры
 	in	temp,DISP_PORT
-	ori	temp,IND_LA	; изменяем только нужные пины
-	out	DISP_PORT,temp	; погасили все индикаторы
-	cbi	SER_PORT,LOCK	; подгтовили защёлку
-	ld	temp,Y+		; в темп - текущая цифра, адрес=+1
+	ori	temp,IND_LA	; изменяем только нужные пины
+	out	DISP_PORT,temp	; погасили все индикаторы
+	cbi	SER_PORT,LOCK	; подгтовили защёлку
+	ld	temp,Y+		; в темп - текущая цифра, адрес=+1
 
-;;; выпихнем очередной байт в регистр
-	ldi	cnt2,8		; счетчик бит
+;;; выпихнем очередной байт в регистр
+	ldi	cnt2,8		; счетчик бит
 TLO1:	cbi	SER_PORT,SCK	; SCK=0
-	lsl	temp		; старший бит в перенос
-	brcc	TLO0		; если в переносе 0 — перейти
-	sbi	SER_PORT,DATA	; выдали 1
+	lsl	temp		; старший бит в перенос
+	brcc	TLO0		; если в переносе 0 — перейти
+	sbi	SER_PORT,DATA	; выдали 1
 	rjmp	TLOE
-TLO0:	cbi	SER_PORT,DATA	; выдали 0
-TLOE:	sbi	SER_PORT,SCK	; SCK=1, сдвиг данных
+TLO0:	cbi	SER_PORT,DATA	; выдали 0
+TLOE:	sbi	SER_PORT,SCK	; SCK=1, сдвиг данных
 	dec	cnt2
 	brne	TLO1
 
-	sbi	SER_PORT,LOCK	; из 0 в 1 -- защёлкивание данных в регистре
+	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		; вышли за границы? проверка 
-	ldi	LEDN,FIRST_LED	; да, загружаем начальное значение
-	ldi	YL,AtLED1	; загружаем адрес 1-го индикатора
+	out	DISP_PORT,temp	; включаем очередной индикатор
+	lsl	LEDN		; сдвинули - следующий индикатор
+	brlo	T1L2		; вышли за границы? проверка 
+	ldi	LEDN,FIRST_LED	; да, загружаем начальное значение
+	ldi	YL,AtLED1	; загружаем адрес 1-го индикатора
 
 T1L2:
-	sbr	flags,1<<MEASURE ; пора мерять
-	;;; выход
+	sbr	flags,1<<MEASURE ; пора мерять
+	;;; выход
 	POPF
 	reti
 
 
 ;***************************
 ; ADC Conversion Handler
-; суммируем результаты измерений, уменьшаем счётчик.
+; суммируем результаты измерений, уменьшаем счётчик.
 ADCC:
 	in	temp,ADCL
 	add	msrL,temp
@@ -425,7 +425,7 @@ ADCC:
 	reti
 
 ;***************************
-; байты для вывода 0-9 на индикаторы с ОА, без точки. точка вкл установкой бита 5
+; байты для вывода 0-9 на индикаторы с ОА, без точки. точка вкл установкой бита 5
 LEDnd:	.DB	0x30,0xF3,0x2A,0xA2,0xE1,0xA4,0x24,0xF2,0x20,0xA0
 
 .exit