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

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Аватара пользователя
Сообщения: 49
Зарегистрирован: Сб мар 19, 2011 17:58:36
Откуда: Красноярск

Сообщение Каримов »

Парни! Подскажите,ппожалуйста! почему не работает такой код?

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(только сегодня спаял). фьюзы трогал- рискнул(когда незнаешь-первый раз программирую)
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение 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 вас не устраивает - увеличивайте.
Изображение only pure true norwegian blackx Изображение
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1802
Зарегистрирован: Ср сен 07, 2011 21:40:30

Сообщение Flasher »

delay_ms в качестве аргументов позволяет принимать переменные?
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

У меня - да, это обычная функция:
avr-libc 1.8.0 писал(а):void _delay_ms(double __ms)
Изображение only pure true norwegian blackx Изображение
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Аватара пользователя
Сообщения: 49
Зарегистрирован: Сб мар 19, 2011 17:58:36
Откуда: Красноярск

Сообщение Каримов »

atmega325
Реклама
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение 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.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

YS, а на практике знаешь как это работает? Никогда не приходилось делать задержки с переменной длиной :oops:
Можно ли вот так сделать и получить адекватный результат?

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

int delay = 100;

while(delay--) { // gives 100 ms delay
_delay_ms(1);
}
Изображение only pure true norwegian blackx Изображение
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Можно ли вот так сделать и получить адекватный результат?
По идее да, тут ничего запрещенного нет. Будет оверхед от цикла, но, думаю, при задержке в одну миллисекунду им можно пренебречь.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

Спасибо, возьму на заметку :beer:
Изображение only pure true norwegian blackx Изображение
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Да не за что. :) :beer:
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение 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:
Яркость меняется за счет изменения ширины импульса, значит это ШИМ.
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

vitalik_1984, ты не понял. В теле цикла установлена задержка в сумме дающая 50 мс, в нем 50 итераций. Итого 50x50=2500 мс.

И ТС написал, что под "почему не работает такой код?" он понимает то, что при выполнении программы получается "большая дискретность".
Изображение only pure true norwegian blackx Изображение
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

:facepalm: ну да точно не догнал чего то.
Непонятно только для чего там после цикла стоит включение светодиода внутри цикла ведь эта строчка тоже есть.
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

Потому что после выполнения последней итерации светодиод окажется выключенным. Посмотри внимательнее код.
Изображение only pure true norwegian blackx Изображение
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

так может нужно было лучше в основной цикл эти итерации пихнуть?
так ведь выходит будет всего лишь один раз убавлять и потом сплошное горение.
Контактная информация:
Ответить

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