Прерывания в AVR
Здравствуйте! Написана программа, подключены библиотеки, но все это сделано без учета прерываний.На данном этапе появилась необходимость использования их. Без них все вроде работает красиво и как надо. Настроил и включил прерывание и тут начался беспредел...Я понимаю что это связано с тем,что прерывания влезают не в свое дело и портят картину. Как и где именно расставить запреты?
- Реклама
Руками и там.
Docendo discimus
[uquote="pyzhman",url="/forum/viewtopic.php?p=3314601#p3314601"]Руками и там.[/uquote] +1 к рейтингу
я так понимаю, это был сарказм. а теперь перечитайте, что вы написали, и скажите, какая полезная информация содержится в вашем тексте?ROMan2947 писал(а):+1 к рейтингу
вы написали что-то типа мычания пьяного сторожа зоопарка, у которого слон сбежал "я того этого, а он как это, ну того самое, ну ваще, это ж надо так!"
так что вполне бы вам минусов надо подсыпать в топку...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 522
- Зарегистрирован: Чт янв 21, 2016 15:59:10
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3314598#p3314598"]Я понимаю что это связано с тем,что прерывания влезают не в свое дело и портят картину. Как и где именно расставить запреты?[/uquote] 
- Реклама
Снова КОТЕНКА закусюкали...
Ежли человек только за те МК взялся - естественно и ошибки/неточности будут.
Тем более, когда старт не с азов железа, а по современным учебникам и...
Это мы с карандашика и пустографки начинали - а сейчас ХИТРЫ ДЯДИ народ готовым СЫРОМ пичкают (адуринки, Сишные проекты и прочая начинка МЫШЕЛОВОК).

