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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

_noise, что у вас за проблема? что-то я никак не пойму...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
осторожно! леоныч!!!
Сверлит текстолит когтями
Сообщения: 1156
Зарегистрирован: Вт дек 09, 2008 20:31:56

прошивка

Сообщение осторожно! леоныч!!! »

ARV писал(а):_noise, что у вас за проблема? что-то я никак не пойму...
я ваще ничего не пойму! но мне здесь добрые люди очень помогли с прошивкой!!!!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

_noise писал(а):Практически нужно так:
я вот и интересуюсь: что мешает так делать?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

_noise писал(а):Если закомментировать закомментированное -...

А как определено число Offset? Единственное что могу предположить - это то что Offset совпадает либо с адресом регистра специальных функций либо с адресом регистра общего назначения
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

_noise писал(а):Вопрос: где самдурак?

А ничего, что когда пройдет 8 операций сдвига то в порт выведется 0 и дальнейшее поведение программы не особо поддается предсказанию, ибо SREG вы в прерываниях не сохраняете? Скорее всего в порт будет выводиться 0.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

сложнсо казать, что у вас не так, только глядя на код, не изучая его в дебаггере... а изучать, как сами понимаете, желания острого нет. но сразу скажу, что мне очень, ну просто очень не по душе принятый вами подход в определении векторов прерываний! и надо же было кому-то научить вас и еще многих других рисовать в программе таблицу из rjmp/reti, якобы соответствующих таблице векторов! ну такую ересь написать (помнится, в какой-то книжке это было, ну и в обучалку переползло) - это просто надо быть диверсантом!

правильно описывать векторы прерываний надо с использованием директивы .org и соответствующей символьной константы из xxxx.inc файла. при этом векторы, которые не используются в программе, и описывать не надо!

просто предполагаю: у вас ошибочка в таблице векторов, в результате прерывание у вас возникает, но попадает не на тот rjmp/reti, что надо, и естественно, обработчик не вызывается.

кстати, разве вы в студии не пробуете в отладчике-симуляторе пройти вашу программу и поглядеть, что реально там у вас происходит и что нет?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

каким образом ты различаешь куда попал, ведь по любому прерыванию у тебя происходит одно и тоже?
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

_noise писал(а):Что дебагить?

ибо мне так удобно.

А обучалки всякоразные даже и ни разу не возникало желания употреблять как таковые.
(когда/если будет в таблице сто векторов - покажется неудобно - сделаю иначе)

тут поработало и перестало.

В отладчике не пробую.

(и вообще не пробую)
гм... вот когда я чего-то не понимаю (работало и вдруг перестало) я пытаюсь разобраться, в чем дело... и в этом случае дебаггер - первый друг: он не ошибается! программа из трех команд может принести сюрприз, который не понять умом (в силу ограниченных способностей, например), но очень хорошо видно глазом в дебаггере - глазу моск не нужен, чтобы видеть. зато после этого и мозг наполняется новым знанием. а из цитат, что я надергал из вашего поста, складывается впечатление, что вам не охота учиться-самообразовываться, тяп-ляп-поехали... не поехали - спросим, почему, и потом поедем...

к сожалению, я уже вышел из того возраста, когда интересно копаться в чужих мигалках и находить конкретные ошибки... потому вам помочь вряд ли смогу... зато я мог бы вам дать системные рекомендации, как писать программы так, чтобы в них было меньше ошибок, а имеющиеся быстрее находились - но вам такое, как мне кажется, не нужно...

так что придется вам продолжать беседовать в этой теме, порой удивляясь и удивляя других сообщениями о том, что проблема в программе решилась путем установки какой-то опции в программаторе (!!!)... кстати, танцы с бубном могут помочь - якутсткие программисты только так и исправляют ошибки в программах :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

_noise писал(а):полагаю невежливым спрашивать: читаете ли вы полностью текст вопросов, которые комментируете, насколько "в общих чертах" вам необходимо и достаточно понять его для написания комментария, имеете ли вы практический опыт работы именно в этой области (с такой микросхемой) в настоящий момент либо в недалёком прошлом. потому не спрашиваю.
что вы, что вы! спрашивайте, не стесняйтесь, для чего же еще нужен форум?! :)
отвечу на незаданный вопрос: я не читаю все подряд, это утомительно. более того: ранее предпринятые неоднократные усилия по прочтению всех животрепещущих тем убедили меня, что обычно в них ведется переливание из пустого в порожнее. поэтому я читаю 2-3 последних сообщения обычно. возможно, это неправильно, но ничего с собой поделать не могу.

что касается вопросов по существу (на счет практического опыта работы), то скажу так: увидев 1 вопробья можно сказать, что видел всех, т.к. они одинаковы. я работал (и продолжаю работать) минимум с десятком разных МК семейства AVR, в том числе много лет исключительно на ассемблере, и, как мне кажется, вполне могу утверждать, что знаю ассемблер AVR очень неплохо, выше среднего уровня - однозначно. что там у вас за МК конкретно - мне не интересно, т.к. ассемблер для всех одинаков, одинаковы и методы отладки и поиска ошибок. так что на этот счет не переживайте :)

P.S. а на счет темы про анекдоты - так тут почти любая тема, как анекдот! :) вы обижаетесь, но ведь не хотите прислушаться к советам! не смешно ли это?!

да, вот еще, дописую: вы тут сказали, что я опять нафлудил... выходит, действительно так. хотя если б вы приняли к сведению предлагаемые мною поправки, а потом, наверняка, последовали бы и другие рекомендации - пользы было бы больше.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Savelek
Прорезались зубы
Сообщения: 221
Зарегистрирован: Сб апр 25, 2009 14:29:05

