Динамическая индикация + Регулировка яркости

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Shurf
Встал на лапы
Сообщения: 83
Зарегистрирован: Ср май 12, 2010 10:24:41
Откуда: Чувашия, Новочебоксарск
Контактная информация:

Динамическая индикация + Регулировка яркости

Сообщение Shurf »

Вот наткнулся на статью: ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ И РЕГУЛИРОВКА ЯРКОСТИ

Я это понял так: По прерыванию компаратора таймера включаем один из разрядов семисегментного индикатора. По прерыванию переполнения гасим индикаторы. При фиксированной длине периода таймера гаситься и зажигаться сегменты индикатора будут с одинаковой периодичностью, а вот время от включения до выключения можно варьировать - чем больше OCR0A тем меньше он гореть будет, тем меньше яркость.
Попробовал это на Attiny2313. Код на С для AVRStudio:

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

#define F_CPU 4000000UL   
#include <avr/io.h>     
#include <util/delay.h>
#include <avr/interrupt.h>

#define BIT0 0b00000001 
#define BIT1 0b00000010
#define BIT2 0b00000100
#define BIT3 0b00001000
#define BIT4 0b00010000
#define BIT5 0b00100000
#define BIT6 0b01000000
#define BIT7 0b10000000

char digits[]={   //разряды  для вывода цифр на порт В
	//hgfedcba
	0b00111111, //0
	0b00000110, //1
	0b01011011, //2
	0b01001111, //3
	0b01100110, //4
	0b01101101, //5
	0b01111101, //6
	0b00000111, //7
	0b01111111, //8
	0b01101111, //9
	0b01110111, //A
	0b01111100, //b
	0b00111001, //C
	0b01011110, //d
	0b01111001, //E
	0b01110001, //F
};

char m[2] = {0,0}; //переменная для вывода на индикатор - 0 - 1й разряд, 1 - 2й разряд
char posit=0; //текущий разряд

ISR (TIMER0_COMPA_vect){
	cli();
	PORTD |= 0b00000011; //Выключаю индикатор
	sei();	}

ISR (TIMER0_OVF_vect){
	cli();
	PORTB = digits[m[posit]];
	if (posit==1) PORTD = BIT0;//;(1<<(posit));
	if (posit==0) PORTD = BIT1;//;(1<<(posit));
	posit++;
	if(posit==2)posit=0;
	sei();}

int main (void) { 	
	TCCR0B |=(1<<CS10)|(1<<CS11); // Предделитель для T0 - 64.
	TIMSK |=(1<<TOIE0); // Разрешить прерывание по переполнению T0.
	SREG |= (1<<7); // Разрешить все прерывания.
	TCNT0=0;// Инициализация счётчика.;
	OCR0A = 128; //половинная яркость
	char i=1;
	DDRB = 0xFF;
	DDRD = 0b00000011; 
	PORTB = 0;
	PORTD = 0b00000011;// Общий Катод - гасим индикаторы
	for (;;){
		m[0] = i%10; 
		m[1] = (int)i/10;
		_delay_ms(1000);
		i++;
		if(i==100) i = 0;	}
	return 0;}//end main
Это первый опыт использования прерываний. Работать - работает, но яркость не меняет.

Если поменять код в прерываниях местами - не работает - индикатор не горит. Кажется не обрабатывается прерывание TIMER0_COMPA.
Реклама
Аватара пользователя
Danko
Сверлит текстолит когтями
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай
Контактная информация:

Re: Динамическая индикация + Регулировка яркости

Сообщение Danko »

Shurf писал(а):Кажется не обрабатывается прерывание TIMER0_COMPA.
Shurf писал(а): TIMSK |=(1<<TOIE0); // Разрешить прерывание по переполнению T0.
А где "разрешить прерывания по совпадению" ???
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Динамическая индикация + Регулировка яркости

Сообщение ARV »

переменные m[] и posit я бы сделал volatile, ибо оптимизатор WinAVR вполне может их проигнорировать.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Shurf
Встал на лапы
Сообщения: 83
Зарегистрирован: Ср май 12, 2010 10:24:41
Откуда: Чувашия, Новочебоксарск
Контактная информация:

Re: Динамическая индикация + Регулировка яркости

Сообщение Shurf »

Danko писал(а):А где "разрешить прерывания по совпадению" ???
Хех) Вот и была проблема, спасибо. Утро вечера мудренее, однако.

ARV, в смысле так? volatile char m[2]; и volatile char posit; ?

Спасибо за volatile, а то я при компиляции специально оптимизацию отключал, чтобы он проверочные переменные не выкидывал).

А можно этот кусок так оптимизировать:
Не так:

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

if (posit==1) PORTD = BIT0;
   if (posit==0) PORTD = BIT1;
А так:

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

PORTD |= (0b00000011&(1<<(posit+1)));
Где:
0b00000011 - маска, чтобы не сбились остальные биты PORTD
posit принимает значения либо 0 либо 1,
соответственно 1<<1 = 0b00000001 - включаем первый разряд индикатора
1<<2 = 0b00000010 - второй разряд индикатора
Извините, в побитовых операциях не силен, спрашиваю пока могу)
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Динамическая индикация + Регулировка яркости

