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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

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

Сообщение Pink-Pank »

тогда отфильтровать можно после ключей
Fucking static initialization order fiasco
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Часто делают массив значений ШИМа, хотя бы четверти периода, и по таймеру меняют его же ШИМ. В ATtiny2313 даже на Т0 два канала. Например, настроить OC0A и OC0B (OC1A и OC1B расположены удобнее, но для примера это не важно) на аппаратный ШИМ, а в прерывании по переполнению меняем номер выводимого отсчета и записываем его в OCR0A, OCR0B. В ATtiny25/45/85 можно добавить аппаратное "мертвое время", в tn2313 наверное придется делать его вручную.
harrd
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Ср апр 01, 2009 17:52:51

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

Сообщение harrd »

Спасибо всем ответившим. Пойду курить мануалы. Давно не имел дела с AVR, успел основательно подзабыть всё
harrd
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Ср апр 01, 2009 17:52:51

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

Сообщение harrd »

С таймерами чуть-чуть разобрался, мозги закипели... Уважаемый COKPOWEHEU, пожалуйста, объясните поподробнее
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Что объяснить? Про ШИМ написано и в даташите и у Евстифеева (перевод и компиляция даташитов), повторять это на форуме не имеет смысла.
Про создание массива в общем-то довольно просто. Массив из 256 значений в флеш-памяти, соответствующий значениям синуса по всему периоду, смещенная к середине диапазона char, то есть 127. Получается, значение элемента массива вычисляется по формуле arr[x] = 127+127*sin(2*PI*x/256). Поскольку расчет идет перед компиляцией, вычисление синуса не страшно, массив можно хоть в calc делать. По таймеру (прерывание по переполнению, например) увеличиваете счетчик и берете из массива элемент с индексом, равным счетчику, записываете его в регистры сравнения ШИМ. На соответствующих выходах - синусоида.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

harrd писал(а):...нужен чистый ШИМ, для подачи на силовые ключи
По мне, чтобы получить чистый ШИМ для всего диапазона, выражение из предыдущего сообщения нужно представить так CODE=128+120*sin(2*pi*X/256). Т.е. будет формироваться синусоида с амплитудой 120 единиц, смещённая на 128 единиц и не будет срыва формирования в экстремальных точках.
Аватара пользователя
*скрыто*
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Пн дек 31, 2012 13:16:59

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

Сообщение *скрыто* »

Вот готовая таблица синуса http://easyelectronics.ru/repository.ph ... iew&id=107
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

Доброго времени суток :)
Начал изучать ассемблер с книги "МК AVR. Вводный курс", автор Мортон. Читал, что в ней много ошибок. Так вот, нужно поочередно включать светодиоды, скорость регулируется двумя кнопками от 0.1 до 1 Гц. Тактовая частота 2.4576 МГц. Суть в том, что частота таймера делится на 1024, получается 2400 Гц. За один цикл отсчитываем 240, получаем 0.1 Гц и используем переменные counter и speed, чтобы задавать количество циклов.
Программа простая и более-менее понятная, запустил в протеусе - первые несколько переключений делает вроде верно (быстро), а потом переходит на частоту 1 Гц и на нажатия кнопок не реагирует. Много раз пересматривал программу - ошибок не нашел. Очень прошу помощи :dont_know: Скриншоты прилагаю.
МК - AT90S1200

Была мысль, что МК 8-битный, а в переменную mark240 записывается число, большее, чем 255. Но если при превышении значения 255 от значения переменной отнимается 255 (т.е. нужно записать число 260, записывается 5) и таймер считает точно также, то проблема не в этом :dont_know:

