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

Обсуждаем контроллеры компании Atmel.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

второй раз вам говорю: в обработчике прерываний Т0 сразу, как только можно, поставьте sei
я первый раз непонятно высказался?

если вы это сделаете, то прерывание от INT0 (или какое там у вас внешнее) сможет обработаться еще до завершения процедуры обработки прерывания T0
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
xkp
Опытный кот
Аватара пользователя
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров

Сообщение xkp »

Извиняюсь. Не правильно понял. Спасибо. Заработало.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Ср апр 01, 2009 17:52:51

Сообщение harrd »

Здравствуйте, уважаемые. Очень надеюсь на вашу помощь. Делаю преобразователь 12/220, 50 Гц с синусом на выходе. Подобие синуса хочу формировать микроконтроллером. Дело такое, есть attiny2313, требуется выводить последовательно на разные выводы последовательность байт ( ШИМ, чтобы создать грубое подобие синусоиды вида "0010110111011111101110110100", это верхний полупериод (пойдёт на один ключ полумоста), аналогично на другой пин будет выведено тоже самое для нижнего полупериода. Похожих решений нигде не нашёл, поэтому прошу помощи, как примерно реализовать программу (на Cи или ассемблере). Чтобы не связываться с таймерами, чем проще, тем лучше. AVR будет только формировать ШИМ.
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Установили вывод "1"
Подождали
Установили вывод "0"
Подождали
...
Всё сначала.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Эиком - электронные компоненты и радиодетали
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

harrd А почему Вы решили что без таймеров будет проще? С таймерами тоже просто.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

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

Самым простым будет сформировать меандр и пропустить его через пару звеньев RC-фильтра
Fucking static initialization order fiasco
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Ср апр 01, 2009 17:52:51

Сообщение harrd »

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

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

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

Сообщение COKPOWEHEU »

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

Сообщение harrd »

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

Сообщение harrd »

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

Сообщение COKPOWEHEU »

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

Сообщение akl »

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

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

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

Сообщение 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]
Полный чайник.
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

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

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

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

Сообщение akl »

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

Сообщение 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

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

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

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

Экономия начинает иметь смысл, когда твоя программа вылазит за объемы флеша. А пока все ОК, то зачем же жертвовать быстродействием?
Fucking static initialization order fiasco
Контактная информация:
Ответить

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