Страница 175 из 400
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср янв 30, 2013 08:55:24
Gudd-Head
Alexeyslav писал(а):А не лучше ли масштабировать входное напряжение аналоговым способом?
Нет. Ответ выше.
Alexeyslav писал(а):Не уверен что внутренний ИОН обеспечит хорошую точность
О внутреннем ИОНе речи не было — см. выше.
Alexeyslav писал(а):Да, и как ты собрался достичь 0.5мв, тогда как квант при 12битах и опоре 3.3В составляет примерно 0.8мв?
Никак не собирался, это я ответил
akl, которому не понравилась моя вносимая погрешность 0,013%. К тому же, речь о 10-ти битах.
Kavka писал(а):Занимает порядка 140 байт.
Етить-колотить, модифицированная процедура деления занимает 17 слов!
Kavka писал(а):А, как говорится, слона то и не заметили.
Спойлер
Код: Выделить всё
;******************************************************************************
;* Unsigned multiply of two 16bits numbers with 24bits result.
;* r18:r17:r16 = r23:r22 * r21:r20
;* STATISTICS
;* Cycles : 14 + ret
;* Words : 10 + ret
;* Register usage: r0 to r1, r16 to r18 and r20 to r23 (9 registers)
;******************************************************************************
mul16x16_24:
mul r23, r21 ; ah * bh
mov r18, r0
mul r22, r20 ; al * bl
movw r17:r16, r1:r0
mul r23, r20 ; ah * bl
add r17, r0
adc r18, r1
mul r21, r22 ; bh * al
add r17, r0
adc r18, r1
ret
ОМГ

до этого я как-то не допёр. Это из аппнота или откуда?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср янв 30, 2013 09:05:47
Kavka
Gudd-Head писал(а):Етить-колотить, модифицированная процедура деления занимает 17 слов!
Но работает-то быстее, чем 243 такта.
Gudd-Head писал(а):ОМГ

