Спасибо ошибку устранил: start3: CLV; //Считываем данные АЦП in R17, ADCL; in R16, ADCH; //Записываем считанные данные в регистр. out OCR0A, R16; reti;
Но нечего не поменялось протеус также выдает не изменяемые по скважности импульсы. В чем может быть еще причина.
start3 выполняется и при ADC complete и при Timer0 overflow. В overflow попробуйте снова запустить конверсию. Не углублялся в режимы таймера, нзн.(времени сейчас нет)
_________________ Я всё-всё узнAю и стану профессором.
По идее конверсию надо запускать по прерыванию окончания конверсии и всё (ну и один раз при старте, чтоб закрутилось) а в прерывании от таймера я не знаю что нужно делать (в смысле можно ничего не делать и вообще это прерывание запретить). тогда в прерывании завершения конверсии будет: 1) получение данных преобразования, 2) запись их в регистр сравнения таймера и 3) запуск нового АД преобразования. (изменение регистра сравнения и вызывает изменение уровня ШИМ)
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Добавлено after 1 minute 4 seconds: Я вот так вот сделал и все заработало start3: CLV; //Считываем данные АЦП in R17, ADCL; //ADCH - записываем, ADCL - можно не записывать in R16, ADCH; //Записываем считанные данные в регистр. out OCR0A, R16; SBI ADCSRA, ADSC;//Запуск преобразования reti;
Получается что запуск преобразования нужно запускать каждый раз когда считываем данные с ADCH? Я то думал что при выбора режима - непрерывное преобразования, этого делать не надо.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср янв 17, 2018 16:50:05
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
strengerst писал(а):
Получается что запуск преобразования нужно запускать каждый раз когда считываем данные с ADCH? Я то думал что при выбора режима - непрерывное преобразования, этого делать не надо.
Цитата:
A conversion will be triggered by the rising edge of the selected Interrupt Flag... ...Switching to Free Running mode (ADTS[2:0]=0) will not cause a trigger event, even if the ADC Interrupt Flag is set.
Сбрасывайте флаг ADIF и все само зажжжжужит. А лучше чтобы сбрасывало прерывание от АЦП автоматом.
Спойлер
dgrett писал(а):
С Мегой8 у меня тоже не получилось, запускаю преобразование каждый раз.
Вроде там не должно быть каких-то нюансов.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Недавно начал заниматься программированием AVR, сейчас тренируюсь на tiny2313 на простых задачах (светодиоды, кнопки, энкодер, UART). Написал простейшую программку, которая по внешним прерываниям опрашивает энкодер, инкрементирует/декрементирует значение в регистре и сразу отправляет по UART. Общий вывод энкодера на земле, каналы энкодера подключены ко входам для внешних прерываний INT0, INT1, включены внутренние подтягивающие резисторы. Использую лишь одно из этих прерываний.
Алгоритм простой: 1) Настраиваю прерывание по срезу импульса на INT0 2) Соответственно, когда возникло прерывание, точно известно, что первый канал энкодера переключился из 1 в 0. 3) Проверяю состояние второго канала, который подключен на PD3. 4) Если энкодер вращается в одну сторону (например, по ч.с.), то там будет 1, делаю инкремент регистра Steps. 5) Если энкодер вращается в другую сторону (против ч.с.), то там будет 0, делаю декремент регистра Steps. 5) Посылка Steps по UART. 6) Выход из прерывания.
В основном цикле ничего нет, только "заглушка" rjmp pc.
Проблема в том, что независимо от направления вращения энкодера получается только инкремент (или только декремент, если переход не по sbis, а по sbic). Как будто второй канал энкодера постоянно находится в 1.
Самые очевидные причины проверил: 1) Энкодер исправен, проверял подключением к нему светодиодов и медленным вращением. 2) Каналы энкодера подключены именно к ножкам PD2 (INT0), PD3 (INT1) 3) Эти ножки порта настроены на ввод, подтяжки включены. 4) Прерывание по INT0 разрешено, по INT1 запрещено. 5) Неисправен вход PD3? Пробовал подключать второй канал энкодера на PA0 - результат такой же.
Код:
Int_Ext0: PUSHF
cli ; чтобы дребезг контактов не вызвал ещё одно прерывание
uart_snt: sbis UCSRA,UDRE ; Пропуск, если нет флага готовности rjmp uart_snt ; ждем готовности - флага UDRE out UDR,Steps ; отправляем байт
sei
POPF reti
PUSHF, POPF - макросы для сохранения SREG в стек и извлечения его оттуда. Прописаны в самом начале, до таблицы векторов прерываний. Код пишу в универсальном редкаторе RJ Editor, компилятор tavrasm, загрузчик AVR Dude, программатор USB tiny (самодельный).
П.С. Сигналы на каналах энкодера выглядят так:
_________________ Фак, кот грызёт провод! Сейчас его ударит либо током, либо тапком! ))
Если рассматривается только восходящий фронт - энкодер легко обмануть покачиванием около одного фронта (обозначенного красной стрелкой) покачиваемый около одной точки энкодер будет уверенно считать...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
О том же и разговор бит адресуемого порта тестируется на соответствие и затем выполняется условный переход. Собственно бит и является в данном случае флагом. Это SBIS или SBIC для регистров УВВ (0-31) и SBRC или SBRS для работы с бит-флагами регистрового файла. Другое дело, что с битами - флагами прерываний и флагами SREG вышеприведенные команды работать не будут. (Опять же только в случае, когда те флажки находятся в регистрахРСФ/УВВ с адресами за пределами 0-31).
Только вот состояние именно pin порта (в случае, когда порт настроен как вход) может в любой момент изменится. А поскольку процесс чтения также не мгновенный... Вобщем лучше сначала считать данные во временный регистр, а уж затем делать вывод о состоянии соответствующего бита.
Да, вместо portx нужно писать pinx. При переходе на вектор прерывания флаг I аппаратно сбрасывается. Поэтому в обработчике команда cli бессмысленна.
BOB51 писал(а):
А поскольку процесс чтения также не мгновенный... Вобщем лучше сначала считать данные во временный регистр, а уж затем делать вывод о состоянии соответствующего бита
Поясните ваш поток сознания.
Команду reti можно использовать не только в обработчиках прерывания. Также никто не запрещает использовать команду ret при выходе из обработчика прерывания. Если не нужны прерывания.
Последний раз редактировалось Demiurg Чт янв 18, 2018 14:01:04, всего редактировалось 2 раз(а).
из-за дребезга контактов прерывание может возникнуть несколько раз.
тогда уж флаг прерывания чистить...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения