Страница 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, а на практике знаешь как это работает? Никогда не приходилось делать задержки с переменной длиной :oops:
Можно ли вот так сделать и получить адекватный результат?

Код: Выделить всё

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
Спасибо, возьму на заметку :beer:

Re: Плавное включение светодиода не используя ШИМ

Добавлено: Пн сен 16, 2013 19:30:24
YS
Да не за что. :) :beer:

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 Это все равно ШИМ потому что Широтно Импульсная Модуляция не обязательно должна быть аппаратной. :wink:
Яркость меняется за счет изменения ширины импульса, значит это ШИМ.

Re: Плавное включение светодиода не используя ШИМ

Добавлено: Вт сен 17, 2013 23:10:54
blackx
vitalik_1984, ты не понял. В теле цикла установлена задержка в сумме дающая 50 мс, в нем 50 итераций. Итого 50x50=2500 мс.

И ТС написал, что под "почему не работает такой код?" он понимает то, что при выполнении программы получается "большая дискретность".

Re: Плавное включение светодиода не используя ШИМ

Добавлено: Ср сен 18, 2013 00:06:03
vitalik_1984
:facepalm: ну да точно не догнал чего то.
Непонятно только для чего там после цикла стоит включение светодиода внутри цикла ведь эта строчка тоже есть.

Re: Плавное включение светодиода не используя ШИМ

Добавлено: Ср сен 18, 2013 07:23:01
blackx
Потому что после выполнения последней итерации светодиод окажется выключенным. Посмотри внимательнее код.

Re: Плавное включение светодиода не используя ШИМ

Добавлено: Ср сен 18, 2013 11:30:43
vitalik_1984
так может нужно было лучше в основной цикл эти итерации пихнуть?
так ведь выходит будет всего лишь один раз убавлять и потом сплошное горение.