Страница 1 из 1
Плавное включение светодиода не используя ШИМ
Добавлено: Сб сен 14, 2013 08:28:19
Каримов
Парни! Подскажите,ппожалуйста! почему не работает такой код?
For Led = 0 To 50
Led1 = 50
Portg.4 = 1
Waitms Led
Portg.4 = 0
Led1 = Led1 - Led
Waitms Led1
Next
Portg.4 = 1
Большая дискретность. Вроде должно плавно изменить яркость. частота 8мгц от внешнего кварца.
Програмировал stk200/300(только сегодня спаял). фьюзы трогал- рискнул(когда незнаешь-первый раз программирую)
Re: Плавное включение светодиода не используя ШИМ
Добавлено: Сб сен 14, 2013 09:07:55
blackx
У вас ATmega640/1280/1281/2560/2561?
Си-эквивалент
Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>
void main(void) {
int led;
// ... init(); ...
for(led = 0; led < 50; led++) {
PORTG |= (1 << PG0);
_delay_ms(led);
POTRG &= ~(1 << PG0);
_delay_ms(50 - led);
}
PORTG |= (1 << PG0);
while(1);
}
С кодом проблем вроде нет. Если дискретность 50 вас не устраивает - увеличивайте.
Re: Плавное включение светодиода не используя ШИМ
Добавлено: Сб сен 14, 2013 09:15:36
Flasher
delay_ms в качестве аргументов позволяет принимать переменные?
Re: Плавное включение светодиода не используя ШИМ
Добавлено: Сб сен 14, 2013 09:32:14
blackx
У меня - да, это обычная функция:
avr-libc 1.8.0 писал(а):void _delay_ms(double __ms)
Re: Плавное включение светодиода не используя ШИМ
Добавлено: Пн сен 16, 2013 04:18:47
Каримов
atmega325
Re: Плавное включение светодиода не используя ШИМ
Добавлено: Пн сен 16, 2013 18:10:25
YS
delay_ms в качестве аргументов позволяет принимать переменные?
Вообще да, но документация
настоятельно не рекомендует так делать. В этом случае препроцессор не может отработать корректно, и в коде получается каша - не гарантируется задержка + код раздувается из-за подключения библиотек работы с плавающей точкой.
In order for these functions to work as intended, compiler optimizations must be enabled, and the delay time must be an expression that is a known constant at compile-time. If these requirements are not met, the resulting delay will be much longer (and basically unpredictable), and applications that otherwise do not use floating-point calculations will experience severe code bloat by the floating-point library routines linked into the application.
Re: Плавное включение светодиода не используя ШИМ
Добавлено: Пн сен 16, 2013 19:12:21
blackx
YS, а на практике знаешь как это работает? Никогда не приходилось делать задержки с переменной длиной

Можно ли вот так сделать и получить адекватный результат?
Код: Выделить всё
int delay = 100;
while(delay--) { // gives 100 ms delay
_delay_ms(1);
}
Re: Плавное включение светодиода не используя ШИМ
Добавлено: Пн сен 16, 2013 19:19:27
YS
Можно ли вот так сделать и получить адекватный результат?
По идее да, тут ничего запрещенного нет. Будет оверхед от цикла, но, думаю, при задержке в одну миллисекунду им можно пренебречь.
Re: Плавное включение светодиода не используя ШИМ
Добавлено: Пн сен 16, 2013 19:25:54
blackx
Спасибо, возьму на заметку

Re: Плавное включение светодиода не используя ШИМ
Добавлено: Пн сен 16, 2013 19:30:24
YS
Да не за что.

Re: Плавное включение светодиода не используя ШИМ
Добавлено: Вт сен 17, 2013 22:47:53
vitalik_1984
Каримов писал(а):Парни! Подскажите,ппожалуйста! почему не работает такой код?
У вас все изменение происходит за 50 мс просто это не видно глазом
Сделайте еще один цикл, в котором изменяется яркость и будет нормально видно
Вроде этого
Код: Выделить всё
For Light = 0 To 50
For repeat =0 to 50
Led_delay= Light
Portg.4 = 1
Waitms Led_delay
Portg.4 = 0
Led_delay1 = 50 - Led_delay
Waitms Led1
next
Next
PS Это все равно ШИМ потому что Широтно Импульсная Модуляция не обязательно должна быть аппаратной.
Яркость меняется за счет изменения ширины импульса, значит это ШИМ.
Re: Плавное включение светодиода не используя ШИМ
Добавлено: Вт сен 17, 2013 23:10:54
blackx
vitalik_1984, ты не понял. В теле цикла установлена задержка в сумме дающая 50 мс, в нем 50 итераций. Итого 50x50=2500 мс.
И ТС написал, что под "почему не работает такой код?" он понимает то, что при выполнении программы получается "большая дискретность".
Re: Плавное включение светодиода не используя ШИМ
Добавлено: Ср сен 18, 2013 00:06:03
vitalik_1984

ну да точно не догнал чего то.
Непонятно только для чего там после цикла стоит включение светодиода внутри цикла ведь эта строчка тоже есть.
Re: Плавное включение светодиода не используя ШИМ
Добавлено: Ср сен 18, 2013 07:23:01
blackx
Потому что после выполнения последней итерации светодиод окажется выключенным. Посмотри внимательнее код.
Re: Плавное включение светодиода не используя ШИМ
Добавлено: Ср сен 18, 2013 11:30:43
vitalik_1984
так может нужно было лучше в основной цикл эти итерации пихнуть?
так ведь выходит будет всего лишь один раз убавлять и потом сплошное горение.