Страница 26 из 400

Добавлено: Вт дек 22, 2009 16:12:08
ARV
_noise, что у вас за проблема? что-то я никак не пойму...

прошивка

Добавлено: Вт дек 22, 2009 16:50:13
осторожно! леоныч!!!
ARV писал(а):_noise, что у вас за проблема? что-то я никак не пойму...
я ваще ничего не пойму! но мне здесь добрые люди очень помогли с прошивкой!!!!

Добавлено: Вт дек 22, 2009 20:02:54
ARV
_noise писал(а):Практически нужно так:
я вот и интересуюсь: что мешает так делать?

Добавлено: Вт дек 22, 2009 20:08:31
smac
_noise писал(а): Если закомментировать закомментированное -...
А как определено число Offset? Единственное что могу предположить - это то что Offset совпадает либо с адресом регистра специальных функций либо с адресом регистра общего назначения

Добавлено: Ср дек 23, 2009 23:24:41
smac
_noise писал(а): Вопрос: где самдурак?
А ничего, что когда пройдет 8 операций сдвига то в порт выведется 0 и дальнейшее поведение программы не особо поддается предсказанию, ибо SREG вы в прерываниях не сохраняете? Скорее всего в порт будет выводиться 0.

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

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

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

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

Добавлено: Чт дек 24, 2009 10:03:38
GP1
каким образом ты различаешь куда попал, ведь по любому прерыванию у тебя происходит одно и тоже?

Добавлено: Чт дек 24, 2009 10:03:45
ARV
_noise писал(а):Что дебагить?

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

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

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

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

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

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

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

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

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

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

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

Добавлено: Пн дек 28, 2009 00:53:30
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, все равно ничего не получилось. В чем же может быть проблема?

Добавлено: Пн дек 28, 2009 01:03:15
Avatar
Эта строка что сделате ?

begin: in temp, PINC

в Студии посмотрите результат.

Добавлено: Пн дек 28, 2009 01:15:45
Savelek
Эта строка ставит метку begin и записывает в temp значение PINC. Все так и есть - поставил в единицу пару битов в PINC, записал их в PORTD, получилось точно так же.

Добавлено: Пн дек 28, 2009 08:17:49
Meteor
To Savelek
Для контроля кнопок лучше применять команды sbic и sbis. Это даст Вам возможность не делать записи в промежуточный регистр.

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

Добавлено: Пн дек 28, 2009 13:53:07
Savelek
_noise писал(а):1. сразу: антидребезг... не нужен? или которое в конце таковым считается?

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

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

Добавлено: Пн дек 28, 2009 13:55:07
Savelek
_noise писал(а):1. сразу: антидребезг... не нужен? или которое в конце таковым считается?

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

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

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

добавлено: отредактировал, прошил, все работает! Правда, как оказалось, антидребезг необходим - программа реагирует на нажатие кнопки через раз.

Добавлено: Пн дек 28, 2009 16:34:35
SII
Savelek писал(а): 3.Хорошо, теперь я буду оформлять код правильно. Как я понял, в первой колонке метки(или пустота), во второй команды, в третьей аргументы, а в четвертой комментарии?
Угу. А ещё не лениться добавлять пустые строки для разделения логически разных частей программы, ну и всё такое. В общем, оформлять красиво, не лениться в комментариях описывать тонкие моменты и др.

Добавлено: Ср дек 30, 2009 00:27:32
Savelek
При указании границ стека часто используют некие high(RAMEND) и low(RAMEND). Откуда берутся high и low, если в инклуде указан лишь просто RAMEND?

Добавлено: Ср дек 30, 2009 01:35:55
Avatar
Это два байта - старший хай и младший ло - так как число раменд занимает 2 байта.

Добавлено: Ср дек 30, 2009 03:06:49
ibiza11
дополню: high и low - функции компилятора. эти функции выполняются единовременно при компиляции программы, а в hex файл записываются только числа.