до этого я как-то не допёр. Это из аппнота или откуда?
Ага, 201-ый.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср янв 30, 2013 09:15:33
Gudd-Head
Kavka писал(а):Но работает-то быстее, чем 243 такта.
Мне торопиться некуда, а флэша всего 8 кбайт
Kavka писал(а):Ага, 201-ый.
Мдя. Я слепой.
Кстати, как допереть или где почитать про нетривиальные операции с двоичными числами? Вот например, смотрю я функцию деления и нифига не понимаю: что-то сдвигается, вычитается, иногда прибавляется, в из флагов Carry получается результат. Или та же процедура BCD...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср янв 30, 2013 09:50:46
Kavka
Gudd-Head писал(а):Мдя. Я слепой.
Бывает. Рад, что помог.
Про деление, ну, самое тривиальное, это как обычное деление в столбик. Только цифр в числах всего две.
Про не тривиальные, это Генри Уоррен "Алгоритмические трюки для программистов" (Hackers Delight), например.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср янв 30, 2013 10:12:39
Gudd-Head
Kavka писал(а):Генри Уоррен "Алгоритмические трюки для программистов" (Hackers Delight), например.
Ооо... почитаем
Итак, товарищи: новая задача. На сей раз тривиальная:
Вывод информации на ЖКИ 44780 по 4-х битному интерфейсу.
Младшая (старшая) тетрада PORTX подключена напрямую к старшей тетраде данных ЖКИ (DB4...DB7).
При вызове функции печати символа его код передаётся в регистре.
У меня получилось 16 маш. слов + возврат, 2 регистра и 1 байт в стэке, 23 такта.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср янв 30, 2013 13:45:12
akl
У меня, примерно, так же. Под спойлером ещё то, о чем был разговор вчера.
Спойлер
Код: Выделить всё
; 30.01.2013
; 29.01.2013
.INCLUDE "2313def.inc"
.CSEG
RESET:
LDI R31,LOW(RAMEND)
OUT SPL,R31
RJMP LCD_OUT
; RJMP ADC_CONVERT
;*************************************************
; Прогон в студии для виртуальной опоры 3300 и 10 разрядного АЦП
; Прогон в студии для виртуальной опоры 3313 и 14 разрядного АЦП
; Прогон в студии для виртуальной опоры 3277 и 16 разрядного АЦП
ADC_CONVERT:
LDS R6,$60
LDS R7,$61
LDS R8,$62
LDS R9,$63 ; занесение константы Ur*64(10р), Ur*4(14р), Ur*1(16р)
LDS R18,$70
LDS R19,$71 ; занесение CODE
;************************************************
; Программа умножения 24 разрядного числа на 16 разрядное число
; R6...R9-MNOGIMOE,R18,R19-MNOGITEL,
; R26...R29-RESULT
; ZL(R30)-TEMP
;************************************************
MULT:
CLR ZH
CLR R26
CLR R27
CLR R28
CLR R29
LDI ZL,16 ; установить счетчик сдвигов
OBRAT:
LSR R18
ROR R19 ; показать значение младшего разряда множителя в С,
BRCC NO_SUMMIR ; С=0 пропустить суммирование
SUMMIR:
; С=1 суммировать значение множимого с частичным результатом
ADD R29,R9
ADC R28,R8
ADC R27,R7
ADC R26,R6
NO_SUMMIR:
LSL R9
ROL R8
ROL R7
ROL R6
DEC ZL
BRNE OBRAT
LSL R28
ADC R27,ZH
ADC R26,ZH ; результат Ux=CODE*Ur*64/65536
RJMP RESET
;**********************************************************************
.equ RS =2
.equ EN =1
; Данные в R20. R21-рабочий. Оба портятся
; 14 слов + возврат, 18 тактов
LCD_OUT:
MOV R21,R20
SWAP R21
ANDI R20,$F0
ANDI R21,$F0
SBR R20,$06 ; добавляем RS+EN
SBR R21,$06
OUT PORTB,R20
NOP
NOP
CBI PORTB,EN
OUT PORTB,R21
NOP
NOP
CBI PORTB,EN
RJMP LCD_OUT
;END
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср янв 30, 2013 20:39:42
ILYAUL
Вот как то так
Код: Выделить всё
LCD_OUT:
MOV R21,R20
SWAP R21
ANDI R20,$F0
SBR R20,$06 ; добавляем RS+EN
OUT PORTB,R20
;+ И готовим второй , чтобы не ставить "тупые" NOP для задержки
ANDI R21,$F0
SBR R21,$06
CBI PORTB,EN
OUT PORTB,R21
Можно убрать и эти , но уже в контексте всей подпрограммы вывода
NOP
NOP
CBI PORTB,EN
RJMP LCD_OUT
;END
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт янв 31, 2013 07:41:42
akl
Да, так лучше. Но есть, правда, момент нарушения временной диаграммы - одновременная подача RS и EN, хотя фронт EN должен быть задержан на 40нс
Когда написал эту команду, внутренний голос стал нашептывать -
"Фигню, паря, пишешь. Как к этому отнесутся hd44780 и ks0066 без проверки неясно..." Поэтому
Спойлер
Код: Выделить всё
.equ RS =2
.equ EN =1
; Данные в R20. R21-рабочий. Оба портятся
; 14 слов + возврат, 18 тактов
LCD_OUT:
MOV R21,R20
SWAP R21
ANDI R20,$F0
SBR R20,$04 ; добавляем RS
; SBR R20,$06 ; добавляем RS+EN
OUT PORTB,R20
SBI PORTB,EN ; взводим EN
;+ И готовим второй , чтобы не ставить "тупые" NOP для задержки
ANDI R21,$F0
SBR R21,$04 ; добавляем RS
; SBR R21,$06
CBI PORTB,EN ; занесение старшей тетрады по спаду EN
OUT PORTB,R21
SBI PORTB,EN ; взводим EN
;Можно убрать и эти , но уже в контексте всей подпрограммы вывода
NOP
NOP
CBI PORTB,EN ; занесение младшей тетрады по спаду EN
RJMP LCD_OUT
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт янв 31, 2013 08:47:41
Gudd-Head
Это всё хорошо когда всё сидит на одном порту. У меня RS и E раскиданы по остальным портам, так что к ним проще обращаться побитово.
А насчёт RS я вообще делаю 2 подпрограммы: одна для вывода данных (RS в режиме ожидания всегда = 1), другая — для вывода команд: устанавливает RS в 0, вызывает первую ПП, перед ret устанавливает RS обратно в 1.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт янв 31, 2013 09:12:27
ILYAUL
Но есть, правда, момент нарушения временной диаграммы - одновременная подача RS и EN,
Начхать, я так же делаю и проблем нет.
одна для вывода данных (RS в режиме ожидания всегда = 1), другая — для вывода данных: устанавливает RS в 0,
Загадка- куда надо вставить слово
command ?

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт янв 31, 2013 09:16:28
Gudd-Head
ILYAUL писал(а):Начхать, я так же делаю и проблем нет.
Не очень понял, как? Выставлять одновременно данные, RS и Е, а потом сбрасывать Е?
Загадка- куда надо вставить слово
command ?


Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт янв 31, 2013 09:20:59
ILYAUL
Не очень понял, как? Выставлять одновременно данные, RS и Е, а потом сбрасывать Е?
Ну да. Как в примере выше. Или выставлять только Е для команд. Только сначала RS и Е . потом данные.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт янв 31, 2013 09:47:27
Kavka
Если эти два сигнала должны всегда идти с задержкой один относительно другого, то может снаружи поставить RC-цепочку на один, и в программе не извращаться?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт янв 31, 2013 09:51:58
ILYAUL
Да брось. Им вообще пофинг всё, главное чтобы на момент сброса Е эти сигналы "твёрдо" обозначали какие идут данные
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт янв 31, 2013 17:59:49
xkp
Всем МУР-мяфки. котейки, подскажите как замерить 2 АЦП на мега8. задача замерить 2 разных уровня. один уровень мерию. а вот как 2 не знаю.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт янв 31, 2013 19:29:33
zero648
Мерить уровни необходимо в один момент времени? Если не критично, то просто нужно переключать мультиплексор каналов АЦП в регистре ADMUX.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт янв 31, 2013 20:41:02
xkp
мерить не в один момент. интервал между измерениями около минуты. но каналы должны быть разные. какие битики отвечают за номер канала АЦП?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт янв 31, 2013 20:47:36
zero648
Биты 2...0 регистра ADMUX
000 = ADC0
001 = ADC1
...
111 = ADC7
Но есть и другие режимы, нужно смотреть даташит на конкретный МК.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт янв 31, 2013 21:31:21
xkp
спасибо. другие режимы не надо. пока хватит и этого.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн фев 04, 2013 18:05:06
gauss
Решил написать такую программку для АЦП (МК - ATmega8):
Код: Выделить всё
.def temp=R16
.def del=R17
.cseg
.org 0
ldi temp,high(RamEnd)
out SPH,temp
ldi temp,low(RamEnd)
out SPL,temp
ldi temp,0b00100000
out ADMUX,temp
Loop:
ldi temp,0b11000111
out ADCSRA,temp
in temp, ADCH
cpi temp, 192
brpl two
cpi temp, 128
brpl red
cpi temp, 64
brpl yellow
ldi temp,0
out PortB,temp
rcall delay
rjmp Loop
Delay:
ldi del,0
Loop1:
dec del
nop
nop
nop
brne Loop1
ldi temp,0b11000000
out ADCSRA,temp
ret
red:
ldi temp,0b00000001
out PortB,temp
rjmp Loop
yellow:
ldi temp,0b00000010
out PortB,temp
rjmp Loop
two:
ldi temp,0b00000011
out PortB,temp
rjmp Loop
Когда значение АЦП от 0 до 64, не горит не один светодиод. Когда от 64 до 127-желтый, от 128 до 191 - красный,
выше - оба.
Вопрос такой: почему светодиоды горят очень тускло, и почему при значении АЦП от 0 до 63 также горят оба светодиода?
П. С.:Насчет тусклости уже понял - забыл настроить порт на вывод.