|
"Домашнее задание"
| |
mimino | Дата: Пятница, 01.06.2012, 01:37 | Сообщение # 16 |
Полковник
Группа: Администраторы
Сообщений: 227
Статус: Offline
| Извините, совсем замотался, у меня сейчас довольно загруженный период. Постараюсь завтра проверить программу вашу, а то сейчас уже башка не варит как надо, а в ассемблере очень легко ошибиться...
|
|
| |
mimino | Дата: Понедельник, 04.06.2012, 23:25 | Сообщение # 17 |
Полковник
Группа: Администраторы
Сообщений: 227
Статус: Offline
| Простите! Вот, что бывает, когда голова задуренная... Я по памяти отвечал на вопросы по заданию, и неправильно его воспроизвел. Я думал, что двумя кнопками надо управлять одним светодиодом, а не наоборот.
В таком случае все можно реализовать просто. Если смотреть по коду программы, приведенному в примере, то в регистр r17 надо записать единицы в оба разряда, где находятся светодиоды. И перед началом основного цикла включить один из светодиодов. А потом тест программы можно оставить тем же. Команда eor будет менять состояние обоих светодиодов на противоположное. А поскольку один из них уже был включен, то они будут работать в противофазе, что и требуется.
И извините, что так долго не отвечал. Накопилась куча неотложных дел...
|
|
| |
GranDAD | Дата: Вторник, 05.06.2012, 10:31 | Сообщение # 18 |
Лейтенант
Группа: Проверенные
Сообщений: 49
Статус: Offline
| Первое задание я уже давно сделал . Только я не знал как записать две единицы вашим способом, (1<<4), так что я тупо нарисал 0b00010001.
Но как я уже писал в #9 посте мне нужна была помошь со вторым заданием, где нужно было управлять двумя светодиодами двумя кнопками.
Ксати успели ли вы просмотреть код поей последней программы? У меня подозрегия что она работает некорректно потому, что я использовал орепетор ret слишком часто.
Quote (mimino) И извините, что так долго не отвечал. Накопилась куча неотложных дел... Ничего, мы никуда не спешим
С уважением GranDaD
Сообщение отредактировал GranDAD - Вторник, 05.06.2012, 12:53 |
|
| |
mimino | Дата: Вторник, 05.06.2012, 15:38 | Сообщение # 19 |
Полковник
Группа: Администраторы
Сообщений: 227
Статус: Offline
| Таак... Ну начать с того, что мне не нравится вот эта строка: Quote ldi r17,(1<<4) ;Загрузка в регистр r17 "1", смещенной на 4 разряда влево out DDRB, r17 ;Копирование из r17 в DDRB (РВ4 - выход) В ней же на выход переводится линия только одного светодиода. Затем вот тут: Quote ldi r16, 0b00000110 ;Загрузка в регистр r16 "1", смещенной на 2 разряда влево
main: ;Основной цикл программы rcall led В регистр r16 загружается константа 0b00000110, которая по идее должна включать подтягивающие резисторы на кнопках, но потом сразу идет вызов подпрограммы led, и кнопки остаются в подвешенном состоянии. Возможно, еще поэтому где-то зацикливается.
Проще всего сделать алгоритм так, как я говорил: два независимых обработчика кнопок, следующих один за другим. Только в первом обработчике сделать не так: Quote sbic PINB, 2 ;Если РВ2=0 (кнопка нажата), пропустить след. строку rjmp main ;Возврат к началу цикла а безусловный переход направить к обработчику второй кнопки, а уже из него возвращаться к метке main. Так и получится, что программа будет постоянно опрашивать обе кнопки.
А с обилием ret я так и не разобрался, честно говоря, больно мудреный алгоритм получился
|
|
| |
GranDAD | Дата: Среда, 06.06.2012, 22:30 | Сообщение # 20 |
Лейтенант
Группа: Проверенные
Сообщений: 49
Статус: Offline
| Эта задача мне никак не дается (пока что)... Так что я просто перепрышнул через нее и пошел дальше. Сегодня сделал задачи из пятого урока. Прикрепить zip архив с кодами не получилось и из-за этого я оставляю прямую ссылку на скачивание.(Что вроде-бы не нарушает правил, если я не прав прошу исправить )
Сообщение отредактировал GranDAD - Среда, 06.06.2012, 23:28 |
|
| |
mimino | Дата: Пятница, 08.06.2012, 15:02 | Сообщение # 21 |
Полковник
Группа: Администраторы
Сообщений: 227
Статус: Offline
| GranDAD, размещение прямых ссылок никаких правил не нарушает Просмотрел я ваши решения. С первым заданием я полностью согласен. А вот со вторым - нет. Реализовывать таймер, чтоб потом внутри него делать обычную задержку - это просто кощунство! В качестве ухищрений я имел в виду снизить насколько возможно тактовую частоту таймера, то есть выставить наибольший возможный делитель. Если этого не хватит, то при каждом срабатывании таймера наращивать какой-то регистр, а когда он достигнет определенной величины, производить переключение светодиода. И никаких задержек! Насчет третьего задания... Оно в принципе верно, но неоптимально. Я бы не стал располагать метку on там, где это сделали вы. Зачем каждый раз переиницализировать контроллер? Лучшее ее перенести куда-то, чтобы в ней выполнялось только разрешение прерывания таймера.
|
|
| |
GranDAD | Дата: Пятница, 08.06.2012, 16:18 | Сообщение # 22 |
Лейтенант
Группа: Проверенные
Сообщений: 49
Статус: Offline
| Спасибо за разьеснения. Тогда во втором задании зделаю так Code ldi r16, (1<<CS01)|(1<<CS02); Итого примерно 5 Гц. А насчет третьего так Code reset: sbi PORTB, 2 ;Включение подтягивающего резистора на РВ2 (кнопка SB1) sbi PORTB, 1 ;Включение подтягивающего резистора на РВ1 (кнопка SB2) ldi r16, RAMEND ;Загрузка в регистр r16 адреса верхней границы ОЗУ out SPL, r16 ;Копирование значения из r16 в регистр указателя стека SPL ldi r16, (1<<CS01)|(1<<CS02);Загрузка двух "1", смещенных на CS00 и CS02 out TCCR0B,r16 ;Копирование значения из регистра r16 в регистр TCCR0B ldi r17,(1<<4) ;Загрузка в регистр r17 "1", смещенной на 4 разр. влево out DDRB, r17 ;Копирование из r17 в DDRB (РВ4 - выход) clr r16 ;Очистка регистра r16 on: ldi r16, (1<<TOIE0) ;Загрузка в регистр r16 "1", смещенной на TOIE0 out TIMSK0,r16 ;Копирование значения из регистра r16 в регистр TIMSK0 sei ;Глобальное разрешение прерываний
Сообщение отредактировал GranDAD - Пятница, 08.06.2012, 17:37 |
|
| |
mimino | Дата: Пятница, 08.06.2012, 16:28 | Сообщение # 23 |
Полковник
Группа: Администраторы
Сообщений: 227
Статус: Offline
| Так во втором же надо не 5 Гц, а 0,5 Гц. В этом вся и хитрость
Насчет третьего уже получше. Хотя можно и sei перенести выше, ничего страшного не произойдет.
|
|
| |
GranDAD | Дата: Пятница, 08.06.2012, 16:39 | Сообщение # 24 |
Лейтенант
Группа: Проверенные
Сообщений: 49
Статус: Offline
| Ой ощибочка вышла. На самом деле частота равна 0.47 то есть примерно 0.5
Сообщение отредактировал GranDAD - Пятница, 08.06.2012, 16:42 |
|
| |
mimino | Дата: Пятница, 08.06.2012, 17:04 | Сообщение # 25 |
Полковник
Группа: Администраторы
Сообщений: 227
Статус: Offline
| Странно, я думал, не удастся базовыми средствами получить такую частоту. Ну ладно, хай буде так!
Как там следующий этап?
|
|
| |
GranDAD | Дата: Пятница, 08.06.2012, 17:12 | Сообщение # 26 |
Лейтенант
Группа: Проверенные
Сообщений: 49
Статус: Offline
| Сейчас пытаютсь сделать первое задание. Есть кое какие затруднения так как у схему я еще физически не собирал (жду когда Attiny13 в DIP корпусе приедет).
А в Proteus'e яркость не меняеться
Quote (mimino) Странно, я думал, не удастся базовыми средствами получить такую частоту. Ну ладно, хай буде так! Кстати несчет этого решения я тоже не уверен, просто решил твою таблицу продолжить (001,010,011,100,101,110) и записать 1 и в CS02 и в CS01 и тогда я предроложил что получиться как бы больший делитель (1024*4=4096)
P.S Ух как повезло. Только что забрал с почты новенкий Attiny13a. У меня несколько вопросов по поводу твоей платы из первого шага. На что лучше заменить R2-R5 (220ohm) 100ohm или 470 ohm. И что это за конденсатор такой C1 10,0x6,3В
Сообщение отредактировал GranDAD - Пятница, 08.06.2012, 19:42 |
|
| |
mimino | Дата: Пятница, 08.06.2012, 20:05 | Сообщение # 27 |
Полковник
Группа: Администраторы
Сообщений: 227
Статус: Offline
| Quote Кстати несчет этого решения я тоже не уверен, просто решил твою таблицу продолжить (001,010,011,100,101,110) и записать 1 и в CS02 и в CS01 и тогда я предроложил что получиться как бы больший делитель (1024*4=4096) Не, максимальный делитель 1024. А дальше там комбинации, которые отвечают за тактирование таймера от внешних импульсов. Так что сие неправильно. Quote На что лучше заменить R2-R5 (220ohm) 100ohm или 470 ohm. Лучше на 470 Ом, если светодиоды красные и на 100 Ом, если зеленые или желтые. Quote И что это за конденсатор такой C1 10,0x6,3В Такая запись означает, что это электролитический конденсатор емкостью 10 мкф, рассчитанный на напряжение не менее 6,3 В.
|
|
| |
GranDAD | Дата: Суббота, 09.06.2012, 00:57 | Сообщение # 28 |
Лейтенант
Группа: Проверенные
Сообщений: 49
Статус: Offline
| Понятно спасибо. Сейчас на макетной плате спаяю и поробую все примеры из первых 5 уроков
Добавлено (09.06.2012, 00:57) --------------------------------------------- Почему то не хочет прошиваться. Какую пограмму используете вы для прошивки мк?
Сообщение отредактировал GranDAD - Суббота, 09.06.2012, 00:58 |
|
| |
mimino | Дата: Суббота, 09.06.2012, 21:30 | Сообщение # 29 |
Полковник
Группа: Администраторы
Сообщений: 227
Статус: Offline
| Смотря каким программатором шью. Если USBasp, то AVRDUDE, а если своим, то соответственно собственной программой. Почитайте там одну из первый статей, я писал об этом, и даже ссылки давал на скачивание.
|
|
| |
GranDAD | Дата: Суббота, 09.06.2012, 21:50 | Сообщение # 30 |
Лейтенант
Группа: Проверенные
Сообщений: 49
Статус: Offline
| Все уже решилось Там чип либо с самого начала был бракованный либо я его спалил. Пришлость делать переходник sop8 в dip8 и использовать мелкие attiny. Сейчас вроде нормально прошивается. Теперь использую eXtreme Burner - AVR так как в AVRDUDE всегда ошибки появляются
|
|
| |
| |