Ассемблер (ASM) для AVR в вопросах и ответах
- Pink-Pank
- Опытный кот
- Сообщения: 721
- Зарегистрирован: Ср июн 11, 2014 09:43:13
- Откуда: США
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
тогда отфильтровать можно после ключей
Fucking static initialization order fiasco
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Часто делают массив значений ШИМа, хотя бы четверти периода, и по таймеру меняют его же ШИМ. В ATtiny2313 даже на Т0 два канала. Например, настроить OC0A и OC0B (OC1A и OC1B расположены удобнее, но для примера это не важно) на аппаратный ШИМ, а в прерывании по переполнению меняем номер выводимого отсчета и записываем его в OCR0A, OCR0B. В ATtiny25/45/85 можно добавить аппаратное "мертвое время", в tn2313 наверное придется делать его вручную.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Спасибо всем ответившим. Пойду курить мануалы. Давно не имел дела с AVR, успел основательно подзабыть всё
Re: Ассемблер (ASM) для AVR в вопросах и ответах
С таймерами чуть-чуть разобрался, мозги закипели... Уважаемый COKPOWEHEU, пожалуйста, объясните поподробнее
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Что объяснить? Про ШИМ написано и в даташите и у Евстифеева (перевод и компиляция даташитов), повторять это на форуме не имеет смысла.
Про создание массива в общем-то довольно просто. Массив из 256 значений в флеш-памяти, соответствующий значениям синуса по всему периоду, смещенная к середине диапазона char, то есть 127. Получается, значение элемента массива вычисляется по формуле arr[x] = 127+127*sin(2*PI*x/256). Поскольку расчет идет перед компиляцией, вычисление синуса не страшно, массив можно хоть в calc делать. По таймеру (прерывание по переполнению, например) увеличиваете счетчик и берете из массива элемент с индексом, равным счетчику, записываете его в регистры сравнения ШИМ. На соответствующих выходах - синусоида.
Про создание массива в общем-то довольно просто. Массив из 256 значений в флеш-памяти, соответствующий значениям синуса по всему периоду, смещенная к середине диапазона char, то есть 127. Получается, значение элемента массива вычисляется по формуле arr[x] = 127+127*sin(2*PI*x/256). Поскольку расчет идет перед компиляцией, вычисление синуса не страшно, массив можно хоть в calc делать. По таймеру (прерывание по переполнению, например) увеличиваете счетчик и берете из массива элемент с индексом, равным счетчику, записываете его в регистры сравнения ШИМ. На соответствующих выходах - синусоида.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
По мне, чтобы получить чистый ШИМ для всего диапазона, выражение из предыдущего сообщения нужно представить так CODE=128+120*sin(2*pi*X/256). Т.е. будет формироваться синусоида с амплитудой 120 единиц, смещённая на 128 единиц и не будет срыва формирования в экстремальных точках.harrd писал(а):...нужен чистый ШИМ, для подачи на силовые ключи
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вот готовая таблица синуса http://easyelectronics.ru/repository.ph ... iew&id=107
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Доброго времени суток
Начал изучать ассемблер с книги "МК AVR. Вводный курс", автор Мортон. Читал, что в ней много ошибок. Так вот, нужно поочередно включать светодиоды, скорость регулируется двумя кнопками от 0.1 до 1 Гц. Тактовая частота 2.4576 МГц. Суть в том, что частота таймера делится на 1024, получается 2400 Гц. За один цикл отсчитываем 240, получаем 0.1 Гц и используем переменные counter и speed, чтобы задавать количество циклов.
Программа простая и более-менее понятная, запустил в протеусе - первые несколько переключений делает вроде верно (быстро), а потом переходит на частоту 1 Гц и на нажатия кнопок не реагирует. Много раз пересматривал программу - ошибок не нашел. Очень прошу помощи
Скриншоты прилагаю.
МК - AT90S1200
Была мысль, что МК 8-битный, а в переменную mark240 записывается число, большее, чем 255. Но если при превышении значения 255 от значения переменной отнимается 255 (т.е. нужно записать число 260, записывается 5) и таймер считает точно также, то проблема не в этом
[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]
Начал изучать ассемблер с книги "МК AVR. Вводный курс", автор Мортон. Читал, что в ней много ошибок. Так вот, нужно поочередно включать светодиоды, скорость регулируется двумя кнопками от 0.1 до 1 Гц. Тактовая частота 2.4576 МГц. Суть в том, что частота таймера делится на 1024, получается 2400 Гц. За один цикл отсчитываем 240, получаем 0.1 Гц и используем переменные counter и speed, чтобы задавать количество циклов.
Программа простая и более-менее понятная, запустил в протеусе - первые несколько переключений делает вроде верно (быстро), а потом переходит на частоту 1 Гц и на нажатия кнопок не реагирует. Много раз пересматривал программу - ошибок не нашел. Очень прошу помощи
Скриншоты прилагаю.МК - AT90S1200
Была мысль, что МК 8-битный, а в переменную mark240 записывается число, большее, чем 255. Но если при превышении значения 255 от значения переменной отнимается 255 (т.е. нужно записать число 260, записывается 5) и таймер считает точно также, то проблема не в этом
[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 в вопросах и ответах
Суть в том, что частота таймера делится на 1024, получается 2400 Гц. За один цикл отсчитываем 240, получаем 0.1 Гц
Начнем с того, что частота получается 10 Гц.
P.S. Чем ссылки разные, лучше бы код и архив для Протеуса выложили
Fucking static initialization order fiasco
Re: Ассемблер (ASM) для AVR в вопросах и ответах
17.12.2014
Раз не стоит, удалил.neoneon писал(а):но уже не стоит
Последний раз редактировалось akl Ср дек 17, 2014 04:40:59, всего редактировалось 1 раз.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
2 Pink-Pank
Поторопился я с 0.1 Гц, ага
Большое спасибо за оперативную поддержку, но уже не стоит
Нашел ошибку - перепутал sbic и sbis. 100 раз проглядел и не заметил 
Поторопился я с 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
Большое спасибо за оперативную поддержку, но уже не стоит
Полный чайник.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Если генерировать синус из таблицы в 256 байт для экономии места можно расположить только четверть периода в 64 байта и пересчитывать остальные недостающие. Или сейчас уже не актуально экономить с такими большими флешами ?
- Pink-Pank
- Опытный кот
- Сообщения: 721
- Зарегистрирован: Ср июн 11, 2014 09:43:13
- Откуда: США
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Экономия начинает иметь смысл, когда твоя программа вылазит за объемы флеша. А пока все ОК, то зачем же жертвовать быстродействием?
Fucking static initialization order fiasco
- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Можно во флэше хранить четверть периода, а перед началом выполнения программы сгенерить полный период в ОЗУ и оттуда херачить. Быстродействие + экономия памяти.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Выигрыш в быстродействии ровно на 1 такт. ld занимает 2 такта, lpm - 3.
- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Выигрыш во флэше.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Зато потеря в оперативке, которой обычно меньше.
Для какого-то круга задач лучше этот метод, для какого-то - хранение всей таблицы во флеше, а для какого-то даже вычисление на лету. Спорить на тему, какой из них самы-самый лучший во всех ситуациях мне неохота.
Для какого-то круга задач лучше этот метод, для какого-то - хранение всей таблицы во флеше, а для какого-то даже вычисление на лету. Спорить на тему, какой из них самы-самый лучший во всех ситуациях мне неохота.
- Flash.#13
- Держит паяльник хвостом
- Сообщения: 965
- Зарегистрирован: Сб апр 12, 2014 23:46:03
- Откуда: Киев
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Здравствуйте! Косяк вылез при работе с АЦП на Атмега8. Задача состоит в том чтобы произвести последовательно два замера, первый с одной ножки, и через некоторое время второй, с другой ножки АЦП. И так по циклу, типа меряем два напряжения. По одному оно меряется, а два вместе ну ни в какую! Начинает мерить какое то левое скачущее напряжение, вроде помех каких то.
И после 2-го замера получаю цикличный мусор на обеих входах. Ребята чего делаю не так?
Код: Выделить всё
;включаем модуль АЦП и разрешаем прерывания по замеру
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 в вопросах и ответах
Задержку хорошо бы между переключением каналов поставить чтобы напряжение успело устаканиться.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Flash.#13
- Держит паяльник хвостом
- Сообщения: 965
- Зарегистрирован: Сб апр 12, 2014 23:46:03
- Откуда: Киев
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ввел временную задержку и ...немножко подафигел. При малых временных задержках происходит неверный замер. Опытным путем, получил минимальную задержку, на переключение входа АЦП около 1.8сек...
Мне становится жутко, а какое время переключения между входами по мануалу? Может чего либо не допаял на входах АЦП?
Немного файлов по зажиганию: ФУОЗ 2.2 + программа правки таблиц 0.987, монтажка