Прерывания в AVR

Обсуждаем контроллеры компании Atmel.
Ответить
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

Здравствуйте! Написана программа, подключены библиотеки, но все это сделано без учета прерываний.На данном этапе появилась необходимость использования их. Без них все вроде работает красиво и как надо. Настроил и включил прерывание и тут начался беспредел...Я понимаю что это связано с тем,что прерывания влезают не в свое дело и портят картину. Как и где именно расставить запреты?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Руками и там.
Docendo discimus
Контактная информация:
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="pyzhman",url="/forum/viewtopic.php?p=3314601#p3314601"]Руками и там.[/uquote] +1 к рейтингу
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ROMan2947 писал(а):+1 к рейтингу
я так понимаю, это был сарказм. а теперь перечитайте, что вы написали, и скажите, какая полезная информация содержится в вашем тексте?
вы написали что-то типа мычания пьяного сторожа зоопарка, у которого слон сбежал "я того этого, а он как это, ну того самое, ну ваще, это ж надо так!"

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

Сообщение ozonn »

[uquote="ROMan2947",url="/forum/viewtopic.php?p=3314598#p3314598"]Я понимаю что это связано с тем,что прерывания влезают не в свое дело и портят картину. Как и где именно расставить запреты?[/uquote] :facepalm:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15605
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Снова КОТЕНКА закусюкали...
:(
Ежли человек только за те МК взялся - естественно и ошибки/неточности будут.
Тем более, когда старт не с азов железа, а по современным учебникам и...
:tea:
Это мы с карандашика и пустографки начинали - а сейчас ХИТРЫ ДЯДИ народ готовым СЫРОМ пичкают (адуринки, Сишные проекты и прочая начинка МЫШЕЛОВОК).
:beer:
Реклама
Друг Кота
Сообщения: 9180
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

[uquote="ROMan2947",url="/forum/viewtopic.php?p=3314598#p3314598"]Я понимаю что это связано с тем,что прерывания влезают не в свое дело и портят картину. Как и где именно расставить запреты?[/uquote]
Есть такая программка... Proteus называется https://ru.wikipedia.org/wiki/Proteus_( ... тирования)
с её помощью можно всё помостреть и настроить... Иногда даже не вдаваясь в подробности кода))
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

ROMan2947 писал(а):Написана программа, подключены библиотеки, но все это сделано без учета прерываний.На данном этапе появилась необходимость использования их.
Для чего прерывания вам?
ROMan2947 писал(а):Без них все вроде работает красиво и как надо.
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="ARV",url="/forum/viewtopic.php?p=3314723#p3314723"]
ROMan2947 писал(а):+1 к рейтингу
а теперь перечитайте, что вы написали, и скажите, какая полезная информация содержится в вашем тексте?[/uquote]
у меня в данной проблеме к сожалению полная растерянность и полное парение в пространстве.Если б я знал какую полезную информацию Вам закинуть, возможно и не появилась бы эта тема.

Добавлено after 6 minutes 15 seconds:
[uquote="Dimon456",url="/forum/viewtopic.php?p=3314796#p3314796"]
ROMan2947 писал(а):Написана программа, подключены библиотеки, но все это сделано без учета прерываний.На данном этапе появилась необходимость использования их.
Для чего прерывания вам?
ROMan2947 писал(а):Без них все вроде работает красиво и как надо.
[/uquote]

Дело в том,что поэтапно я навешиваю на МК периферию. Сначала LCD,ds18b20,клавиатуру,ds1307,генераторы импульсов и т.д. часть периферии навешал, где не использовалось прерывание все работает.Сейчас подключаю генераторы импульсов тут-то и нужны стали INTы...
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

Сообщение dr.doc »

Прерывания нужно запрещать там, где требуется приоритет над ними - например тайминг логического состояния в программной реализации протокола. Только нужно учитывать моменты, вроде "не менее" или "не более" и все будет хорошо. Например, в I2C - время лог. 0 в линии CLK - не ограничено для микросхемы 24Сxx. Т.е., выставив уровни на выводах можно разрешать прерывания и включать задержку. А получится она 5мкС (100 кГц) или 50 из-за прерывания будет не важно.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="roman.com",url="/forum/viewtopic.php?p=3314789#p3314789"][uquote="ROMan2947",url="/forum/viewtopic.php?p=3314598#p3314598"]Я понимаю что это связано с тем,что прерывания влезают не в свое дело и портят картину. Как и где именно расставить запреты?[/uquote]
Есть такая программка... Proteus называется https://ru.wikipedia.org/wiki/Proteus_( ... тирования)
с её помощью можно всё помостреть и настроить... Иногда даже не вдаваясь в подробности кода))[/uquote]
есть у меня эта программа,да только она уже пылью покрылась.....только я не понимаю как в ней это можно решить проблему...
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

Сообщение dr.doc »