Сообщение Savelek »

Я только начинаю изучать Ассемблер под AVR. Пытаюсь сделать то, что изображено на картинке ниже:
Изображение
Смысл в том, чтобы при нажатии на кнопку светодиод менял свое состояние на противоположное. Разница между тем, чт опоказано на картинке выше и тем, что у меня лишь в том, что я подключаю и кнопку и светодиод к порту C, светодиод на PC0, а кнопка на PC1.
Вот код того, что я сделал:

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

.include "m8def.inc"
.def temp=r16
ldi temp, low(RAMEND)
out SPL, temp
ldi temp, high(RAMEND)
out SPH, temp
ldi temp, 0b00000001
out DDRC, temp
ldi temp, 0b00000010
out PORTC, temp
//основной цикл
//проверка, нажата ли кнопка
begin:in temp, PINC
sbrc temp, 1//кнопка нажата?
rjmp begin//кнопка не нажата, переход в начало
//переключение светодиода
ldi temp, PINC
sbrc temp, 0//светодиод горит?
rjmp d_off//светодиод горит, выкл. светодиод
sbi PORTC, 0//светодиод не горит, вкл. светодиод
rjmp check_again//переход к проверке кнопки
d_off:cbi PORTC, 0//выкл. светодиод
//проверка, нажата ли кнопка
check_again: ldi temp, PINC
sbrc temp,1//кнопка нажата?
rjmp begin//кнопка не нажата, переход в начало
rjmp check_again//кнопка нажата, проверка еще раз
//******************************************************

Но беда в том, что не работает ни в реальности, ни в студии. Проверял несколько раз - ошибок не увидел. :? Так же пробовал переключать светодиод проверяя на PINC, а PORTC, все равно ничего не получилось. В чем же может быть проблема?
Avatar

Сообщение Avatar »

Эта строка что сделате ?

begin: in temp, PINC

в Студии посмотрите результат.
Аватара пользователя
Savelek
Прорезались зубы
Сообщения: 221
Зарегистрирован: Сб апр 25, 2009 14:29:05

Сообщение Savelek »

Эта строка ставит метку begin и записывает в temp значение PINC. Все так и есть - поставил в единицу пару битов в PINC, записал их в PORTD, получилось точно так же.
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Сообщение Meteor »

To Savelek
Для контроля кнопок лучше применять команды sbic и sbis. Это даст Вам возможность не делать записи в промежуточный регистр.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Meteor писал(а):To Savelek
Для контроля кнопок лучше применять команды sbic и sbis. Это даст Вам возможность не делать записи в промежуточный регистр.
согласен, если кнопка одна. а если кнопок несколько? в этом случае удобнее именно читать в промежуточный регистр сразу все кнопки.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Savelek
Прорезались зубы
Сообщения: 221
Зарегистрирован: Сб апр 25, 2009 14:29:05

Сообщение Savelek »

_noise писал(а):1. сразу: антидребезг... не нужен? или которое в конце таковым считается?

2. ldi temp, PINC - ... ээээ?

3. простыню без пробелов неудобно читать и самому автору тоже (?); write-only, быстрее переписать с нуля заново, чем гадать: есть в этом где-то опечатка или нет там где-нибудь опечатки. какая уж там анализация алгоритма...
Аватара пользователя
Savelek
Прорезались зубы
Сообщения: 221
Зарегистрирован: Сб апр 25, 2009 14:29:05

Сообщение Savelek »

_noise писал(а):1. сразу: антидребезг... не нужен? или которое в конце таковым считается?

2. ldi temp, PINC - ... ээээ?

3. простыню без пробелов неудобно читать и самому автору тоже (?); write-only, быстрее переписать с нуля заново, чем гадать: есть в этом где-то опечатка или нет там где-нибудь опечатки. какая уж там анализация алгоритма...

1.Нет, это не антидребезг. Это проверка, нажата ли все еще кнопка. Без последних строк положение светодиода будет меняться много раз, пока кнопка нажата, а с этой строкой программа ждет, пока кнопку опустят.
2.Точно! Вот где ошибка! Надо было in использовать! Сам бы я ее не нашел... спасибо!
3.Хорошо, теперь я буду оформлять код правильно. Как я понял, в первой колонке метки(или пустота), во второй команды, в третьей аргументы, а в четвертой комментарии?

добавлено:
ой... извините пожалуйста за два поста... вроде нажал "редактировать", изменил, кликнул "отправить", и добавилось новое сообщение.

добавлено: отредактировал, прошил, все работает! Правда, как оказалось, антидребезг необходим - программа реагирует на нажатие кнопки через раз.
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

Savelek писал(а):3.Хорошо, теперь я буду оформлять код правильно. Как я понял, в первой колонке метки(или пустота), во второй команды, в третьей аргументы, а в четвертой комментарии?


Угу. А ещё не лениться добавлять пустые строки для разделения логически разных частей программы, ну и всё такое. В общем, оформлять красиво, не лениться в комментариях описывать тонкие моменты и др.
Аватара пользователя
Savelek
Прорезались зубы
Сообщения: 221
Зарегистрирован: Сб апр 25, 2009 14:29:05

Сообщение Savelek »

При указании границ стека часто используют некие high(RAMEND) и low(RAMEND). Откуда берутся high и low, если в инклуде указан лишь просто RAMEND?
Avatar

Сообщение Avatar »

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

Сообщение ibiza11 »

дополню: high и low - функции компилятора. эти функции выполняются единовременно при компиляции программы, а в hex файл записываются только числа.
Ставим плюсы: )
Ответить

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