Пожалуйста помогите чайнику с Binary Angle Modulation
Там же описано какие проблемы есть у ВАМ и где они совпадают с ШИМ.
- Реклама
Такой же как в программе поиска максимального значения из трех переменных и больше ничего не делающей. Но в учебниках по программированию таких задач полно и по таким учебникам учатся программеры.COKPOWEHEU писал(а): Какой вообще смысл от выставления заранее заданной яркости заранее заданным диодам?
Это проблемы безмозглых копипастеров.COKPOWEHEU писал(а):И вы гарантируете, что это прерывание не будет скопировано в другие проекты?
так то оно так, но цитата моего поста не в тему совсем.ILYAUL писал(а):Там же описано какие проблемы есть у ВАМ и где они совпадают с ШИМ
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Короче, что-то мне этот ВАМ не понравился..
Теперь хочу обычный софтовый ШИМ на 8 каналов...
Однако, до меня не доходит блин! Запускал три канала ШИМ железных - все прекрасно работает и регулируется. А вот софтовый туплю.
Я так понял, что таймер настроен по переполнению. Пусть будет обычный 8 битный таймер. Считает он до 256.
При срабатывании прерывания по переполнению мы увеличиваем переменную-счетчик, с которой сравниваем все заданные каналы. И если есть совпадение, то выставляем в порту единичку, а если нету, то нолик.
Когда счетчик досчитал до 256 (обнулился), все сначала начинается...
Получается, если без предделителей таймер пашет, то при 8 МГц тактирования будет 8000000/256/256=122 Гц. Так?
А что будет если совпал у меня счетчик и выставил в порту единицу. А на следующем цикле счетчик увеличился и теперь уже не совпадает, значит сбросит порт в ноль. Какой же это ШИМ? Где-то собака порылась?
Теперь хочу обычный софтовый ШИМ на 8 каналов...
Я так понял, что таймер настроен по переполнению. Пусть будет обычный 8 битный таймер. Считает он до 256.
При срабатывании прерывания по переполнению мы увеличиваем переменную-счетчик, с которой сравниваем все заданные каналы. И если есть совпадение, то выставляем в порту единичку, а если нету, то нолик.
Когда счетчик досчитал до 256 (обнулился), все сначала начинается...
Получается, если без предделителей таймер пашет, то при 8 МГц тактирования будет 8000000/256/256=122 Гц. Так?
А что будет если совпал у меня счетчик и выставил в порту единицу. А на следующем цикле счетчик увеличился и теперь уже не совпадает, значит сбросит порт в ноль. Какой же это ШИМ? Где-то собака порылась?
Станислав
- Реклама
как только совпал - устанавливаем уровень, а сбрасываем все сразу только в момент "переполнения" счетчика
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Все. Понял.
Спасибо огромное! 
Отдельно признателен за оперативность. Не ожидал такой скорости.
Отдельно признателен за оперативность. Не ожидал такой скорости.
Станислав
на здоровье. можно еще проверять не на равенство, а на "больше или равно", тогда сбрасывать отдельно ничего не придется - само сбросится, когда счетчик обнулится.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Можно обойтись без сравнений, просто выводя из предварительно заполненного буфера.СКАЗОЧНИК писал(а):Теперь хочу обычный софтовый ШИМ на 8 каналов...
Спойлер
Код: Выделить всё
.INCLUDE "m8def.inc"
.equ Fo=8000000
.org 0x0000
RESET:
RJMP START
;*****************
.org 0x0004
OVER_T2:
IN R15,SREG
LD R20,Z
OUT PORTB,R20
INC ZL
OUT SREG,R15
RETI
;*****************
;*****************
;*****************
START:
SER ZH
OUT SPL,ZH
OUT DDRB,ZH
CLR ZH
OUT SPH,ZH
RCALL BUFER_RAM
LDI ZH,HIGH($100)
LDI ZL,LOW($100)
LDI R21,1<<SE
OUT MCUCR,R21 ; режим SLEEP IDLE
GO:
LDI R21,1<<TOIE2 ;разрешение прерывания сравнения T2
OUT TIMSK,R21
OUT TIFR,R21
LDI R21,$01
OUT TCCR2,R21
CLT
SEI
WAIT:
SLEEP
BRTC WAIT
;признак изменения буфера установлен
CLT
RCALL BUFER_RAM
RJMP WAIT
BUFER_RAM:
;заполнение буфера
RET
.EXITСделал так, как Роман (ARV) описал.
Все работает. Переменные Capture1-8 заданы при инициализации.
Теперь мне надо их плавно менять, а у меня все виснет при этом, если их менять в главном цикле, да еще и задержку если поставить.
Посмотрел в симуляторе, если я правильно понял, то у меня на прерывание уходит 64 такта. А т.к. всего у меня между прерываниями есть 240 примерно тактов, то у меня еще есть 176 свободных, чтобы не просрать очередное прерывание?
Как их сделать, чтобы пуеременные менялись где-то?
Спойлер
Код: Выделить всё
OVF0_:
ldi temp, 01
out TCNT0, temp ; Перезагрузка таймера (актуально, если период меньше 255, иначе можно убрать)
inc Sravnenie
K1: lds temp, Capture1
cp Sravnenie, temp
brsh PC+3 ; Если Sravnenie равно или больше, то переходим, где ставим вывод в единицу
cbi Tport, Tpin ; Иначе, Сравнение меньше, значит сбрасываем вывод на ноль
rjmp K2
sbi Tport, Tpin ; Включаем вывод
K2: lds temp, Capture2
cp Sravnenie, temp
brsh PC+3 ; Если Sravnenie равно или больше, то переходим, где ставим вывод в единицу
cbi Oport, Opin ; Иначе, Сравнение меньше, значит сбрасываем вывод на ноль
rjmp K3
sbi Oport, Opin ; Включаем вывод
K3: lds temp, Capture3
cp Sravnenie, temp
brsh PC+3 ; Если Sravnenie равно или больше, то переходим, где ставим вывод в единицу
cbi Uport, Upin ; Иначе, Сравнение меньше, значит сбрасываем вывод на ноль
rjmp K4
sbi Uport, Upin ; Включаем вывод
K4: lds temp, Capture4
cp Sravnenie, temp
brsh PC+3 ; Если Sravnenie равно или больше, то переходим, где ставим вывод в единицу
cbi Report, Repin ; Иначе, Сравнение меньше, значит сбрасываем вывод на ноль
rjmp K5
sbi Report, Repin ; Включаем вывод
K5: lds temp, Capture5
cp Sravnenie, temp
brsh PC+3 ; Если Sravnenie равно или больше, то переходим, где ставим вывод в единицу
cbi Eport, Epin ; Иначе, Сравнение меньше, значит сбрасываем вывод на ноль
rjmp K6
sbi Eport, Epin ; Включаем вывод
K6: lds temp, Capture6
cp Sravnenie, temp
brsh PC+3 ; Если Sravnenie равно или больше, то переходим, где ставим вывод в единицу
cbi Rport, Rpin ; Иначе, Сравнение меньше, значит сбрасываем вывод на ноль
rjmp K7
sbi Rport, Rpin ; Включаем вывод
K7: lds temp, Capture7
cp Sravnenie, temp
brsh PC+3 ; Если Sravnenie равно или больше, то переходим, где ставим вывод в единицу
cbi Sport, Spin ; Иначе, Сравнение меньше, значит сбрасываем вывод на ноль
rjmp K8
sbi Sport, Spin ; Включаем вывод
K8: lds temp, Capture8
cp Sravnenie, temp
brsh PC+2 ; Если Sravnenie равно или больше, то переходим, где ставим вывод в единицу
nop ; Иначе, Сравнение меньше, значит сбрасываем вывод на ноль
nop
nop
nop ; Включаем вывод
reti
Теперь мне надо их плавно менять, а у меня все виснет при этом, если их менять в главном цикле, да еще и задержку если поставить.
Посмотрел в симуляторе, если я правильно понял, то у меня на прерывание уходит 64 такта. А т.к. всего у меня между прерываниями есть 240 примерно тактов, то у меня еще есть 176 свободных, чтобы не просрать очередное прерывание?
Как их сделать, чтобы пуеременные менялись где-то?
Станислав
Флаги то не сохраняете в прерывании.
Если у Вас прерываний других нет, и запрета прерываний в основном теле нет, то оно никак не просрется.СКАЗОЧНИК писал(а): то у меня на прерывание уходит 64 такта. А т.к. всего у меня между прерываниями есть 240 примерно тактов, то у меня еще есть 176 свободных, чтобы не просрать очередное прерывание?
Маленько не то имел ввиду. )))
Ща, у меня уже что-то получаться начало. Иду в правильном нарпавлении.
Просто получалось, что в главном цикле он успевает сделать столько интераций, что все в итоге выводилось по среднему. Скорость слишком большая. Уже разобрался.
Спасибо. Флаги подправлю, сохранение сделаю.
Все. добился чего хотел. почти.
У меня все значения ШИМ для каналов изменяются плавно, но по кругу (если можно так сказать). Получается что-то в виде бегущего огня, которые плавно нарастают один за другим и также гаснут. Но... у меня все по кругу и поэтому плавно гаснуть получается, а плавно нарастать нет.
Где-то надо начинать переменные в другую сторону крутить? Как это проще сварганить?
Ща, у меня уже что-то получаться начало. Иду в правильном нарпавлении.
Просто получалось, что в главном цикле он успевает сделать столько интераций, что все в итоге выводилось по среднему. Скорость слишком большая. Уже разобрался.
Спасибо. Флаги подправлю, сохранение сделаю.
Все. добился чего хотел. почти.
У меня все значения ШИМ для каналов изменяются плавно, но по кругу (если можно так сказать). Получается что-то в виде бегущего огня, которые плавно нарастают один за другим и также гаснут. Но... у меня все по кругу и поэтому плавно гаснуть получается, а плавно нарастать нет.
Где-то надо начинать переменные в другую сторону крутить? Как это проще сварганить?
Станислав
- Сообщения: 768
- Зарегистрирован: Вс янв 19, 2014 00:55:09
А чем не понравился? И на какой частоте у вас таймер работал?СКАЗОЧНИК писал(а):Короче, что-то мне этот ВАМ не понравился..
Елки... Я уже и не помню. Помню только что АТМега8 на внутренней 8 МГц. Предделители не помню...
Не понравился
тупой сложностью организации динамической смены яркости.... Т.е. как-то сделал, чтобы яркость по каналам была разная - все получилось и работало. Потом забросил на некоторое время. Потом опять вернулся к изделию, чтобы сделать плавное изменение яркости по каналам и понял, что забыл, как это вообще работает.
Для этого надо было сначала вспомнить, что я там нафигачил...
Вспомнил. А заодно и вспомнил сложности в мерцании на больших задержках. А еще предстояло как-то менять яркости плавненько.
Плюнул на все это и переделал на программный ШИМ. (кстати, разница не сильно большая, но принципиальная). Однако, для моих 7 каналов мне прекрасно хватило.
Как-то так.
Не понравился
Для этого надо было сначала вспомнить, что я там нафигачил...
Плюнул на все это и переделал на программный ШИМ. (кстати, разница не сильно большая, но принципиальная). Однако, для моих 7 каналов мне прекрасно хватило.
Как-то так.
Станислав
- Сообщения: 768
- Зарегистрирован: Вс янв 19, 2014 00:55:09
Понятно. А я-то, наоборот, с программного ШИМа решил ВАМ попробовать. Очень уж там частота обновления низкая. А хотелось тоже цепочку из 16 штук динамически позажигать... И "обломался". ВАМ, у меня, по крайней мере, нормально яркости показывал, если таймер, как минимум, на 64 поделить. А это максимум 10 светодиодов, если больше, то уже мерцают. 
Вообще, ВАМ и надо доделывать. Просто мне стало лень. Перешел на ШИМ. Сделал как мне показалось проще, однако у страха глаза велики, возможно и на ВАМ справился бы еще лучше.

