Ассемблер (ASM) для AVR в вопросах и ответах
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
GP1, при 0x0256. при 0x03FF также. При 0x0000 - 62 цикла. Если не считать RETI в конце, то 59\58 цикла.
Много?
_noise, 92.6 кб кода на C++. Это дебагер M68000. До сих пор не дописан. (Написан лишь дизассемблер, интерфейс, OpenGL экран)
По поводу моего стиля не волнуйся. Я по разному умею названия писать и в разных местах применяю разный стиль.
---
_noise,
Во первых: А код пишу не первый день (и не первую неделю, и не первый месяц, и не первый год) и мне уже как бы проще так писать.
"Автоматическая генерация" уже автоматом входит, т.к. это сокращение от нормальных переменных и сссс9898394 я врядли напишу ибо это не на что не похоже. Не сокращается тогда, когда она состоит из одного слова. Либо из коротких двух. Координата Y разделяющая поля на экране CPU и Memory -> YCM. Ну и в таком плане.
Во вторых: Уж поверь, через полгода я могу узнать что я делал в коде через минуту максимум. Единственное что приходит в голову - это переписать весь тот бред что я написал тогда с 0-ля.
В третих: Ты хочешь сказать, что сможешь написать этот проект ОДИН за короткое время не прерываясь через каждые 30 кб кода на полгода в отдых (от монотонности)? Ну что же, поздравляю. Я так не могу всё время посвещать только написанию кода одной программы.
В четвёртых: Ты сам спросил.
Много?
_noise, 92.6 кб кода на C++. Это дебагер M68000. До сих пор не дописан. (Написан лишь дизассемблер, интерфейс, OpenGL экран)
По поводу моего стиля не волнуйся. Я по разному умею названия писать и в разных местах применяю разный стиль.
---
_noise,
Во первых: А код пишу не первый день (и не первую неделю, и не первый месяц, и не первый год) и мне уже как бы проще так писать.
"Автоматическая генерация" уже автоматом входит, т.к. это сокращение от нормальных переменных и сссс9898394 я врядли напишу ибо это не на что не похоже. Не сокращается тогда, когда она состоит из одного слова. Либо из коротких двух. Координата Y разделяющая поля на экране CPU и Memory -> YCM. Ну и в таком плане.
Во вторых: Уж поверь, через полгода я могу узнать что я делал в коде через минуту максимум. Единственное что приходит в голову - это переписать весь тот бред что я написал тогда с 0-ля.
В третих: Ты хочешь сказать, что сможешь написать этот проект ОДИН за короткое время не прерываясь через каждые 30 кб кода на полгода в отдых (от монотонности)? Ну что же, поздравляю. Я так не могу всё время посвещать только написанию кода одной программы.
В четвёртых: Ты сам спросил.
Последний раз редактировалось IfoR Сб янв 30, 2010 00:31:26, всего редактировалось 1 раз.
- MTF
- Нашел транзистор. Понюхал.
- Сообщения: 179
- Зарегистрирован: Чт янв 07, 2010 11:25:12
- Откуда: Москва
по поводу таймера!!!!
а что если я буду использую таймер ,без деления
например вот так:
вопрос: так можно делать ????
если можно то что можно сделать что бы не использовать регистр для
tmkey , их и так мало ????
а что если я буду использую таймер ,без деления
например вот так:
Код: Выделить всё
T1_OVF:
;код который работает каждые 0,000064 с
***********
***********
***********
inc tmkey ; счетчик от 0 до 256
breq tm_256 ; если 0 то значит таймер отработал 255 раз , т.е далее можно разместить код под срабатывание как с делением на 256 CK/256
rjmp tm_exit
tm_256: ;
;код который работает каждые 0,016384 с
***********
***********
***********
tm_exit:
reti
вопрос: так можно делать ????
если можно то что можно сделать что бы не использовать регистр для
tmkey , их и так мало ????
Последний раз редактировалось MTF Сб янв 30, 2010 02:52:13, всего редактировалось 1 раз.
-
SII
- Вымогатель припоя
- Сообщения: 635
- Зарегистрирован: Пт янв 30, 2009 14:50:35
- Откуда: Солнечногорск
Так делать в принципе можно, однако без регистра не обойтись: АТмега не умеет обрабатывать данные прямо в памяти. Поэтому в реальности надо сохранить в стеке регистр, загрузить в него значение счётчика, увеличить, сохранить обратно, восстановить старое значение регистра... В общем, кода нужно в пять раз больше, чем у Вас
Кстати, 32 регистра -- это очень много
Кстати, 32 регистра -- это очень много
- MTF
- Нашел транзистор. Понюхал.
- Сообщения: 179
- Зарегистрирован: Чт янв 07, 2010 11:25:12
- Откуда: Москва
_noise спасибо за понимание насчет регистров хоть их и 32 ,но всегда нехватает , просто раньше с переменными не имел особо дело, теперь понял ,что делать когда кончаются регистры !!!!
немного доработал ваш код вот что получилось !!!
немного доработал ваш код вот что получилось !!!
Код: Выделить всё
tmkey: .byte 1
T1_OVF:
;код который работает каждые 0,000064 с
***********
***********
lds tmp, tmkey
inc tmp
sts tmkey, tmp
tst tmp
brne tm_exit ; если 0 то значит таймер отработал 255 раз , т.е далее можно разместить код под срабатывание как с делением на 256 CK/256
;код который работает каждые 0,016384 с
***********
***********
***********
tm_exit:
reti
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
_noise писал(а):в частности, есть вероятность, что на момент срабатывания прерывания в регистре (временной переменной) tmp было что-то нужное...
... а в процедуре обработки прерывания на его место запишется шопопало. и после выхода из обработки прерывания продолжим обрабатывать дальше уже шопопало вместо.
добавлю:
в момент вызова обработчика прерывания в SREG тоже кое-какие флаги имеются, поэтому чтобы потом не ломать мозги "почему так получается" сразу дописать 4 строчки в обработчик
Код: Выделить всё
T1_OVF:
push tmp ; сохранили в стек
in tmp,sreg
push tmp
...
tm_exit:
pop tmp
out sreg,tmp
pop tmp ; загрузили из стека обратно
reti- MTF
- Нашел транзистор. Понюхал.
- Сообщения: 179
- Зарегистрирован: Чт янв 07, 2010 11:25:12
- Откуда: Москва
спасибо за помощь GP1 и _noise
все заработало ,особенно после
все заработало ,особенно после
Код: Выделить всё
push tmp ; сохранили в стек
in tmp,sreg
push tmp
- MTF
- Нашел транзистор. Понюхал.
- Сообщения: 179
- Зарегистрирован: Чт янв 07, 2010 11:25:12
- Откуда: Москва
Уважаемые коты спецы по asm , возник вопрос , у меня обработчик кнопок в таймере T0 , есть длительное и короткое нажатие , чтобы отличать короткое от длинного , кнопки сидят на pd0 по pd3 , если кнопки не нажаты на входе будет лог 1 , придумал следующее ,
короткое понятно как можно отследить
т.е 0x1111****
длинное, надо чтобы к коду нажатой кнопки прибавлялся 7 бит равный 0 , т.е 0x0111****
****код кнопки
как сложить правильно еще не дошло ????
Код: Выделить всё
in tmp, pind ;читаем порт D
ori tmp, 0b11110000 ;уст в 1 лишних pd
короткое понятно как можно отследить
Код: Выделить всё
mov key , tmp
т.е 0x1111****
длинное, надо чтобы к коду нажатой кнопки прибавлялся 7 бит равный 0 , т.е 0x0111****
****код кнопки
как сложить правильно еще не дошло ????
- MTF
- Нашел транзистор. Понюхал.
- Сообщения: 179
- Зарегистрирован: Чт янв 07, 2010 11:25:12
- Откуда: Москва
Pooher
это я дурак и походу переработал вчера ,поэтому нес всякий бред ,
хотел различать длинное нажатие от короткого путем прибавления 0 в 7 бит , прошу прошение что заморочил тебе голову ,ты был прав насчет andi
То ли я дурак, то ли поздно уже, но я не понимаю сути. Кого с кем надо сложить?
это я дурак и походу переработал вчера ,поэтому нес всякий бред ,
хотел различать длинное нажатие от короткого путем прибавления 0 в 7 бит , прошу прошение что заморочил тебе голову ,ты был прав насчет andi
Код: Выделить всё
; короткое нажатие
mov key ,tmp
; длинное нажатие
mov key ,tmp
andi key , 0b01111111 ;

