Ассемблер (ASM) для AVR в вопросах и ответах
компилятор
дайте пожалуйста компилятор для перевода asm в hex для avr все обыскал не где немогу найти
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
nikolenco, ну Вы "загадили"
Уберите лишние посты.
Какие микроконтроллеры пользовать собрались? Если AVR, то как правильно сказали Вам туда и счастлиого пути.
Руководство к действию.
Скачиваем AVR Studio 4
Устанавливаем на компьютер (избегаем путей с русскими буквами)
Создаем проект.
Вставляем код из asm в проект (копируем).
Компилируем.
Наслаждаемся созданным хексом.
Какие микроконтроллеры пользовать собрались? Если AVR, то как правильно сказали Вам туда и счастлиого пути.
Руководство к действию.
Скачиваем AVR Studio 4
Устанавливаем на компьютер (избегаем путей с русскими буквами)
Создаем проект.
Вставляем код из asm в проект (копируем).
Компилируем.
Наслаждаемся созданным хексом.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
-
DrunyaRuma
- Родился
- Сообщения: 1
- Зарегистрирован: Вт мар 02, 2010 23:48:20
- Откуда: Украина, Днепродзержинск
to Esya: прямой команды нет,нужно использовать конструкцию
"чиение-модификация-запись",например:
"чиение-модификация-запись",например:
Код: Выделить всё
in r16,PORTD
andi r16,$45
out PORTD,r16
-
engel65536
- Родился
- Сообщения: 1
- Зарегистрирован: Ср мар 03, 2010 18:38:07
- Откуда: Тула
ATmega16: таймер
Доброго времени суток, уважаемые форумчане. Недавно заинтересовался и начал изучать МК. В данный момент столкнулся с проблемой, причину и решение которой у меня найти не получается.
Я попробовал работать с таймерами по прерываниям, прерывания правильно отрабатываются, но вот частота срабатывания не совпадает с расчётной.
МК mega16, частота кварца 4 МГц, использую таймер T1 (16-битный), прерывание по переполнению, предделитель стоит на CLK/64. Итого частота срабатывания должна быть:
4000000/64/65536 = 0.95 Гц,
т.е. приблизительно должно происходить одно срабатывание в секунду. Однако период гораздо длинней - порядка 4 секунд (т.е. около 0.25 Гц). При каждом срабатывании инвертируется состояние светодиодов на выводах порта A.
В чём проблема - понять не могу... Если кто-то знает возможные причины и решения - буду благодарен за совет. Заранее спасибо за помощь.
Я попробовал работать с таймерами по прерываниям, прерывания правильно отрабатываются, но вот частота срабатывания не совпадает с расчётной.
МК mega16, частота кварца 4 МГц, использую таймер T1 (16-битный), прерывание по переполнению, предделитель стоит на CLK/64. Итого частота срабатывания должна быть:
4000000/64/65536 = 0.95 Гц,
т.е. приблизительно должно происходить одно срабатывание в секунду. Однако период гораздо длинней - порядка 4 секунд (т.е. около 0.25 Гц). При каждом срабатывании инвертируется состояние светодиодов на выводах порта A.
В чём проблема - понять не могу... Если кто-то знает возможные причины и решения - буду благодарен за совет. Заранее спасибо за помощь.
- Вложения
-
- DLED.asm
- Исходный код прошивки
- (1.14 КБ) 319 скачиваний
- MTF
- Нашел транзистор. Понюхал.
- Сообщения: 179
- Зарегистрирован: Чт янв 07, 2010 11:25:12
- Откуда: Москва
Всем Привет !!!!!
to Meteor Если помните недели две назад у меня были проблемы с RC5 , хотел фиксировать длительное и короткое нажатие кнопки , для того чтобы например при нажатии кнопки on off реле включилось и не выключалась даже если я передержал клавишу !!!!
пока инет не работал , пробовал разные варианты , вот один из последних....
применение
Вообщем ничего не получилось , при удержании все равно
переключает реле туда сюда????
Я так понял от управляющего бита походу нельзя отталкиваться для реализации длинного нажатия !!!
Может кто нибуть сказать в чем может быть дело и как правильно надо делать ????
to Meteor Если помните недели две назад у меня были проблемы с RC5 , хотел фиксировать длительное и короткое нажатие кнопки , для того чтобы например при нажатии кнопки on off реле включилось и не выключалась даже если я передержал клавишу !!!!
пока инет не работал , пробовал разные варианты , вот один из последних....
Код: Выделить всё
scan: ;обработка RC5
rcall detect
andi command, 0x7F ; обнулить 7 бит
lds r16, oldcommand
cp r16, command ;если
sts oldcommand, r16
brne endscan1
ori command, 0x80 ; выставить 7 бит
endscan1:
ret
применение
Код: Выделить всё
next:
rcall scan
cpi command,0b00000110 ; on off короткое
breq Key3
; cpi command,0b10000110 ; on off длинное
; breq Key3
rjmp next
KEY1: rcall KPlus ;вызов процедуры нажатия +
rjmp next
KEY2: rcall KMinus
rjmp next
KEY3: rcall KL
rjmp next
KEY4: rcall KL1
........
........
rjmp next
KL: ;обработка кнопки on off
push tmp
in tmp , pinb
sbrs tmp, 3
rjmp SET1
cbi OutPort,(6<<OutPin) ;
rjmp ENDR
SET1:
sbi OutPort,(6<<OutPin) ;
ENDR:
pop tmp
ret
Вообщем ничего не получилось , при удержании все равно
переключает реле туда сюда????
Я так понял от управляющего бита походу нельзя отталкиваться для реализации длинного нажатия !!!
Может кто нибуть сказать в чем может быть дело и как правильно надо делать ????
- Вложения
-
- HG1.JPG
- (83.37 КБ) 243 скачивания
Последний раз редактировалось MTF Пт мар 05, 2010 14:03:31, всего редактировалось 1 раз.
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Так и должно быть, у тебя ведь циклический опрос кнопок, а здесь нужно определять момент отпускания кнопки.
Предположим у нас девайс в положении ON, нажимаем и держим кнопку - фиксируется факт что нажата кнопка ON-OFF и ждем отпускания кнопки (т.е. когда значение прочитанного из порта изменится) и только после это переводим девайс в режим OFF.
Ну и аналогично для OFF.
Предположим у нас девайс в положении ON, нажимаем и держим кнопку - фиксируется факт что нажата кнопка ON-OFF и ждем отпускания кнопки (т.е. когда значение прочитанного из порта изменится) и только после это переводим девайс в режим OFF.
Ну и аналогично для OFF.
- MTF
- Нашел транзистор. Понюхал.
- Сообщения: 179
- Зарегистрирован: Чт янв 07, 2010 11:25:12
- Откуда: Москва
Приветствую GP1!!!
это теперь не надо ????
Не совсем понял , как ловить отпускание кнопки ????
в какой момент надо записывать oldcommand ???
это теперь не надо ????
Код: Выделить всё
scan: ;обработка RC5
rcall detect
andi command, 0x3F ; обнулить 7 и 6 бит
; andi command, 0x7F ; обнулить 7 бит
; lds r16, oldcommand
; cp r16, command ;если
; sts oldcommand, r16
; brne endscan1
; ori command, 0x80 ; выставить 7 бит
;endscan1:
ret
Не совсем понял , как ловить отпускание кнопки ????
Код: Выделить всё
KL: ;обработка кнопки on off
push tmp
lds tmp oldcommand
cp tmp , command
breq ENDR
in tmp , pinb
sbrs tmp, 6
rjmp SET1
cbi OutPort,(6<<OutPin) ;
rjmp ENDR
SET1:
sbi OutPort,(6<<OutPin) ;
ENDR:
pop tmp
ret
в какой момент надо записывать oldcommand ???
Последний раз редактировалось MTF Пт мар 05, 2010 14:52:20, всего редактировалось 2 раза.
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
MTF,
введите переменные управления flag и времени time. тогда обработка будет выглядеть так:
Подправил некоторые нюансы
введите переменные управления flag и времени time. тогда обработка будет выглядеть так:
Код: Выделить всё
control:
sbrc flag, 2; Если уже обработали нажатие
rjmp loop1;то не проверяем
sbic portd, knopka; Проверяем на уровень
rjmp detected_time;Переходим к определению времени нажатия
loop1:
sbis portd, knopka;
rjmp strt_time;Переходим к запуску времени
exit_time:
rcall delay;Задержка
rjmp control;
;====
strt_time: ;проверяем флаг и устанавливаем начало отсчета
sbrs flag,0; если флаг.0 =1, пропускаем очистку регистра
clr time;
cbr flag, 0x02;Убираем признак обработанного нажатия
sbr flag,0x01;Ставим признак события "нажали"
inc time;увеличиаем счетчик
rjmp exit_control;
;====
time_ctrl: ;Проверяем время нажатия
cbr flag,0x01; Сбросили флаг
sbr flag, 0x02; Ставим флаг что обработали
cpi time, var1; С чемто сравниваем
brlo korotkoe;
.......; Чтото делаем с длительным нажатием
.......
rjmp exit_control;
korotkoe: ;
.....; Чтото делаем при краткоременном нажатии
exit_control;
Подправил некоторые нюансы
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
- MTF
- Нашел транзистор. Понюхал.
- Сообщения: 179
- Зарегистрирован: Чт янв 07, 2010 11:25:12
- Откуда: Москва
To Meteor спасибо что откликнулись на мою проблему , я просто никак не могу дотумкать !!!!
код посмотрел только что то не пойму он похож для обработки кнопок расположенных на устройстве , или я что то не понял ???
с кнопками у меня проблем нет я их обрабатываю в прерывании T0 с частотой CK/256
сам таймер T0 работает CK/0 и CK/256
спасибо за помощь GP1 и _noise подсказали как сделать с 2 делениями !!!
а вот с пульта RС5 никак не получается отличать длительное от короткого , за исходник взял Datasheet AVR410 , все бы ничего но не получается нажав на кнопку power пульта RC5 включить реле , еще раз нажать выключилась , проблема в том что если передержать нажатие на кнопку будет щелкать реле туда сюда , разбирались с GP1 вроде обещал подумать !!!
код посмотрел только что то не пойму он похож для обработки кнопок расположенных на устройстве , или я что то не понял ???
с кнопками у меня проблем нет я их обрабатываю в прерывании T0 с частотой CK/256
сам таймер T0 работает CK/0 и CK/256
спасибо за помощь GP1 и _noise подсказали как сделать с 2 делениями !!!
Код: Выделить всё
push tmp
in tmp,sreg
push tmp
;============== CK/0 Hz Section =================
*************
*************
*************
lds tmp, tm2
inc tmp
sts tm2, tmp
tst tmp
brne tm0_exit
;============== CK/256 Hz Section =================
in tmp, pind ; читаем порт D
ori tmp, 0b11001111 ;уст в 1 лишних pd
cpi tmp, 0xff ;
breq K1 ;если все 1 то clr
cp keyold ,tmp ;сравниваем со старым кодом
mov keyold, tmp ;текущий код в keyold
brne K1 ;не совпад со старым кодом кнопки
inc tmkey ;tmkey +1
;короткое
cpi tmkey, 15 ; 0,1 c
brne DL
mov key, keyold
rjmp keyend
DL:
;длинное нажатие
cpi tmkey , 50 ; более 1 c
brne keyend ; если не равно то end
lds tmp, autorpt
sub Tmkey, tmp ; 50 - autorpt (0,3c)
ldi tmp, 0x80 ; 0b10000000
or tmp, keyold ; r16 + KeySold = 80h + Keyold
mov key ,tmp
rjmp keyend
K1:
clr tmkey ;0
; clr Keyold ;0
rjmp keyend
keyend:
**************
**************
tm0_exit:
pop tmp
out sreg,tmp
pop tmp
а вот с пульта RС5 никак не получается отличать длительное от короткого , за исходник взял Datasheet AVR410 , все бы ничего но не получается нажав на кнопку power пульта RC5 включить реле , еще раз нажать выключилась , проблема в том что если передержать нажатие на кнопку будет щелкать реле туда сюда , разбирались с GP1 вроде обещал подумать !!!
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
MTF, какая половая разница какое воздействие отличать?
Я показал как работать с флагами. Думаю (читал посты Ваши и GP1) что он советует тоже самое. Конечно не слово в слово. Но суть одна, надо:
1) выделить 2 флага, один из которых будет соответстовать признаку начала, а второй признаку (GP1 прав на 100^100%) обработки "отпускания";
2) иметь процедуру запуска эталона времени;
3) иметь процедуру сравнения времени по наступлению события "отпустили";
4) иметь признак того что проведена операция распознавания отрезков времени.
Это все приведено примере. Вам остается только "перестроить" под себя.
Я показал как работать с флагами. Думаю (читал посты Ваши и GP1) что он советует тоже самое. Конечно не слово в слово. Но суть одна, надо:
1) выделить 2 флага, один из которых будет соответстовать признаку начала, а второй признаку (GP1 прав на 100^100%) обработки "отпускания";
2) иметь процедуру запуска эталона времени;
3) иметь процедуру сравнения времени по наступлению события "отпустили";
4) иметь признак того что проведена операция распознавания отрезков времени.
Это все приведено примере. Вам остается только "перестроить" под себя.
Последний раз редактировалось Meteor Пт мар 05, 2010 23:45:08, всего редактировалось 1 раз.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Уважаемые колеги, прошу Вашей помощи, поскольку сам, после трех бессонных ночей вошел в ступор, все идеи закончились..
Суть проблемы: Програмуля во вложенном файле выполняется только до первой метки - метка обозначена строкой из восьмерок в коментариях после точки с запятой.
Используется процессор MEGA8535 16PU. Таже програмуля переделанная под ATTINY2313 работает нормально. Для компиляции использую tavrasm.
Подскажите где грабли пожалуйста.. Заранее благодарен.
Суть проблемы: Програмуля во вложенном файле выполняется только до первой метки - метка обозначена строкой из восьмерок в коментариях после точки с запятой.
Используется процессор MEGA8535 16PU. Таже програмуля переделанная под ATTINY2313 работает нормально. Для компиляции использую tavrasm.
Подскажите где грабли пожалуйста.. Заранее благодарен.
- Вложения
-
- code.asm
- (19.46 КБ) 297 скачиваний

алгоритм с 2 флагами понятен попробую переделать..