[url=http://img.radiokot.ru/files/100717/medium/iu1iko758.png]

[url=http://img.radiokot.ru/files/100717/medium/iu1ir2d1a.png]

[url=http://img.radiokot.ru/files/100717/medium/iu1ir3y5j.png]
Полный чайник.
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

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

Сообщение Pink-Pank »

Суть в том, что частота таймера делится на 1024, получается 2400 Гц. За один цикл отсчитываем 240, получаем 0.1 Гц

Начнем с того, что частота получается 10 Гц.

P.S. Чем ссылки разные, лучше бы код и архив для Протеуса выложили
Fucking static initialization order fiasco
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

17.12.2014
neoneon писал(а):но уже не стоит :)
Раз не стоит, удалил.
Последний раз редактировалось akl Ср дек 17, 2014 04:40:59, всего редактировалось 1 раз.
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

2 Pink-Pank
Поторопился я с 0.1 Гц, ага :)

akl писал(а):neoneon А так правильно?
Спойлер

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

   .INCLUDE "1200def.inc"

   .def   temp=R16
   .def   Mark240=R17
   .def   Counter=R18
   .def   Speed=R19

.CSEG
INIT:
   SER   R22
   OUT   DDRB,R22
   LDI   R23,0b00000001
   OUT   PORTB,R23
   
   LDI   R24,0b00000011
   OUT   DDRD,R22
   OUT   PORTD,R24
   COM   R24
   OUT   DDRD,R24

   LDI   TEMP,5
   OUT   TCCR0,TEMP

   LDI   Mark240,240   
   LDI   Counter,5   
   LDI   Speed,5
START:
   SBIC   PIND,0   ; <
   RJMP   UPTEST
   INC   SPEED
   CPI   SPEED,11
   BRNE   RELEASEDOWN
   DEC   SPEED
RELEASEDOWN:
   SBIS   PIND,0   ; <
   RJMP   RELEASEDOWN
UPTEST:
   SBIC   PIND,1
   RJMP   TIMER
   DEC   SPEED
   BRNE   RELEASEUP
   INC   SPEED
   
RELEASEUP:
   SBIS   PIND,1
   RJMP   RELEASEUP
TIMER:
   IN   TEMP,TCNT0
   CP   TEMP,MARK240
   BRNE   TIMER
   
   IN   R1,TCNT0
   INC   R1
   OUT   TCNT0,R1
   
;   SUBI   MARK240,-240
   DEC   COUNTER
   BRNE   START
   
   SUBI   MARK240,-240
;   MOV   COUNTER,SPEED
   IN   TEMP,PORTB
   LSL   TEMP
   BRCC   GO
   LDI   TEMP,0b00000001
GO:
   MOV   COUNTER,SPEED
   OUT   PORTB,TEMP

   RJMP   START

Большое спасибо за оперативную поддержку, но уже не стоит :) Нашел ошибку - перепутал sbic и sbis. 100 раз проглядел и не заметил :?
Полный чайник.
Аватара пользователя
*скрыто*
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Пн дек 31, 2012 13:16:59

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

Сообщение *скрыто* »

Если генерировать синус из таблицы в 256 байт для экономии места можно расположить только четверть периода в 64 байта и пересчитывать остальные недостающие. Или сейчас уже не актуально экономить с такими большими флешами ?
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

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

Сообщение Pink-Pank »

Экономия начинает иметь смысл, когда твоя программа вылазит за объемы флеша. А пока все ОК, то зачем же жертвовать быстродействием?
Fucking static initialization order fiasco
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Можно во флэше хранить четверть периода, а перед началом выполнения программы сгенерить полный период в ОЗУ и оттуда херачить. Быстродействие + экономия памяти.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Выигрыш в быстродействии ровно на 1 такт. ld занимает 2 такта, lpm - 3.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Выигрыш во флэше.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Зато потеря в оперативке, которой обычно меньше.
Для какого-то круга задач лучше этот метод, для какого-то - хранение всей таблицы во флеше, а для какого-то даже вычисление на лету. Спорить на тему, какой из них самы-самый лучший во всех ситуациях мне неохота.
Аватара пользователя
Flash.#13
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Сб апр 12, 2014 23:46:03
Откуда: Киев

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

Сообщение Flash.#13 »

Здравствуйте! Косяк вылез при работе с АЦП на Атмега8. Задача состоит в том чтобы произвести последовательно два замера, первый с одной ножки, и через некоторое время второй, с другой ножки АЦП. И так по циклу, типа меряем два напряжения. По одному оно меряется, а два вместе ну ни в какую! Начинает мерить какое то левое скачущее напряжение, вроде помех каких то.

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

;включаем модуль АЦП и разрешаем прерывания по замеру
ldi R16, 0b01000000   ;AD_Converter ADMUX byte, включаем опорное напряжение +5в, АЦП выв.0
out ADMUX, R16
ldi R16, 0b10001011   ;AD_Converter ADCSRA byte, делитель 125kHz, и прерывание ЦП по замеру
out ADCSRA, R16         
sei          ;вкл. прерывания в ЦП
...
;делаем замер включая бит замера АЦП
sbi ADCSRA,6      ;старт замера АЦП
...
ldi R16, 0b01000001             ;меняем ножку АЦП на "1"
out ADMUX, R16      ;ставим на вход ножку АЦП "1"
sbi ADCSRA,6      ;старт 2-го замера АЦП


И после 2-го замера получаю цикличный мусор на обеих входах. Ребята чего делаю не так?
Немного файлов по зажиганию: ФУОЗ 2.2 + программа правки таблиц 0.987, монтажка
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Задержку хорошо бы между переключением каналов поставить чтобы напряжение успело устаканиться.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Flash.#13
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Сб апр 12, 2014 23:46:03
Откуда: Киев

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

Сообщение Flash.#13 »

Ввел временную задержку и ...немножко подафигел. При малых временных задержках происходит неверный замер. Опытным путем, получил минимальную задержку, на переключение входа АЦП около 1.8сек... :shock: Мне становится жутко, а какое время переключения между входами по мануалу? Может чего либо не допаял на входах АЦП?
Немного файлов по зажиганию: ФУОЗ 2.2 + программа правки таблиц 0.987, монтажка
Ответить

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