Использование данных из массива.

Обсуждаем контроллеры компании Atmel.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

почему таймер ( OCR1A = TRIAK[value]; ) не понимает данные из массива TRIAK[] ? при прошивке в камень димер такое ощущение что зависает.
Код:
Спойлер

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

#define F_CPU   8000000          //Hz

#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/io.h>

#define DEBOUNCE_TIME 			10

#define BUTTON_PIN 				PINB
#define POWER_BIT				PB3
#define UP_BIT					PB4
#define DOWN_BIT				PB5

#define KEY_POWER			0b00001000
#define KEY_DOWN			0b00100000
#define KEY_UP				0b00010000

#define  En_INT0      GIMSK|=(1<<6);
#define  Dis_INT0     GIMSK&=~(1<<6);     // выключаем прерывание INT0

volatile unsigned char data1=0;
volatile unsigned char data2=0;
volatile unsigned char value;
volatile int _buzzer = 0;
volatile int _pressed = 0;

volatile unsigned char sw=0;

void init_io();
void segchar(unsigned char seg);
void handle_button(int key);
void handle_buttons();
void process_power();
void process_up();
void process_down();

unsigned char TRIAK[] = {
			160,150,145,140,135,130,127,124,122,120,
			119,118,117,116,115,114,113,112,111,110,
			109,108,107,106,105,104,103,102,101,100,
			99,98,97,96,95,94,93,92,91,90,
			89,88,87,86,85,84,83,82,81,80,
			79,78,77,76,75,74,73,72,71,70,
			69,68,67,66,65,64,63,62,61,60,
			59,58,57,56,55,54,53,52,51,50,
			49,48,47,46,45,44,43,42,41,40,
			39,38,37,36,35,34,33,32,31,30};
			
//настройка внешнего прерывния INT0
void int0_init( void )
{
	//настраиваем на срабатывание INT0 по переднему фронту
	MCUCR |= (1<<ISC01)|(0<<ISC00);
	//разрешаем внешнее прерывание INT0
	En_INT0
}

ISR(TIMER1_CMPA_vect)
{ 
	if (sw==1)
	{
		PORTB |= (1<<1);
		_delay_us(9);
		PORTB &= ~(1<<1);
		_delay_us(1);
		PORTB |= (1<<1);
		_delay_us(9);
		PORTB &= ~(1<<1);
		_delay_us(1);
	}
	sw=0;
}
//Прерывания по инт0 от синхра импулса
ISR(INT0_vect)
{
	//OCR1A =(158-value);
	OCR1A = TRIAK[value];
	TCNT1 = 0;
	sw=1;
	static unsigned char count = 0;
	//гасим оба разр§да
	PORTB |=(1<<PB0);
	PORTB |=(1<<PB2);
	PORTA = 0b11111110;
	//зажигаем следующий разр§д
	if (count == 0)
	{
		segchar(data2);
		PORTB &= ~(1<<2);
	}
	if (count == 1)
	{
		segchar(data1);
		PORTB &= ~(1<<0);
	}
	count++;
	if (count == 2) count = 0;

}

int main(void)
{
	value=0;
	init_io();
	sei();
	int0_init();
	while(1)
	{
		handle_buttons();
	}
	return 0;
}

//Коды сегментов
void segchar (unsigned char seg)
{
	switch (seg)
	{
		case 1: PORTA = 0b01111100; break;
		case 2: PORTA = 0b10000100; break;
		case 3: PORTA = 0b01000100; break;
		case 4: PORTA = 0b01101000; break;
		case 5: PORTA = 0b01000010; break;
		case 6: PORTA = 0b00000010; break;
		case 7: PORTA = 0b01110100; break;
		case 8: PORTA = 0b00000000; break;
		case 9: PORTA = 0b01000000; break;
		case 0: PORTA = 0b00010000; break;
	}
}

