Страница 243 из 400
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт дек 11, 2014 17:22:18
Pink-Pank
тогда отфильтровать можно после ключей
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт дек 11, 2014 17:47:34
COKPOWEHEU
Часто делают массив значений ШИМа, хотя бы четверти периода, и по таймеру меняют его же ШИМ. В ATtiny2313 даже на Т0 два канала. Например, настроить OC0A и OC0B (OC1A и OC1B расположены удобнее, но для примера это не важно) на аппаратный ШИМ, а в прерывании по переполнению меняем номер выводимого отсчета и записываем его в OCR0A, OCR0B. В ATtiny25/45/85 можно добавить аппаратное "мертвое время", в tn2313 наверное придется делать его вручную.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт дек 11, 2014 19:04:36
harrd
Спасибо всем ответившим. Пойду курить мануалы. Давно не имел дела с AVR, успел основательно подзабыть всё
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт дек 11, 2014 20:40:03
harrd
С таймерами чуть-чуть разобрался, мозги закипели... Уважаемый COKPOWEHEU, пожалуйста, объясните поподробнее
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт дек 11, 2014 23:00:13
COKPOWEHEU
Что объяснить? Про ШИМ написано и в даташите и у Евстифеева (перевод и компиляция даташитов), повторять это на форуме не имеет смысла.
Про создание массива в общем-то довольно просто. Массив из 256 значений в флеш-памяти, соответствующий значениям синуса по всему периоду, смещенная к середине диапазона char, то есть 127. Получается, значение элемента массива вычисляется по формуле arr[x] = 127+127*sin(2*PI*x/256). Поскольку расчет идет перед компиляцией, вычисление синуса не страшно, массив можно хоть в calc делать. По таймеру (прерывание по переполнению, например) увеличиваете счетчик и берете из массива элемент с индексом, равным счетчику, записываете его в регистры сравнения ШИМ. На соответствующих выходах - синусоида.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт дек 12, 2014 06:22:11
akl
harrd писал(а):...нужен чистый ШИМ, для подачи на силовые ключи
По мне, чтобы получить чистый ШИМ для всего диапазона, выражение из предыдущего сообщения нужно представить так CODE=128+120*sin(2*pi*X/256). Т.е. будет формироваться синусоида с амплитудой 120 единиц, смещённая на 128 единиц и не будет срыва формирования в экстремальных точках.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 14, 2014 23:35:29
*скрыто*
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн дек 15, 2014 15:17:27
neoneon
Доброго времени суток
Начал изучать ассемблер с книги "МК 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]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 16, 2014 07:17:29
Pink-Pank
Суть в том, что частота таймера делится на 1024, получается 2400 Гц. За один цикл отсчитываем 240, получаем 0.1 Гц
Начнем с того, что частота получается 10 Гц.
P.S. Чем ссылки разные, лучше бы код и архив для Протеуса выложили
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 16, 2014 12:33:21
akl
17.12.2014
neoneon писал(а):но уже не стоит

Раз не стоит, удалил.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 16, 2014 18:56:53
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 раз проглядел и не заметил

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт дек 18, 2014 21:35:09
*скрыто*
Если генерировать синус из таблицы в 256 байт для экономии места можно расположить только четверть периода в 64 байта и пересчитывать остальные недостающие. Или сейчас уже не актуально экономить с такими большими флешами ?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт дек 19, 2014 07:42:02
Pink-Pank
Экономия начинает иметь смысл, когда твоя программа вылазит за объемы флеша. А пока все ОК, то зачем же жертвовать быстродействием?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт дек 19, 2014 11:04:52
Gudd-Head
Можно во флэше хранить четверть периода, а перед началом выполнения программы сгенерить полный период в ОЗУ и оттуда херачить. Быстродействие + экономия памяти.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт дек 19, 2014 17:51:00
COKPOWEHEU
Выигрыш в быстродействии ровно на 1 такт. ld занимает 2 такта, lpm - 3.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб дек 20, 2014 14:25:35
Gudd-Head
Выигрыш во флэше.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб дек 20, 2014 15:49:52
COKPOWEHEU
Зато потеря в оперативке, которой обычно меньше.
Для какого-то круга задач лучше этот метод, для какого-то - хранение всей таблицы во флеше, а для какого-то даже вычисление на лету. Спорить на тему, какой из них самы-самый лучший во всех ситуациях мне неохота.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 28, 2014 14:05:54
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-го замера получаю цикличный мусор на обеих входах. Ребята чего делаю не так?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн дек 29, 2014 09:15:12
Gudd-Head
Задержку хорошо бы между переключением каналов поставить чтобы напряжение успело устаканиться.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн дек 29, 2014 16:34:13
Flash.#13
Ввел временную задержку и ...немножко подафигел. При малых временных задержках происходит неверный замер. Опытным путем, получил минимальную задержку, на переключение входа АЦП около 1.8сек...

Мне становится жутко, а какое время переключения между входами по мануалу? Может чего либо не допаял на входах АЦП?