Подключить в нее *.obj или аналогичный (не *.hex) файл и запустить в пошаговом выполнении. На вектора прерываний поставить точки останова - по выходу будете знать, откуда был "прыжок" и чем он чреват для данного участка кода.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="dr.doc",url="/forum/viewtopic.php?p=3315033#p3315033"]Прерывания нужно запрещать там, где требуется приоритет над ними - например тайминг логического состояния в программной реализации протокола. Только нужно учитывать моменты, вроде "не менее" или "не более" и все будет хорошо. Например, в I2C - время лог. 0 в линии CLK - не ограничено для микросхемы 24Сxx. Т.е., выставив уровни на выводах можно разрешать прерывания и включать задержку. А получится она 5мкС (100 кГц) или 50 из-за прерывания будет не важно.[/uquote]

Момент "не менее" я думаю невозможно испортить прерыванием.... а вот "не более"" легко. значит главный враг это время?

Добавлено after 3 minutes 11 seconds:
[uquote="dr.doc",url="/forum/viewtopic.php?p=3315041#p3315041"]Подключить в нее *.obj или аналогичный (не *.hex) файл и запустить в пошаговом выполнении. На вектора прерываний поставить точки останова - по выходу будете знать, откуда был "прыжок" и чем он чреват для данного участка кода.[/uquote]ммм...начинаю понимать про что Вы...для этого я думаю лучше avrdragonom пройтись,нет?
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

Сообщение dr.doc »

Proteus допускает пошаговую отладку при симуляции. При этом также доступен код, который был подключен к контроллеру.
А про "не ...." - нужно выделить данные участки кода, критичные ко времени выполнения, и выделить их в cli - sei.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

ROMan2947 писал(а):Если б я знал какую полезную информацию Вам закинуть,
Описание схемы или ее предоставление в форум. Как и что делало устройство "до". Что добавлено в код и как стало неправильно работать. С приложением исходного кода, но только не в виде портянки на 8 листов.

ROMan2947, представте , что на мед.форуме Вы создали топик: "Мне было хорошо, я что-то съел и мне стало плохо, дайте таблетку". Как Вы думаете, Вам помогут с таким вопросом? И не удивлюсь, что если все-таки вытянут из Вас нужную инфу, то окажатся съели Вы банан, подскользнулись на его шкуре, сломали ногу и нужна совсем не таблетка.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

если делать поуму - скорее весь код придется переписать, раскладывая по полочкам,
если костылить - найдите в коде delay_ms(); (думаю если всё сделано без прерываний - они у вас есть) и разрешайте прерывания до них, а сразу после запрещайте обратно, может и поможет.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Друг Кота
Аватара пользователя
Сообщения: 15605
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Совершенно неудачный подход к решению задачи:
"...сначала создам простое, а затем добавляю обвеску..."
Дело в том, что постепенное наращивание периферии без начального планирования и распределения ресурсов под возможное наращивание в процессе начального проектировании схемы неизбежно приведет в конфликтам минимум в программной части проекта.
Так чот в Вашем, ROMan2947 случае КАЖДУЮ схемку лучше начинать проектировать заново, исходя из наработанного ранее опыта (вариации библиотек) и текущей поставленной задачи.
Возможно прийдется и схемотехнику подключения внешних устройств и распределение взаимосвязей между программными модулями (подпрограммами) изменять.
Со временем и опыт изначального планирования "идея -схема -программа" прийдет. На начальном этапе надо стараться действовать "по правилам" (или как можно ближе к ним).
МК штука прикладная...
Так что ежли "затык" и не совсем понятно как объяснить для "уже знающих" возникшую проблему начинаем с выкладывания
схема
исходник
чего хотелось получить
что получилось в реале (предпочтительно макет - но для большинства сейчас и симулятора протезного хватит).
:beer:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

Полезная информация!!!
Спойлер

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

#define ds18b20_DDR  DDRB
#define ds18b20_PORT PORTB
#define ds18b20_PIN  PINB
#define DQ  1
#define BIT_PORT PORTB
#define BIT_DDR  DDRB
#define BIT_PIN  PINB
#define BIT_ANALISATOR 0

#define SEARCH_ROM            0xF0 // ПОИСК РОМ
#define READ1_ROM             0x33 //ЧТЕНИЕ РОМ ПРИ ОДНОМ ДАТЧИКЕ НА ШИНЕ
#define MATCH_ROM             0x55 // СООТВЕТСТВИЕ РОМ
#define SKIP_ROM              0xCC // ПРОПУСК РОМ
#define ALARM_SEARCH_ROM      0xEC //ПОИСК ТРЕВОГ

#define CONVERT_TEMPERATUR    0x44 //КОНВЕРТРВАНИЕ ТЕМПЕРАТУРЫ
#define WRITE_ROM             0x4E //ЗАПИСЬ В ПАМЯТЬ ТРИ БАЙТА