Станислав
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Что ВАМ, что ШИМ не обязательно делать 8-битным, для глаза достаточно и 4-6 бит. У меня на 6-битном ВАМ-е нормально работали 10 RGB-диодов. Хотя с кодом пришлось извращаться.
- Сообщения: 768
- Зарегистрирован: Вс янв 19, 2014 00:55:09
Да - верно. Делал на 6 битах, не очень понравились анимированные переходы. Сейчас работает линейка из 12 RGB диодов на ВАМе: все 8 бит, 8 мГц с предделителем на 64. 12 диодов еще терпимо для зрения, хотя боковым зрением уже мерцание очень заметно. Больше уже - трындец. Однако, если поднять частоту, то все яркости нивелируются и даже "врут", но мерцание конечно-же исчезает.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Если для того, чтобы поменять режим изменения яркости, надо вспоминать алгоритм ее регулирования, то похоже что у написанного модуля регулирования яркости плохой интерфейс.Потом опять вернулся к изделию, чтобы сделать плавное изменение яркости по каналам и понял, что забыл, как это вообще работает.
Для этого надо было сначала вспомнить, что я там нафигачил...
Разница между теорией и практикой на практике гораздо больше, чем в теории.
))) До этого мне еще как до луны пешком...
И вообще, надо на Си переходить. Ассемблер хоть и мощная штука, но довольно сильно добавляет времени к разработке нового устройства...
Станислав