Сообщение ARV »

почитайте статьи про динамическую индикацию у меня на сайте - там я касался вопроса, что вас волнует. если не разберетесь - тогда и боговорим
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
loshvitalik
Нашел транзистор. Понюхал.
Сообщения: 176
Зарегистрирован: Чт май 05, 2011 12:58:32
Откуда: Екатеринбург
Контактная информация:

Re: Динамическая индикация + Регулировка яркости

Сообщение loshvitalik »

Я вот почитал, почитал, но так и ничего и не понял...
Хотелось бы увидеть пример кода на си с регулировкой яркости переменным резистором, желательно для моего случая.
А мой случай такой: Atmega32, 7 разрядов на порте В0-6, 13 сегментов на портах D и С3-7, яркость регулируется переменным или фото резистором на порте А0.
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Динамическая индикация + Регулировка яркости

Сообщение Аlex »

А мой случай такой: Atmega32, 7 разрядов на порте В0-6, 13 сегментов на портах D и С3-7, яркость регулируется переменным или фото резистором на порте А0.
А какая разница какой МК и куда подключены к нему индикаторы и переменник ? Принцип то для всех одинаков, тем более у Вас всё заработало. Прикручивайте теперь АЦП и перетаскивайте из него значение в компаратор таймера.
Не вижу никаких проблем, задача для ученика 1-ого класса...
loshvitalik
Нашел транзистор. Понюхал.
Сообщения: 176
Зарегистрирован: Чт май 05, 2011 12:58:32
Откуда: Екатеринбург
Контактная информация:

Re: Динамическая индикация + Регулировка яркости

Сообщение loshvitalik »

Аlex писал(а):
А мой случай такой: Atmega32, 7 разрядов на порте В0-6, 13 сегментов на портах D и С3-7, яркость регулируется переменным или фото резистором на порте А0.
А какая разница какой МК и куда подключены к нему индикаторы и переменник ? Принцип то для всех одинаков, тем более у Вас всё заработало. Прикручивайте теперь АЦП и перетаскивайте из него значение в компаратор таймера.
Не вижу никаких проблем, задача для ученика 1-ого класса...
А кто сказал, что у меня все работает? я еще прошивку то не написал, только ищу нужные материалы...
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Динамическая индикация + Регулировка яркости

Сообщение Аlex »

А кто сказал, что у меня все работает?
Вы
Хех) Вот и была проблема, спасибо.
Или эти эмоции говорят о другом ? :roll:
loshvitalik
Нашел транзистор. Понюхал.
Сообщения: 176
Зарегистрирован: Чт май 05, 2011 12:58:32
Откуда: Екатеринбург
Контактная информация:

Re: Динамическая индикация + Регулировка яркости

Сообщение loshvitalik »

Аlex писал(а):
А кто сказал, что у меня все работает?
Вы
Хех) Вот и была проблема, спасибо.
Или эти эмоции говорят о другом ? :roll:
Если вы заметите, то я не автор топика и не автор второй цитаты:) Я просто задал вопрос в этом топике, т.к. повторяться нельзя.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Динамическая индикация + Регулировка яркости

Сообщение Аlex »

Тьфу ты блин, извеняюсь :))) Я почему то не обратил внимания на ник. Наверное мне пора спать :))
loshvitalik
Нашел транзистор. Понюхал.
Сообщения: 176
Зарегистрирован: Чт май 05, 2011 12:58:32
Откуда: Екатеринбург
Контактная информация:

Re: Динамическая индикация + Регулировка яркости

Сообщение loshvitalik »

Аlex писал(а):Тьфу ты блин, извеняюсь :))) Я почему то не обратил внимания на ник. Наверное мне пора спать :))
Мне бы тоже, но ложиться в 6 утра чтобы встать в 9 нельзя :( Вам везет.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Динамическая индикация + Регулировка яркости

Сообщение Аlex »

но ложиться ..... нельзя
Значит нужно заняться динамической индикацией :))
Вы хоть расскажите что Вам не понятно, придут сутра АВРщики со светлыми и выспавшимися головами и Вам обязательно подскажут.
loshvitalik
Нашел транзистор. Понюхал.
Сообщения: 176
Зарегистрирован: Чт май 05, 2011 12:58:32
Откуда: Екатеринбург
Контактная информация:

Re: Динамическая индикация + Регулировка яркости

Сообщение loshvitalik »

Аlex писал(а):
но ложиться ..... нельзя
Значит нужно заняться динамической индикацией :))
Вы хоть расскажите что Вам не понятно, придут АВРщики и Вам обязательно подскажут.
Мне понятно как взять индикацию и приделать к ней еще один таймер, и что оно теперь управляется... но совершенно непонятно, как менять значение OCR2, тем более в зависимости от АЦП0...
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: Динамическая индикация + Регулировка яркости

Сообщение GP1 »

а что тут сложного? :shock:
- цепляешь к любому каналу АЦП переменный резистор
- в прерывании по готовности преобразования читаешь значение АЦП
- переписываешь это значение в OCRn
Чем дальше, тем больше становлюсь занудой...
Изображение
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»