Страница 5 из 6
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс фев 19, 2012 17:06:48
xkp
появился вопросик: можно ли на tiny13 реализовать одновременно 3 независимых аппаратных ШИМа?
если можно то как?
P.S. наверное я замечтался...
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс фев 19, 2012 17:55:33
Dmitry Dubrovenko
DX168B писал(а):Возьмём строчку rjmp LABEL.
Вместо LABEL, в ПЗУ не вставляется адрес метки, а вставляется число со знаком, которое в результате складывается с текущим содержимым счётчика команд, либо отнимается от него.
Вот давно интересовал этот вопрос.
Пишем-то мы всё-таки LABEL. Т.е. получается, что Ассемблер сам уже вычисляет сколько надо вставить в ПЗУ.
Так что ли?
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс фев 19, 2012 18:04:16
Alexeyslav
Аппаратных - нет. Только два...
Но я делал программный ШИМ 4 канала@8бит с частотой перебора 48Кгц от встроенного тактового генератора 4.8Мгц При этом период повторения импульсов составляет порядка 180Гц, что для светодиодов очень даже неплохо. Все делается в обработчике прерывания таймера который считает до 100 и на все 4 канала уходит порядка 60 тактов из 100, включая такты вызова прерывания(8 тактов на вызов прерывания) и выхода из него(4 такта).
Соответственно меняя битность можно увеличить частоту повторения импульсов или количество каналов. Собственно, больше чем 4 канала на тини 13 и не разместишь(если надо ко всему еще и 1 свободный вход).
Ассемблер сам уже вычисляет сколько надо вставить в ПЗУ.
Именно. и если написать rjmp PC-0x0001 то будет бесконечно выполнятся команда которая стоит непосредственно перед переходом, обычно это SBIC/SBIS или одна из BRxx
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс фев 19, 2012 18:11:32
xkp
вот с програмным шим у меня проблемка... на осцилографе сопли рисует в момент перехода состояния. а текст программы не покажете? или подскажите как написать программный шим на 3 независимых канала.
вообще идея у меня такая: сделать РГБ мигалочку, только за место простого переключения цветов они бы менялись плавно, а скорость переключения менять от АЦП, скорость нарастания/спада - постоянная, либо тоже от ацп, либо от кнопочки.
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс фев 19, 2012 18:26:12
Alexeyslav
я делал 4-канальный ШИМ с управлением по последовательному интерфейсу.
вот собственно содержимое обработчика прерывания таймера:
Код: Выделить всё
#define led_r_on SBI PORTB, PINB2
#define led_r_off CBI PORTB, PINB2
#define led_g_on SBI PORTB, PINB1
#define led_g_off CBI PORTB, PINB1
#define led_b_on SBI PORTB, PINB0
#define led_b_off CBI PORTB, PINB0
#define led_u_on SBI PORTB, PINB4
#define led_u_off CBI PORTB, PINB4
TMR0INT:
; сохранить регистр статуса
IN SREG_INT, SREG
PUSH SREG_INT
INC cyclecount
; Проверяем совпадения c установленными уровнями яркости.
;----- начало блока проверок ------
; ==== КРАСНЫЙ ====
TSTLEDr:
CP cyclecount, LEDrV ; результат = cyclecount - LEDrV
BRSH TSTLEDr_off ; Переход больше или равно, cyclecount >= LEDrV
led_r_on
rjmp TSTLEDg
TSTLEDr_off:
led_r_off
; ==== ЗЕЛЕНЫЙ ====
TSTLEDg:
CP cyclecount, LEDgV ; результат = cyclecount - LEDrV
BRSH TSTLEDg_off ; Переход больше или равно, cyclecount >= LEDrV
led_g_on
rjmp TSTLEDb
TSTLEDg_off:
led_g_off
; ==== СИНИЙ ====
TSTLEDb:
CP cyclecount, LEDbV ; результат = cyclecount - LEDrV
BRSH TSTLEDb_off ; Переход больше или равно, cyclecount >= LEDrV
led_b_on
rjmp TSTLEDu
TSTLEDb_off:
led_b_off
; ==== ФИОЛЕТОВЫЙ ====
TSTLEDu:
CP cyclecount, LEDuV ; результат = cyclecount - LEDrV
BRSH TSTLEDu_off ; Переход больше или равно, cyclecount >= LEDrV
led_u_on
rjmp TSTLED_end
TSTLEDu_off:
led_u_off
TSTLED_end:
;----- конец блока проверок ------
; восстановить регистр статуса?
POP SREG_INT
OUT SREG, SREG_INT
RETI
регистры с именами LEDrV, LEDgV, LEDbV, LEDuV содержат необходимый уровень который нужно поддерживать на выходах, просто в программе меняешь значения этих регистров и все.
Еще одна маленькая особенность алгоритма - 0 - выключен полностью, 255 - на одну единицу не дотягивает до 100% яркости это составляет 0.5% и глазом незаметно.
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс фев 19, 2012 20:16:43
xkp
1. что такое cyclecount?
2. я так понимаю это значение какогото счетчика. где и как его считать?
3. это какой то стандартный регистр или назначеный?
4. если назначеный, нельзя ли в начале (или конце) прерываний поставить cyclecount + 1? и пусть себе считает
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Пн фев 20, 2012 00:33:11
Alexeyslav
Это обыкновенный регистр. Он и считает каждое прерывание.
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Пн фев 20, 2012 14:07:05
xkp
у меня частота получается примерно 18Гц (55ms/период)
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Пн фев 20, 2012 18:13:14
ramid
Ну все правильно
9600000 (тактовая частота по умолчанию) / 8 (CKDIV8 по умолчанию) / 256 (прерывание по переполнению) / 256 (cyclecount) = 18,310546875 Гц
Сними для начала фьюз CKDIV8. Получишь 146,484375 Гц.
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Пн фев 20, 2012 19:09:33
xkp
ой спасибки спасибки, а то я уж было хотел замяукать это все в основной цикл программы. совсем забыл про фьюзики!
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Пн фев 20, 2012 21:47:32
Alexeyslav
Настрой таймер на счет до значения в регистре сравнения. Тогда можно считать до 100 а не до 255 и получишь частоту еще больше, хотя конечно ресурсов основному циклу достанется меньше. я в прерывании еще дополнительно признак выставляю что оно произошло - потом в программе можно использовать для подсчета задержек вместо того чтобы считать такты - считать определенное количество прерываний.
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вт фев 21, 2012 14:16:27
xkp
я убухал туда ячейку памяти, в которой использую 3 бита (red, green, blue соответственно) в основной программе просто задаю нужные биты чеез задержки. в прерываниях смотрю, если соответствующий бит RED (0-бит ячейки памяти) установлен то по каждому переполнению cuclecount добаваляю 1 к яркости LEDrV, соответственно тоже самое для GrEEn (1-бит ячейки памяти) LEDgV и BLUE (2-бит ячейки памяти) LEDbV. добавляю пока не достигнет значения cuclecount, если достиг то не прибавляю. аналогично если битики RGB сброшены, только убавляю до 0.
ДА! прерывания получились больше основной программы, и надо сказать что нарастание (или спад) яркости от 0 до 255 (255-0) длится в районе 0.7 сек. теперь туда надо замяукать несколько табличек с последовательностью зажигания цветов и прикошачить кнопочку
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вт фев 21, 2012 15:31:02
xkp
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вт фев 21, 2012 16:44:00
xkp
что то ни как не вспомню как таблицу засумонить
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вт фев 21, 2012 17:25:02
xkp
ну вот как то так получилось
планирую скорость менять от АЦП и кнопочкой выбирать режимы.
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вт фев 21, 2012 20:14:37
Alexeyslav
Ох, зря наверно ты запихнул все в прерывание... менять значение яркости можно и в основном цикле, и не по одному такту за раз. Так оно ведь и получается ... что от нуля до максимума досчитает примерно за 65000 прерываний таймера.
А зачем таблицу цветов? Советую сделать ГСЧ на основе 32бит регистра сдвига и использовать случайные значения в качестве таблицы. Скорость наростания/спада яркости можно легко регулировать при помощи целочисленной арифметики - считаем числа как 16 битные, но результат берем только старший байт. В результате чего можно к байту прибавлять числа от 255 за такт до 1/255 за такт(одна единица за 255 тактов!) случайным числом выбирать индивидуально направление роста значения и его скорость для каждого цвета в отдельности.
Хорошая идея?
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вт фев 21, 2012 22:29:17
xkp
Alexeyslav писал(а):ГСЧ на основе 32бит
мы уже с другом думали по поводу ГСЧ и пришли к выводу что на МК возможен лишь генератор ПСЕВДО случайных чисел. ведь именно для ГСЧ нужен генератор белого шума замяукивать на ОУ, и уже с ОУ брать на МК.
таблица нужна для того что бы эффекты сочинять самому. первые три бита отвечают за цвета... ммм... где то это я уже писал... ну а спад/нарастание происходит автоматом 1 в бите - наращиваем до 255, 0 - убавляем до 0.
регулировать скорость спада/нарастания мне не нужно, а вот скорость переключения цветов нужно менять.
ГСЧ/ГПСЧ мне не нужен, так как изначально идея стояла что бы мигало так как задано и установлено
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вт фев 21, 2012 22:45:10
Alexeyslav
Жаль, а у меня руки никак не дойдут. Так бы совместными усилиями выработали бы куски кода в копилку. Вот у меня есть разработанный когда-то алгоритм ГСЧ(коенчно же псевдо... однако для таких целей можно считать случайными числами) 32 бит на ассемблере Z80 процессора. Можно было бы использовать кнопку включения как источник начального состояния регистра - просто инкрементировать память занятую регистром пока кнопка нажата.
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вт фев 21, 2012 22:52:39
xkp
ну с кнопкой можно и ГСЧ. у меня в копилке лежит электронный кубик на 13 тини. пока держиш кнопку он перебирает все комбинации с частотой примерно 3мГц. кнопу отпускаеш и загораются соответствующие светодиодики. там же в программе можно задать какие комбинации будут попадаться чаще, какие реже. но у меня стоят поровну. КСТАТИ, проект не доделан, планировал сделать электронную игру "кости" со всеми правилами на мега8 или тини261, а сделал только тестовый кубик на 13 тиньке
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Пт фев 24, 2012 22:18:45
xkp
так. ладно. с мелкими поделками закончили. все таки до нового года еще долго, что б мигалки городить.
у кого нито есть описание на асме как подключить клавиатуру (PS2 или USB) к АВРу, хотя АВРка навряд ли поттянет USB. ну хотя бы PS2. гугль не помогает, все что я там нашел все на СИ.