Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
AVRGeniu5
0 / 0 / 0
Регистрация: 23.10.2014
Сообщений: 23
1

Управление яркостью светодиодов бинарной модуляцией [AVR studio]

25.12.2014, 14:32. Просмотров 775. Ответов 2
Метки нет (Все метки)

Здравствуйте, нужно реализовать эффект на светодиодах с изменением их яркости. Эффект такой:самый яркий светодиод стартует с начала и за ним начинает тянуться хвост из светодиодов каждый следующий из которых имеет меньшую яркость, чем предыдущий.
Написал код, добился того, что могу их расположить в статичном положении по возрастанию яркости, но не могу заставить эту цепочку двигаться, вот код с комментариями:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#define F_CPU 8000000L
#include <util/delay.h> 
#include <avr/io.h>
#include <avr/interrupt.h>
#define ROR(x) ((x >> 1) | (x << 7)) //Макрос для циклического сдвига вправо значения регистра совпадения, для того чтобы прерывания каждое следующее прерывание длилось меньше времени , тем самым старшие биты включаются с большей длительностью, чем младшие, тогда можно регулировать яркость числом в двоичной форме, чем больше число, тем больше яркость.
 
#define COPYBIT(dst,bit,src)                \  // Макрос для выборки бита из яркостного числа
    do {                        \
    (dst) &=~(1<<(bit));                \ // Обнуляем бит порта, чтобы ничего лишнего там небыло
    (dst) |=((   (src) & OCR0  )?1:0)<<(bit);   \ // Накладываем маску, она же значение регистра сравнения, для      выборки бита из яркостного числа 
    } while(0)                                          
 
int i; 
 
unsigned char BRG[8]= {225,1,13,25,40,70,100,150}; // Массив чисел яркости для 8 светодиодов
//{225,150,100,70,40,25,13,1};
//{0,13,25,40,70,100,150,225}; {225,1,13,25,40,70,100,150};
ISR(TIMER0_COMP_vect) // Прерывания таймера 0 по совпадению для генерации яркости светодиодов
{ 
OCR0 = ROR(OCR0); // Сдвигаем при каждом прерывании значение регистра сравнения вправо
COPYBIT(PORTA,0,BRG[7]);
COPYBIT(PORTA,1,BRG[6]);
COPYBIT(PORTA,2,BRG[5]);
COPYBIT(PORTA,3,BRG[4]);
COPYBIT(PORTA,4,BRG[3]);
COPYBIT(PORTA,5,BRG[2]);
COPYBIT(PORTA,6,BRG[1]);
COPYBIT(PORTA,7,BRG[0]);
}
ISR(TIMER2_COMP_vect) // Прерывания по таймеру 2 . Пытаюсь реализовать режим движения
{ DDRA=DDRA|1<<i; // Для того, чтобы  не горели все диоды порта сразу, с загорались последовательно по одному
BRG[8]=ROR(BRG[8]); // Пытаюсь сдвигать массив чисел яркости, чтобы как раз таки за самым ярким светодиодом тянулись светодиоды с меньшей яркостью каждый следующий
i=i+1;
if (i==8)
{i=0; PORTA=0x00; DDRA=0x00; }
}
void main(void)
{
 
sei();
 
TCNT0 = 0;
OCR0 = 0b10000000;
OCR2=200; 
TIMSK |= 1<<OCIE0|1<<OCIE2;
TCCR2|=1<<WGM21|1<<CS22|1<<CS20;
TCCR0 |= 1<<WGM01 | 4<<CS00;
TCNT2=0;
 DDRA=0x00;
PORTA=0x00;
while(1)
{
 
}
}
При компиляции движения не происходит , диоды просто горят в соответствии , заданном в массиве яркости для каждого вывода. Есть подозрение , что нельзя так массив чисел сдвигать.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2014, 14:32
Ответы с готовыми решениями:

BAM. Управление яркостью светодиодов.
Подкиньте, пожалуйста идей, как лучше сделать. Хочу чтобы параллельно обрабатывалось какое-то...

Последовательное плавное управление яркостью светодиодов
Нужно написать программку на Atmega48 в CodevisionAVR Используя PORTD 0 1 2 С начало загорается...

Управление блоком светодиодов (Code Vision AVR)
Имеется следующее задание: Запрограммировать мигание блоков светодиодов с портом B в Code Vision...

CAVR против AVR Studio, что не так в программе под AVR Studio
Проблема такая, есть исходник, если его компилировать в CAVR заливаю в МК все работает, если этот...

Управление яркостью лампочки
Здравствуйте. Есть контроллер, который через оптопару и симистор будет управлять яркостью обычной...

2
pyzhman
809 / 499 / 70
Регистрация: 15.05.2012
Сообщений: 2,827
25.12.2014, 17:17 2
Что-то заморотили. Не проще типа такого:?
C
1
2
3
4
5
temp= arr[7];
arr[7]= arr[6];
arr[6]= arr[5];
...
arr[0]= temp;
0
AVRGeniu5
0 / 0 / 0
Регистрация: 23.10.2014
Сообщений: 23
25.12.2014, 17:40  [ТС] 3
pyzhman, со сдвигом массива то? Через макрос не будет работать?
Я так понимаю, все проблема в макросе, который формирует яркость:
Цитата Сообщение от AVRGeniu5 Посмотреть сообщение
COPYBIT(PORTA,0,BRG[7]);
Ведь программа, компилируя макрос, больше не вносит в него изменения и BRG в макросе не меняется. Нужно этот макрос переделать в функцию и изменят ее значения. Кто подскажет как этот макрос оформить в функцию?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2014, 17:40

Управление яркостью через триммер и АЦП
Суть задания-используя переменный резистор стенда(подключенный к ацп) управлять яркостью...

Управление яркостью светодиода двумя кнопками на Atmega8
задача была такая но проверить сейчас не на чем может кто посмотреть и сказать правильно я написал...

ATMega16 (ASM). Плавное управление яркостью, генерация звука и отображение на семисегментнике
Всем привет!!! помогите пож-та. у меня такая проблема. необходимо объединить 3 пункта программы и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru