Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Да просто проверить твой код на любой макетке. Свою я распаял :(
Реклама
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

Сообщение slavik.ksu »

ploop писал(а):Да просто проверить твой код на любой макетке. Свою я распаял :(
просто мне кажется тут все таки дело в STK500, хотя для начала можно и на другой проверить, может зря раньше времени на нее "пальцем тычу" :)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

У меня точно иссякли. Прога чистая.
Docendo discimus
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 383
Зарегистрирован: Пн мар 16, 2009 23:35:42
Откуда: Украина Новоднестровск

Сообщение nibiluk »

Люди понимающие толк в ассемблере, помогите переделать исходник. Собрал чудо с этого сайта, но в программе нет синхронизации. поставил на вход INT0 оптопару пробую соеденить два исходника но никак не получается. Может кто то подсказать где косяки, или расписать по пунктам как это сделать.
Вложения
Stroka.rar
(2.78 КБ) 156 скачиваний
Всем известно что любая микросхема работает на дыме, и если волшебный дым из неё вышел то она перестает работать.
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 111
Зарегистрирован: Вт окт 05, 2010 08:11:41
Откуда: г. Петрозаводск

Сообщение ciph »

Начал разбираться с АЦП (atmega8)

.cseg
.org 0

ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16

ldi R16, 0b11111111
out DDRB,R16

qw:

ldi R16,0b11000000
out ADMUX,R16
ldi R16,0b11100111
sbi ADCSRA,ADSC

in R16,ADCL
in R17,ADCH

OUT portb,R16 ; вывод на portb

rjmp qw

на порт ничего не выводит (опорное внутреннее), что не так?
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

ciph писал(а):.... что не так?
надо дождаться окончания преобраззования АЦП. а вы постоянно его перезапускаете.
Ставим плюсы: )
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 111
Зарегистрирован: Вт окт 05, 2010 08:11:41
Откуда: г. Петрозаводск

Сообщение ciph »

Подправил

.cseg
.org 0

ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16

ldi R16, 0b11111111
out DDRB,R16

qw:

ldi R16,0b11000000
out ADMUX,R16
ldi R16,0b11100111
out ADCSRA,R16

we:
sbis ADCSRA,ADIF
rjmp we

in R16,ADCL
in R17,ADCH

OUT portb,R16 ; ìëàäøèå 8 áèò ðåçóëüòàòà âûâåñòè â portb

rjmp qw
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 33
Зарегистрирован: Чт янв 27, 2011 05:43:01
Откуда: СНГ

Сообщение dave_elektrik »

Доброго времени суток.
Вопрос по программированию.
Кусок кода взят из книги, для изучения алгоритма программы.
Меня интересует строчка "brne PC+2"
Что означает PC +2, иногда встречал +4 или +7.
Start:
sbic PinD,0 ; Кнопка нажата?
rjmp Start ; Нет, остаемся в цикле
inc Counter ; Да, увеличиваем Counter на 1

cpi Counter,10 ; Counter = 10?
brne PC+2 ; Нет, пропускаем команду
clr Counter ; Да, сбрасываем Counter

ldi ZL,20 ; Устанавливаем ZL на R20
add ZL,digit ; Прибавляем Counter к ZL
Id temp,Z ; Считываем Rx в temp
out PortB,temp ; Выводим temp в порт В

rcall Debounce ; Вставляем требуемую задержку
ReleaseWait:
sbis PinD,0 ; Кнопка отпущена?
rjmp ReleaseWait ; Нет, остаемся в цикле
rcall Debounce ; Вставляем требуемую задержку
rjmp Start ; Да, возвращаемся к началу
[size=85]Я знаю немного, но то, что знаю, — знаю в совершенстве.[/size]
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

Сообщение slavik.ksu »

dave_elektrik писал(а): Меня интересует строчка "brne PC+2"
Что означает PC +2,, иногда встречал +4 или +7.
означает "если не равно то переходим на 2(4,7) строчки вперед" может быть еще с "-" например "-2","-5" значит на такое число строк назад!
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

PC - текущее состояние программного счетчика, т.е. адрес выполняемой команды. От него и пляшем.
Docendo discimus
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

pyzhman писал(а):PC - текущее состояние программного счетчика, т.е. адрес выполняемой команды. От него и пляшем.
полностью согласен, добавлю.
Чтобы проще запомнить PC - Program Counter (программный счетчик).
Ставим плюсы: )
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

И я добавлю: такую запись применяют, чтобы не загромождать код метками.
Работает, кстати, не на всех ассемблерах.
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

Сообщение slavik.ksu »

Полный ответ :)
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 33
Зарегистрирован: Чт янв 27, 2011 05:43:01
Откуда: СНГ

Сообщение dave_elektrik »

Всем огромное спасибо за ответы.
И еще последний вопросик,
ploop писал(а):Работает, кстати, не на всех ассемблерах.
как можно используя этот же алгоритм написать программу, если убрать сточку PC+2, используя метку? Прошу показать на примере. Я новичок в этом нелегком деле.
Извиняюсь за нестандартные вопросы.
[size=85]Я знаю немного, но то, что знаю, — знаю в совершенстве.[/size]
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

dave_elektrik писал(а):как можно используя этот же алгоритм написать программу, если убрать сточку PC+2, используя метку? Прошу показать на примере.

Код: Выделить всё

          cpi Counter,10 ; Counter = 10?
          brne METKA1 ; Нет, пропускаем команду
          clr Counter ; Да, сбрасываем Counter
METKA1:  ldi ZL,20 ; Устанавливаем ZL на R20 
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Позволю себе позанудствовать на данную тему.
На мой взгляд, использование конструкций типа "РС+/-чего-то там" является полным выносом мозга, аргументы:
1. при внесении изменений в текст программы нужно пересчитывать это самое "чего-то там" и как следствие - дополнительный источник косяков и залипух
2. использование меток, особливо если им давать осмысленные имена, а не типа "label1", улучшает читаемость программы.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

А вот и нет. Такие конструкции используются там, где между ними по определению ничего вставить нельзя. Например тупое ожидание флага. Ну пусть будет ожидание флага готовности EEPROM:

Код: Выделить всё

SBIC EECR,EEWE ; Ждем флага готовности
RJMP PC-1
Ничего путного сюда не вставишь. С меткой выглядело бы так:

Код: Выделить всё

EE_WAIT:
SBIC EECR,EEWE ; Ждем флага готовности
RJMP EE_WAIT
Согласитесь, первый код короче и нагляднее.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Верно. Такие вещи удобны именно в маленьких циклах, чтобы не изобретать названия меток. Так что PC может быть +-1...3 максимум, ну в крайнем случае в пределах половины экрана редактора.
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Спорить не буду, но мне ближе к сердцу - с метками. :tea:
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Да я бы сказал, что на половину экрана - уже извращение. В том смысле, что ассемблерный код очень часто приходится править, даже после простых конструкций приходят идеи, как их еще упростить/улучшить. Значит - редактировать.
Тут да, на 2-3 шага имеет смысл. Просто чтобы разгрузить код.

Я даже очень часто использую казалось бы не нужные макросы. Ну допустим вместо SBI led_port, led_bit (зажечь светодиод) делаю макрос led_on и led_off. И еще много часто встречающихся вещей в макросы вытаскиваю. Возможно, это затруднит понимание кода другим человеком, но самому писать становится на много удобнее.
Ответить

Вернуться в «AVR»