void init_io()
{
	//порт, к которому подкл. сегменты
	PORTA = 0xff;
	DDRA = 0xff;
	//порт, к которому подкл. катод
	DDRB |=(1<<0)|(1<<1)|(1<<2);
	PORTB =0x00;
	//Иницилизация прерываний по совпадению Т1.
	TIMSK |=(1<<OCIE1A);
	TCCR1B |=/*(1<<CTC1)*/(0<<CS10)|(1<<CS11)|(0<<CS12)|(1<<CS13);   
	OCR1A=0xFF;
}
//Обраюотчик кнопок
void handle_button(int key)
{
	int bit;
	switch (key)
	{
		case KEY_POWER: bit = POWER_BIT; break;
		case KEY_UP: 	bit = UP_BIT; break;
		case KEY_DOWN: 	bit = DOWN_BIT; break;
		default: return;
	}

	if (bit_is_clear(BUTTON_PIN, bit))
	{
		if (_pressed == 0)
		{
			_delay_us(DEBOUNCE_TIME);
			if (bit_is_clear(BUTTON_PIN, bit))
			{
				_pressed |= key;
				
				// key action
				switch (key)
				{
					case KEY_POWER: process_power(); break;
					case KEY_UP: 	process_up(); break;
					case KEY_DOWN: 	process_down(); break;
				}
			}
		}
	}
	else
	{
		_pressed &= ~key;
	}
}

void handle_buttons()
{
	handle_button(KEY_POWER);
	handle_button(KEY_DOWN);
	handle_button(KEY_UP);
}

void process_power()
{
	value=90;
}
void process_up()
{
	if (value < 99)
	{
		value++;
		unsigned char tmp;
		tmp = value % 10;
		data1 = tmp;
		tmp = value/10;
		data2= tmp;
	}
}
void process_down()
{
	if (value > 0)
	{
		value--;
		unsigned char tmp;
		tmp = value % 10;
		data1 = tmp;
		tmp = value/10;
		data2= tmp;
	}
}

Добавлено after 1 hour 23 minutes 13 seconds:
проблему решил сам ) так все работает.

const unsigned char TRIAK[]PROGMEM

unsigned char tmp = pgm_read_byte(&(TRIAK[value]));
OCR1A = tmp;
andrei23061996@gmail.com
.................................................................................................................
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

7seg писал(а):проблему решил сам
а если перейти на свежую версию AVR-GCC, то можно и без pgm_read_byte обойтись :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Пользуюсь AtmelStudio6, перейти на 7 ?

Добавлено after 2 minutes 4 seconds:
AVR, не подскажешь случаем по какому графику лучше повышать напругу для лампы. линейный точно не подходит. ))
andrei23061996@gmail.com
.................................................................................................................
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Изображение
по горизонтали условный угол проводимости симистора (угол проводимости = 180 минус угол отпирания) в процентах (т.е. 100% - весь полупериод открыт), по вертикали условная яркость лампы.
подробности здесь: http://radioded.ru/skhema-na-mikrokontr ... nyy-dimmer

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Спасибо за график.

Добавлено after 2 minutes 42 seconds:
А по сути же __flash и PROGMEM одно и тоже ?)
andrei23061996@gmail.com
.................................................................................................................
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

по сути одно и то же, а по результату использования - нет.
сравните сами:

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

#include <avr/pgmspace.h>

PROGMEM int data_array[] = {1,2,3,4,5};

int data = pgm_read_word(&data_array[2]);

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

const __flash int data_array[] = {1,2,3,4,5};

int data = data_array[2];
чувствуете разницу в удобстве применения?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Полностью согласен.

Блин какой то косяк в динамической индикации. когда значение = 99. она работает, но один разряд ярче другого на вид.(
andrei23061996@gmail.com
.................................................................................................................
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Да я походу понял почему, т.к динамическая индикация привязана к прерываниям по инт0 походу по переднему фронту идут помехи, все таки лампочка то серьезная 2 киловатта ). чуть уменьшил крайнее время открывания симистора и все норм стало.
andrei23061996@gmail.com
.................................................................................................................
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Я тут как раз недавно делал кой-какие расчеты. Получил вот такой график. Абсцисса - это угол открытия симистора. Правда к светимости лампы отношения не имеет.
Изображение
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Z_h_e, спасибо за график.
andrei23061996@gmail.com
.................................................................................................................
Ответить

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