Страница 1 из 3

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

Добавлено: Чт фев 22, 2018 09:52:37
ROMan2947
Здравствуйте! Написана программа, подключены библиотеки, но все это сделано без учета прерываний.На данном этапе появилась необходимость использования их. Без них все вроде работает красиво и как надо. Настроил и включил прерывание и тут начался беспредел...Я понимаю что это связано с тем,что прерывания влезают не в свое дело и портят картину. Как и где именно расставить запреты?

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

Добавлено: Чт фев 22, 2018 09:56:52
pyzhman
Руками и там.

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

Добавлено: Чт фев 22, 2018 13:13:03
ROMan2947
[uquote="pyzhman",url="/forum/viewtopic.php?p=3314601#p3314601"]Руками и там.[/uquote] +1 к рейтингу

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

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

так что вполне бы вам минусов надо подсыпать в топку...

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

Добавлено: Чт фев 22, 2018 13:43:22
ozonn
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3314598#p3314598"]Я понимаю что это связано с тем,что прерывания влезают не в свое дело и портят картину. Как и где именно расставить запреты?[/uquote] :facepalm:

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

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

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

Добавлено: Чт фев 22, 2018 15:21:42
roman.com
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3314598#p3314598"]Я понимаю что это связано с тем,что прерывания влезают не в свое дело и портят картину. Как и где именно расставить запреты?[/uquote]
Есть такая программка... Proteus называется https://ru.wikipedia.org/wiki/Proteus_( ... тирования)
с её помощью можно всё помостреть и настроить... Иногда даже не вдаваясь в подробности кода))

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

Добавлено: Чт фев 22, 2018 15:28:20
Dimon456
ROMan2947 писал(а):Написана программа, подключены библиотеки, но все это сделано без учета прерываний.На данном этапе появилась необходимость использования их.
Для чего прерывания вам?
ROMan2947 писал(а):Без них все вроде работает красиво и как надо.

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

Добавлено: Чт фев 22, 2018 21:49:03
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ы...

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

Добавлено: Чт фев 22, 2018 21:51:16
dr.doc
Прерывания нужно запрещать там, где требуется приоритет над ними - например тайминг логического состояния в программной реализации протокола. Только нужно учитывать моменты, вроде "не менее" или "не более" и все будет хорошо. Например, в I2C - время лог. 0 в линии CLK - не ограничено для микросхемы 24Сxx. Т.е., выставив уровни на выводах можно разрешать прерывания и включать задержку. А получится она 5мкС (100 кГц) или 50 из-за прерывания будет не важно.

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

Добавлено: Чт фев 22, 2018 21:54:51
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]
есть у меня эта программа,да только она уже пылью покрылась.....только я не понимаю как в ней это можно решить проблему...

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

Добавлено: Чт фев 22, 2018 21:58:43
dr.doc
Подключить в нее *.obj или аналогичный (не *.hex) файл и запустить в пошаговом выполнении. На вектора прерываний поставить точки останова - по выходу будете знать, откуда был "прыжок" и чем он чреват для данного участка кода.

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

Добавлено: Чт фев 22, 2018 22:10:42
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 пройтись,нет?

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

Добавлено: Пт фев 23, 2018 05:49:59
dr.doc
Proteus допускает пошаговую отладку при симуляции. При этом также доступен код, который был подключен к контроллеру.
А про "не ...." - нужно выделить данные участки кода, критичные ко времени выполнения, и выделить их в cli - sei.

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

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

ROMan2947, представте , что на мед.форуме Вы создали топик: "Мне было хорошо, я что-то съел и мне стало плохо, дайте таблетку". Как Вы думаете, Вам помогут с таким вопросом? И не удивлюсь, что если все-таки вытянут из Вас нужную инфу, то окажатся съели Вы банан, подскользнулись на его шкуре, сломали ногу и нужна совсем не таблетка.

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

Добавлено: Пт фев 23, 2018 06:26:42
Ivanoff-iv
если делать поуму - скорее весь код придется переписать, раскладывая по полочкам,
если костылить - найдите в коде delay_ms(); (думаю если всё сделано без прерываний - они у вас есть) и разрешайте прерывания до них, а сразу после запрещайте обратно, может и поможет.

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

Добавлено: Пт фев 23, 2018 09:40:01
BOB51
Совершенно неудачный подход к решению задачи:
"...сначала создам простое, а затем добавляю обвеску..."
Дело в том, что постепенное наращивание периферии без начального планирования и распределения ресурсов под возможное наращивание в процессе начального проектировании схемы неизбежно приведет в конфликтам минимум в программной части проекта.
Так чот в Вашем, ROMan2947 случае КАЖДУЮ схемку лучше начинать проектировать заново, исходя из наработанного ранее опыта (вариации библиотек) и текущей поставленной задачи.
Возможно прийдется и схемотехнику подключения внешних устройств и распределение взаимосвязей между программными модулями (подпрограммами) изменять.
Со временем и опыт изначального планирования "идея -схема -программа" прийдет. На начальном этапе надо стараться действовать "по правилам" (или как можно ближе к ним).
МК штука прикладная...
Так что ежли "затык" и не совсем понятно как объяснить для "уже знающих" возникшую проблему начинаем с выкладывания
схема
исходник
чего хотелось получить
что получилось в реале (предпочтительно макет - но для большинства сейчас и симулятора протезного хватит).
:beer:

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

Добавлено: Пт фев 23, 2018 09:43:50
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();

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

Добавлено: Пт фев 23, 2018 09:49:49
Ivanoff-iv
while (!(ds18b20_PIN&(1 << DQ))); может выполняться очень долго, вот, во время его и попробуй разрешить прерывания

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

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