Ежли человек только за те МК взялся - естественно и ошибки/неточности будут.
Тем более, когда старт не с азов железа, а по современным учебникам и...
Это мы с карандашика и пустографки начинали - а сейчас ХИТРЫ ДЯДИ народ готовым СЫРОМ пичкают (адуринки, Сишные проекты и прочая начинка МЫШЕЛОВОК).
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3314598#p3314598"]Я понимаю что это связано с тем,что прерывания влезают не в свое дело и портят картину. Как и где именно расставить запреты?[/uquote]
Есть такая программка... Proteus называется https://ru.wikipedia.org/wiki/Proteus_( ... тирования)
с её помощью можно всё помостреть и настроить... Иногда даже не вдаваясь в подробности кода))
Есть такая программка... Proteus называется https://ru.wikipedia.org/wiki/Proteus_( ... тирования)
с её помощью можно всё помостреть и настроить... Иногда даже не вдаваясь в подробности кода))
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
Для чего прерывания вам?ROMan2947 писал(а):Написана программа, подключены библиотеки, но все это сделано без учета прерываний.На данном этапе появилась необходимость использования их.
ROMan2947 писал(а):Без них все вроде работает красиво и как надо.
[uquote="ARV",url="/forum/viewtopic.php?p=3314723#p3314723"]
у меня в данной проблеме к сожалению полная растерянность и полное парение в пространстве.Если б я знал какую полезную информацию Вам закинуть, возможно и не появилась бы эта тема.
Добавлено after 6 minutes 15 seconds:
[uquote="Dimon456",url="/forum/viewtopic.php?p=3314796#p3314796"]
Дело в том,что поэтапно я навешиваю на МК периферию. Сначала LCD,ds18b20,клавиатуру,ds1307,генераторы импульсов и т.д. часть периферии навешал, где не использовалось прерывание все работает.Сейчас подключаю генераторы импульсов тут-то и нужны стали INTы...
а теперь перечитайте, что вы написали, и скажите, какая полезная информация содержится в вашем тексте?[/uquote]ROMan2947 писал(а):+1 к рейтингу
у меня в данной проблеме к сожалению полная растерянность и полное парение в пространстве.Если б я знал какую полезную информацию Вам закинуть, возможно и не появилась бы эта тема.
Добавлено after 6 minutes 15 seconds:
[uquote="Dimon456",url="/forum/viewtopic.php?p=3314796#p3314796"]
Для чего прерывания вам?ROMan2947 писал(а):Написана программа, подключены библиотеки, но все это сделано без учета прерываний.На данном этапе появилась необходимость использования их.
[/uquote]ROMan2947 писал(а):Без них все вроде работает красиво и как надо.
Дело в том,что поэтапно я навешиваю на МК периферию. Сначала LCD,ds18b20,клавиатуру,ds1307,генераторы импульсов и т.д. часть периферии навешал, где не использовалось прерывание все работает.Сейчас подключаю генераторы импульсов тут-то и нужны стали INTы...
Прерывания нужно запрещать там, где требуется приоритет над ними - например тайминг логического состояния в программной реализации протокола. Только нужно учитывать моменты, вроде "не менее" или "не более" и все будет хорошо. Например, в I2C - время лог. 0 в линии CLK - не ограничено для микросхемы 24Сxx. Т.е., выставив уровни на выводах можно разрешать прерывания и включать задержку. А получится она 5мкС (100 кГц) или 50 из-за прерывания будет не важно.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
[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]
есть у меня эта программа,да только она уже пылью покрылась.....только я не понимаю как в ней это можно решить проблему...
Есть такая программка... Proteus называется https://ru.wikipedia.org/wiki/Proteus_( ... тирования)
с её помощью можно всё помостреть и настроить... Иногда даже не вдаваясь в подробности кода))[/uquote]
есть у меня эта программа,да только она уже пылью покрылась.....только я не понимаю как в ней это можно решить проблему...
Подключить в нее *.obj или аналогичный (не *.hex) файл и запустить в пошаговом выполнении. На вектора прерываний поставить точки останова - по выходу будете знать, откуда был "прыжок" и чем он чреват для данного участка кода.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
[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 пройтись,нет?
Момент "не менее" я думаю невозможно испортить прерыванием.... а вот "не более"" легко. значит главный враг это время?
Добавлено after 3 minutes 11 seconds:
[uquote="dr.doc",url="/forum/viewtopic.php?p=3315041#p3315041"]Подключить в нее *.obj или аналогичный (не *.hex) файл и запустить в пошаговом выполнении. На вектора прерываний поставить точки останова - по выходу будете знать, откуда был "прыжок" и чем он чреват для данного участка кода.[/uquote]ммм...начинаю понимать про что Вы...для этого я думаю лучше avrdragonom пройтись,нет?
Proteus допускает пошаговую отладку при симуляции. При этом также доступен код, который был подключен к контроллеру.
А про "не ...." - нужно выделить данные участки кода, критичные ко времени выполнения, и выделить их в cli - sei.
А про "не ...." - нужно выделить данные участки кода, критичные ко времени выполнения, и выделить их в cli - sei.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Описание схемы или ее предоставление в форум. Как и что делало устройство "до". Что добавлено в код и как стало неправильно работать. С приложением исходного кода, но только не в виде портянки на 8 листов.ROMan2947 писал(а):Если б я знал какую полезную информацию Вам закинуть,
ROMan2947, представте , что на мед.форуме Вы создали топик: "Мне было хорошо, я что-то съел и мне стало плохо, дайте таблетку". Как Вы думаете, Вам помогут с таким вопросом? И не удивлюсь, что если все-таки вытянут из Вас нужную инфу, то окажатся съели Вы банан, подскользнулись на его шкуре, сломали ногу и нужна совсем не таблетка.
если делать поуму - скорее весь код придется переписать, раскладывая по полочкам,
если костылить - найдите в коде delay_ms(); (думаю если всё сделано без прерываний - они у вас есть) и разрешайте прерывания до них, а сразу после запрещайте обратно, может и поможет.
если костылить - найдите в коде delay_ms(); (думаю если всё сделано без прерываний - они у вас есть) и разрешайте прерывания до них, а сразу после запрещайте обратно, может и поможет.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Совершенно неудачный подход к решению задачи:
"...сначала создам простое, а затем добавляю обвеску..."
Дело в том, что постепенное наращивание периферии без начального планирования и распределения ресурсов под возможное наращивание в процессе начального проектировании схемы неизбежно приведет в конфликтам минимум в программной части проекта.
Так чот в Вашем, ROMan2947 случае КАЖДУЮ схемку лучше начинать проектировать заново, исходя из наработанного ранее опыта (вариации библиотек) и текущей поставленной задачи.
Возможно прийдется и схемотехнику подключения внешних устройств и распределение взаимосвязей между программными модулями (подпрограммами) изменять.
Со временем и опыт изначального планирования "идея -схема -программа" прийдет. На начальном этапе надо стараться действовать "по правилам" (или как можно ближе к ним).
МК штука прикладная...
Так что ежли "затык" и не совсем понятно как объяснить для "уже знающих" возникшую проблему начинаем с выкладывания
схема
исходник
чего хотелось получить
что получилось в реале (предпочтительно макет - но для большинства сейчас и симулятора протезного хватит).

"...сначала создам простое, а затем добавляю обвеску..."
Дело в том, что постепенное наращивание периферии без начального планирования и распределения ресурсов под возможное наращивание в процессе начального проектировании схемы неизбежно приведет в конфликтам минимум в программной части проекта.
Так чот в Вашем, ROMan2947 случае КАЖДУЮ схемку лучше начинать проектировать заново, исходя из наработанного ранее опыта (вариации библиотек) и текущей поставленной задачи.
Возможно прийдется и схемотехнику подключения внешних устройств и распределение взаимосвязей между программными модулями (подпрограммами) изменять.
Со временем и опыт изначального планирования "идея -схема -программа" прийдет. На начальном этапе надо стараться действовать "по правилам" (или как можно ближе к ним).
МК штука прикладная...
Так что ежли "затык" и не совсем понятно как объяснить для "уже знающих" возникшую проблему начинаем с выкладывания
схема
исходник
чего хотелось получить
что получилось в реале (предпочтительно макет - но для большинства сейчас и симулятора протезного хватит).
Полезная информация!!!
где здесь необходимо использовать cli(), sei();
Спойлер
Код: Выделить всё
#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();
}
}
Последний раз редактировалось ROMan2947 Пт фев 23, 2018 11:42:50, всего редактировалось 1 раз.
while (!(ds18b20_PIN&(1 << DQ))); может выполняться очень долго, вот, во время его и попробуй разрешить прерывания
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
ROMan2947
Текстовку ставить под спойлер надо (выделяем текст - жмем Code, снова выделяем все что получилось/с окантовочными символами/ и жмем spoiler) - так основные тексты сообщений не будут загромождаться. А кому интереснт - откроют полный текст.
Для контроля результата перед окончательной отправкой есть кнопа "предпросмотр".

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