#define READ_MEMORY              0xBE //ЧТЕНИЕ ПАМЯТИ
#define COPY_ROM              0x48 //КОПИРОВАНИЕ ДАНЫХ  ИЗ РОМ В ПЗУ
#define BUS_HIGT              ds18b20_DDR&=~(1<<DQ);
#define BUS_LOW               ds18b20_DDR|=1<<DQ;
#define resolution            0.0625




uint8_t bit = 0x00;
uint64_t ID_ds18b20 = 0;
char DATA_ROM_string1[16] = { 0 };
uint64_t MEMORY_ds18b20 = 0;
int16_t temperatura = 0;



uint64_t read_bit(void)
{

	bit = 0x00;

	BUS_LOW;
	_delay_us(3);
	BUS_HIGT;
	_delay_us(15);

	if (ds18b20_PIN&(1 << DQ))
		bit = 0x01;
	_delay_us(60);

	return bit;
}

void ds18b20_init(void)
{

	ds18b20_PORT &= ~(1 << DQ);
	BUS_LOW;
	_delay_us(480);
	BUS_HIGT;
	_delay_us(35);

	if ((ds18b20_PIN&(1 << 1)) == 0)
	{

		_delay_us(480);
	}
	else
	{
		_delay_us(480);
	}

}

void write_ds18b20(char data)
{
	ds18b20_PORT &= ~(1 << DQ);

	for (char i = 0; i <= 7; i++)
	{

		BUS_HIGT;
		_delay_us(15);

		if (data&(1 << i))
		{
			BUS_LOW;
			_delay_us(5);//////
			BUS_HIGT;
		}
		else
		{
			BUS_LOW;
			_delay_us(5);
		}
		_delay_us(50);
	}

	BUS_HIGT;
	_delay_us(15);
}

int reverse_CRC(int data_CRC)
{
	int buff = data_CRC;
	int CRC = 0;


	for (int i = 7; i >= 0; i--)
	{
		CRC |= ((buff >> i) & 0x01) << (7 - i);
	}

	return CRC;
}

int calculation_CRC8(uint64_t seen_CRC1, uint8_t cvanto_byt) // вычисление CRC ID
{
	uint64_t seen_CRC = seen_CRC1;

	int DATA_REGISTR = 0;

	uint8_t i = 0; // количество обработанных бит

	while (i <= ((8 * cvanto_byt) + 7))
	{
		if (DATA_REGISTR&(0x01 << 7))
		{

			DATA_REGISTR <<= 0x01;
			DATA_REGISTR |= (seen_CRC&(1ULL << i)) >> i;
			DATA_REGISTR ^= 0x131;
		}
		else
		{
			DATA_REGISTR <<= 0x01;
			DATA_REGISTR |= (seen_CRC&(1ULL << i)) >> i;
		}
		i++;
	}

	return DATA_REGISTR;
}

int READ_MEMORY_ds18b20(void)
{
	MEMORY_ds18b20 = 0;
	uint8_t CRC_MEMORY = 0;

	ds18b20_init();
	write_ds18b20(SKIP_ROM);
	write_ds18b20(READ_MEMORY);
	BUS_HIGT;
	_delay_us(15);

	for (int i = 0; i <= 63; i++)
	{
		MEMORY_ds18b20 |= (read_bit() << i); 
	}

	for (int i = 0; i <= 7; i++)
	{
		CRC_MEMORY |= (read_bit() << i); 
	}
	int CRC_calculate = calculation_CRC8(MEMORY_ds18b20, 8);


	temperatura = 0;
	if (reverse_CRC(CRC_calculate) == CRC_MEMORY)
	{
		for (uint8_t i = 0; i <= 15; i++)
			temperatura |= MEMORY_ds18b20&(1 << i);
	}

	int TEMP = (temperatura / 16.0) * 10;
	
	return TEMP;
}


int  conversion_temperature(void)
{

	ds18b20_init();
	write_ds18b20(SKIP_ROM);
	write_ds18b20(CONVERT_TEMPERATUR);

	while (!(ds18b20_PIN&(1 << DQ)));



	return 0;
}





 int main(void)
 {
 	LCD_init();
 	//WRITE_MEMORY_CONFIG_byte();
	while(1)
	{
 		//read_ID();
 		conversion_temperature();
 		READ_MEMORY_ds18b20();
 		
 	}

 }
где здесь необходимо использовать cli(), sei();
Последний раз редактировалось ROMan2947 Пт фев 23, 2018 11:42:50, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

while (!(ds18b20_PIN&(1 << DQ))); может выполняться очень долго, вот, во время его и попробуй разрешить прерывания
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Друг Кота
Аватара пользователя
Сообщения: 15605
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

ROMan2947
Текстовку ставить под спойлер надо (выделяем текст - жмем Code, снова выделяем все что получилось/с окантовочными символами/ и жмем spoiler) - так основные тексты сообщений не будут загромождаться. А кому интереснт - откроют полный текст.
Для контроля результата перед окончательной отправкой есть кнопа "предпросмотр".
:beer:
Ответить

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