... 1000 строк не так уж и много, а во времена DOSa особой популярностью пользовался TASM, до которого далеко многим ассемблерам. С приходом "окошек" возможность писать на ассемблере не пропала - masm32, fasm и др., да и фанаты не исчезлиKavka писал(а):Когда я учился в университете у нас в группе был парень, который почти всё писал на ассемблере, тогда ещё под ДОС. И проект в тыщу строк для него был обычным делом.
Теория и практика AVR ассемблера.
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
- Реклама
Написал программу, которая складывает состояния двух кнопок, и выдает на выход результат, который выводится на индикацию с помощью двух светодиодов.
Оцените, посоветуйте рецепты по уменьшению кода, если возможно, может более эффективную и/или короткую защиту от дребезга.
ЗЫ. Поставил много бранчей, т.к. не хотелось возиться с таблицей переходов.
ЗЫ2. Писал специально для тини13а.
Код: Выделить всё
.include <tn13Adef.inc>
.dseg
.cseg
ldi R16, low(ramend);инициализация стека
out SPL, R16
ldi R16, 0b100111;настройка портов
out DDRB, R16
ldi R16, 0b011000;включение pull-up резисторов
out PORTB, R16
clr R16
clr R17
;********************
nachalo: in R18, PINB ;проверка состояния кнопок(активное состояние - 0)
lsr R18
lsr R18
lsr R18
cpi R18, 0b000000
breq test
cpi R18, 0b000001
breq test
cpi R18, 0b000010
breq test
cpi R18, 0b000011
breq test
rjmp nachalo
test:
dec R17 ;защита от дребезга и повторная провека
brne test
dec R16
brne test
in R18, PINB
lsr R18
lsr R18
lsr R18
cpi R18, 0b000000
breq var1
cpi R18, 0b000001
breq var2
cpi R18, 0b000010
breq var3
cpi R18, 0b000011
breq var4
rjmp nachalo
var1:
ldi R19, 0b011100;варианты действий
out PORTB, R19
rjmp nachalo
var2:
ldi R19, 0b011001
out PORTB, R19
rjmp nachalo
var3:
ldi R19, 0b011001
out PORTB, R19
rjmp nachalo
var4:
ldi R19, 0b011000
out PORTB, R19
rjmp nachaloЗЫ. Поставил много бранчей, т.к. не хотелось возиться с таблицей переходов.
ЗЫ2. Писал специально для тини13а.
Как-то сложно получается...АндрейАвербах писал(а):Код: Выделить всё
nachalo: in R18, PINB ;проверка состояния кнопок(активное состояние - 0) lsr R18 lsr R18 lsr R18 cpi R18, 0b000000 breq test cpi R18, 0b000001 breq test cpi R18, 0b000010 breq test cpi R18, 0b000011 breq test rjmp nachalo
Код: Выделить всё
nachalo: in R18, PINB ;проверка состояния кнопок(активное состояние - 0)
andi R18,0b11100000 ;отбрасываем 3 младших разряда и проверяем, что 3 старших тоже=0
breq test ;
rjmp nachalo
test:
dec R17 ;защита от дребезга и повторная провека
brne test
dec R16
brne test
CLR R19 ;сброс регистра
SBIS PINB,PB3 ;проверяем первую кнопку, если нажата (=0)
INC R19 ;прибавляем "1"
SBIS PNIB,PB4 ;проверяем вторую кнопку
INC R19
CBI PORTB,PB0 ;выключаем светодиод (всегда)
SBRC R19,0 ;если сумма нечетная
SBI PORTB,PB0 ;зажигаем светодиод
rjmp nachalo
Младшие разряды же пишутся правее.0b11100000 ;отбрасываем 3 младших разряда и проверяем, что 3 старших тоже=0
Замечу, что указатель стека в современных, особенно у малоногих, AVR установлен аппаратно.

- Реклама
Это верно...АндрейАвербах писал(а):Но кто мешает подстраховаться?
"Бережёного Бог бережёт, сказала монашка, натягивая третий презерватив на свечку" 
Ну, ужал программу, как мог. Теперь она при неактивном состояниях обеих кнопок, выводит на индикацию результат предыдущего действия.
Код: Выделить всё
ldi R16, low(ramend);инициализация стека
out SPL, R16
ldi R16, 0b100111;настройка портов
out DDRB, R16
ldi R16, 0b011000;включение pull-up резисторов
out PORTB, R16
clr R16
clr R17
;********************
nachalo: in R18, PINB ;проверка состояния кнопок(активное состояние - 0)
mov R19, R18
andi R18, 0b011000
breq test
andi R19, 0b011000
ori R19, 0b000000
brne test
rjmp nachalo
test:
dec R17 ;защита от дребезга и повторная проверка
brne test
dec R16
brne test
in R18, PINB ;проверка состояния кнопок(активное состояние - 0)
mov R19, R18
andi R18, 0b011000
breq var1
andi R19, 0b011000
ori R19, 0b000000
brne var2
rjmp nachalo
var1: ;варианты действий
ldi R20, 0b011101
out PORTB, R20
rjmp nachalo
var2:
ldi R20, 0b011001
out PORTB, R20
rjmp nachalo
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Ну, я про ближайшее время ничего не говорил. Я к тому, что в перспективе надо знать и то, и то. А сейчас пусть делает то, что делает.в ближайшее время переходить на Си противопоказано
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Так автор как раз и уточнил, что в ближащее время не собирается. А Вы на это ответили, что это он зря. Отсюда и возражения с моей стороны.
Ставим плюсы: )
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
А, это. Проглядел логику, каюсь. Глядел ветку быстро.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
для вышеуказаной задачи ( кнопки-светики от АндрейАвербах ):
стандартная процедура захвата данных по входным линиям плюс табличный декодер состояний
стандартная процедура захвата данных по входным линиям плюс табличный декодер состояний


