Перейти к содержанию

Вопросы от начинающих по МК


Рекомендуемые сообщения

Warning 7 'return' with a value, in function returning void [enabled by default]

Вы пытаетесь вернуть значение return Itog_; типа Int из функции типа Void. И зачем вообще возвращать так значение из прерывания?

Подскажите, как правильно это делать? Я сделал так основываясь на своих знаниях, ну и в конце работает то :yes: .
Warning 14 control reaches end of non-void function [-Wreturn-type]

Это означает, что функция Opros_klaviatury () может завершиться так и не попав на return Temp=mass2[j];, т.е. она(функция) не вернет никакого значения или вернет случайное(произвольное) значение.

P.S. Вроде так если память не изменяет ;) И одна просьба - форматирование текста применяйте, а то тяжело читать.

То что функция завершится не попав на return Temp=mass2[j] исключено. Я так понимаю особенность компилятора...или я так пишу через зад?

А что скажете про:

Warning 1 array subscript has type 'char' [-Wchar-subscripts] ?

Это предупреждение указывает на каждую строку где есть массив в функции Opros_klaviatury ()

P.S. Извините за формат, только учусь :thank_you2:

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

То что функция завершится не попав на return Temp=mass2[j] исключено.
Да ну...

Условие if(((PINB&inputState[j])==0)) не выполнится и всё, выход...

Подскажите, как правильно это делать?
А что нужно сделать то ? Вернуть значение из функции с типом void ? - Никак.
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Из прерывания ВООБЩЕ ничего не нужно возвращать. Обработчик прерывания должен быть построен так чтобы не изменять контекст программы т.к. он может быть вызван в любом месте программы, даже во время сравнения двух чисел. А тут бац, что-то откуда-то вернуло какое-то значение... посреди программы. Работает, только потому что компилятор скорей всего соптимизировал эту бессмысленную конструкцию и вырезал к чертям, а если без оптимизации - скопировал возвращаемое значение в неиспользуемый регистр и забыл про него.

И во вторых, в обработчике НЕ НУЖНО запрещать прерывания - они и так аппаратно запрещаются при входе в обработчик и разрешаются при выходе.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

То что функция завершится не попав на return Temp=mass2[j] исключено.
Да ну...

Условие if(((PINB&inputState[j])==0)) не выполнится и всё, выход...

Согласен, не подумавши написал. Ну вроде получилось. Значит изменил функцию char Opros_klaviatury () на void Opros_klaviatury () и изменил return Temp=mass2[j]; на Temp=mass2[j];return;
Подскажите, как правильно это делать?
А что нужно сделать то ? Вернуть значение из функции с типом void ? - Никак.

Из прерывания ВООБЩЕ ничего не нужно возвращать. Обработчик прерывания должен быть построен так чтобы не изменять контекст программы т.к. он может быть вызван в любом месте программы, даже во время сравнения двух чисел. А тут бац, что-то откуда-то вернуло какое-то значение... посреди программы. Работает, только потому что компилятор скорей всего соптимизировал эту бессмысленную конструкцию и вырезал к чертям, а если без оптимизации - скопировал возвращаемое значение в неиспользуемый регистр и забыл про него.

Изменил в функции прерывания так: return itog_; на просто return; ошибка пропала. Получается, возвращать значение и не надо, т.к. itog_- глобальная переменная. Достаточно просто зайти в прерывание увеличить глобальную переменную на единицу и выйти :dance2: .

И во вторых, в обработчике НЕ НУЖНО запрещать прерывания - они и так аппаратно запрещаются при входе в обработчик и разрешаются при выходе.

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

P.S. А почему никто не скажет что делать с Warning 1 array subscript has type 'char' [-Wchar-subscripts] ?

Это предупреждение указывает на каждую строку где есть массив. Может просто забить на нее?

Итого я для себя понял, что не нужно возвращать значения глобальных переменных из функции, так как они ГЛОБАЛЬНЫЕ!

Всем большое спасибо!

Ссылка на комментарий
Поделиться на другие сайты

НЕ НУЖНО запрещать прерывания - они и так аппаратно запрещаются при входе в обработчик и разрешаются при выходе.

далеко не на всех платформах. Там где контроллер прерываний многоуровневый прога запросто из одного прерывания может уйти в более приоритетное. Для атмеги не актуально наверное, но помнить про это полезно. В STM например такой механизм

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Итого я для себя понял, что не нужно возвращать значения глобальных переменных из функции, так как они ГЛОБАЛЬНЫЕ!

Тут можно немножечко по другому объяснить.

например. есть функция вывода числа на экран(дисплей)

эта функция принимает всякие там значения(положения курсора, размер шрифта и т.д.) в том числе и переменную содержащую то число что нужно вывести.

но зачем заводить лишнюю переменную и постоянно вызывать функцию которая посчитает число для нашей лишней переменной???

гораздо проще объявить эту функцию как int и возвращать значение из нее, а в функции вывода на дисплей указывать не переменную а ту самую функцию как параметр.

надеюсь понятно объяснил.

но это только один из примеров. там еще куча всяких полезностей есть

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

баловство глобальными переменными почти всегда приводит к немасштабируемому коду плохо поддающемуся повторному использованию

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Итого я для себя понял, что не нужно возвращать значения глобальных переменных из функции, так как они ГЛОБАЛЬНЫЕ!

Тут можно немножечко по другому объяснить.

например. есть функция вывода числа на экран(дисплей)

эта функция принимает всякие там значения(положения курсора, размер шрифта и т.д.) в том числе и переменную содержащую то число что нужно вывести.

но зачем заводить лишнюю переменную и постоянно вызывать функцию которая посчитает число для нашей лишней переменной???

гораздо проще объявить эту функцию как int и возвращать значение из нее, а в функции вывода на дисплей указывать не переменную а ту самую функцию как параметр.

надеюсь понятно объяснил.

но это только один из примеров. там еще куча всяких полезностей есть

Да, я понял про что вы говорите. Вот разбирался с чей-то библиотекой для работы с часами реального времени. Там как раз и было так реализовано как вы говорите. Функция в качестве параметра. Это первая программа на СИ (не считая моргания светодиодом :) ), так что в следующих будем учитывать нюансы.
Ссылка на комментарий
Поделиться на другие сайты

А как же тогда будет происходить приоритет срабатывания прерывания?
Приоритет обеспечивается контроллером прерываний, там где он есть. В ATMEGA нет никаких приоритетов - какое прерывание обрабатывается то и главное, приоритет там работает только в одном случае - если несколько прерываний возникли одновременно(в пределах 4-х тактов) тогда первым на исполнение идет прерывание с меньшим адресом.
из одного прерывания может уйти в более приоритетное
Это вполне логичное и правильное поведение, но НИГДЕ не видел чтобы в обработчиках запрещали прерывания без особой на то необходимости, тем более в самом начале обработчика до которого может возникнуть другое прерывание, пока этот обработчик сохраняет контекст.
Достаточно просто зайти в прерывание увеличить глобальную переменную на единицу и выйти

Для обработчика в принципе да достаточно, но сколько это вызовет граблей в основном коде программы...

Например, если прерывание возникнет во время сравнения этой переменной, или ещё хуже в процессе вычисления некой формулы, куда входит эта переменная(хуже, когда несколько раз в одной формуле!). Результат может быть непредсказуем, и ОООЧЕНЬ редко возникает что затрудняет диагностику проблемы и её локализацию.

Изменено пользователем Alexeyslav

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Достаточно просто зайти в прерывание увеличить глобальную переменную на единицу и выйти

Для обработчика в принципе да достаточно, но сколько это вызовет граблей в основном коде программы...

Например, если прерывание возникнет во время сравнения этой переменной, или ещё хуже в процессе вычисления некой формулы, куда входит эта переменная(хуже, когда несколько раз в одной формуле!). Результат может быть непредсказуем, и ОООЧЕНЬ редко возникает что затрудняет диагностику проблемы и её локализацию.

Я вас понял и учту на будущее. В данном моем случае это не грозит, потому, что количество нужных импульсов уже просчитано и остается постоянным до конца процесса налива жидкости. Единственно что меняется-это количество приходящих импульсов от датчика потока, и эта величина как раз и увеличивается в прерывании и здесь же идет сравнение с эталоном. Возможно будет влиять на индикацию, типа перескакивание сразу на несколько значений.
Ссылка на комментарий
Поделиться на другие сайты

Вопрос:

на atmega8 на счетчик, на выводы TOSC1 и TOSC2 цепляю кварц на 32768Гц обязательно ли туда же цеплять конденсаторы на 22р и на минус их. Что они дают? Видел схемы с кондерами, видел без них просто кварц прицеплен к выводам и все.

Ссылка на комментарий
Поделиться на другие сайты

Возможно будет влиять на индикацию, типа перескакивание сразу на несколько значений.
Там несколько сложнее проблемы. Попробуй поискать в интернете что такое атомарная операция и чем она важна.

Если переменная у тебя 16-битная то проблемы 100% будут если не предпринять соответствующие меры. Просто представь что у тебя прерывание происходит когда старшая часть числа скопирована а младшая ещё нет, в прерывании число инкрементируется происходит перенос в старший разряд и затем программа работает с младшей частью числа, а оно уже новое... в итоге в программу на данной итерации уходит франкенштейн составленный из двух разных половинок двух чисел. Если потом что-то с этим числом делаешь вроде алгоритмов усреднения и дифференцирования возникнут уже огромные проблемы.

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

обязательно ли туда же цеплять конденсаторы на 22р и на минус их. Что они дают?

Конденсаторы являются обязательной частью колебательной системы состоящей из кварца и генератора, без них генератор не заработает или работать будет неустойчиво и далеко от резонансной частоты. Во многих контроллерах есть встроенные конденсаторы которые активируются прошивкой соответствующего бита конфигурации, но по хорошему емкость этих конденсаторов ДОЛЖНА браться из рекомендация производителя конкретного резонатора, установленного в схему - только в таком случае можно обеспечить заявленную точность частоты и ТКЧ для резонатора. Поэтому встроенную опцию можно использовать только в том случае если тебе не важно поддержание точного значения частоты который может обеспечить резонатор. К сожалению многим конструкторам пофиг на это а потом удивляются почему часы спешат/отстают по 10...20 сек и более в сутки. Для более точной подстройки частоты можно использовать подстроечный конденсатор, но это имеет смысл если у вас есть доступ к частотомеру классом точности выше чем используемый резонатор.

Изменено пользователем Alexeyslav

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Хуже того, в ATmega8 эти конденсаторы хотя и должны быть, из-за заводских ошибок частенько могут отсутствовать (см. еррату).

Metka1: if(((PINB&inputState[j])==0))
...
goto Metka1;

goto использовать вообще не рекомендуется, пока не разберетесь с теми полутора исключениями, где это оправдано.
P.S. А почему никто не скажет что делать с Warning 1 array subscript has type 'char' [-Wchar-subscripts] ?
Не нашел объявления i, j и прочих индексов массива. Возможно, они объявлены как char. А насколько я помню, стандарт Си не обязывает считать char ни знаковым, ни беззнаковым. Соответственно, компилятор опасается, что ему передадут отрицательное число в качестве индекса. Объявите как unsigned char.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Возможно будет влиять на индикацию, типа перескакивание сразу на несколько значений.
Там несколько сложнее проблемы. Попробуй поискать в интернете что такое атомарная операция и чем она важна.

Если переменная у тебя 16-битная то проблемы 100% будут если не предпринять соответствующие меры. Просто представь что у тебя прерывание происходит когда старшая часть числа скопирована а младшая ещё нет, в прерывании число инкрементируется происходит перенос в старший разряд и затем программа работает с младшей частью числа, а оно уже новое... в итоге в программу на данной итерации уходит франкенштейн составленный из двух разных половинок двух чисел. Если потом что-то с этим числом делаешь вроде алгоритмов усреднения и дифференцирования возникнут уже огромные проблемы.

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

Значение переменной из прерывания дальше передаётся в функцию вывода результата на дисплей. Значит, как раз во время передачи этой переменной в функцию и может произойти описанный вами момент? Про атомарные операции в курсе, много уроков пересмотрел. Вопрос другой теперь, как же это исправить? Может запретить прерывание перед передачей значения в функцию, а потом в самой функции разрешить?
Metka1: if(((PINB&inputState[j])==0))
...
goto Metka1;

goto использовать вообще не рекомендуется, пока не разберетесь с теми полутора исключениями, где это оправдано.
P.S. А почему никто не скажет что делать с Warning 1 array subscript has type 'char' [-Wchar-subscripts] ?
Не нашел объявления i, j и прочих индексов массива. Возможно, они объявлены как char. А насколько я помню, стандарт Си не обязывает считать char ни знаковым, ни беззнаковым. Соответственно, компилятор опасается, что ему передадут отрицательное число в качестве индекса. Объявите как unsigned char.

По поводу использования goto читал, как не рекомендуют её использовать, ИМХО все это надумано, тут главное не увлечься, трудно потом логику уследить будет. Думаю в пределах одной маленькой функции где все очевидно можно и не париться, если логика логична то почему нет?

Попробовал добавить unsigned к массивам - не помогло. Настройки Atmel Studio могут влиять?

Ссылка на комментарий
Поделиться на другие сайты

Добрый день. Такой вопрос. Есть камень LPC1752. Пытаюсь разобраться с прерываниями по UART. Ни как не пойму, что за прерывание CTI (Character time-out). Из того что вычитал это, то что прерывание срабатывает, если в аппаратном фифо буфере меньше символов, чем задано в настройках триггера. При чём срабатывает с задержкой. Пользуются обычно если фиксированная длинна принимаемых пакетов. Вот только в чём его удобство не пойму, может кто сталкивался, объяснит в каких случаях удобней применять?

Изменено пользователем GOR23
Ссылка на комментарий
Поделиться на другие сайты

вообще я не знаю как лучше и правильнее, но стараюсь char использовать только непосредственно для символьных дел. Для всего остального uint8_t

давно не заглядывал в либу, но по моему это псевдоним unsigned short int

Вот только в чём его удобство не пойму

вообще я лично не сталкивался, но первое что пришло в голову - контроль целостности пакетов по таймауту. То есть если пакет пришел не полный и не за указанное время, то срабатывает прерывание, которое вызывает обработчик ошибки и выполняет очистку буфера для приема следующего пакета. Иначе фифо начнет прием с точки останова и побьет все остальные пакеты

Я бы от такой штуки на STM не отказался, но пока не встречалась. Удобно было бы наверное на скоростных последовательных асинхронных интерфейсах вместо организации халфбуфера

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

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

Для всего остального uint8_t давно не заглядывал в либу, но по моему это псевдоним unsigned short int

Как оно объявлено в конкретной реализации не важно. Важно что гарантируется беззнаковый тип длина не менее 8 бит (в каком-то компиляторе вроде реальный размер равен машинному слову, то ли 16 то ли 32 бита).

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

1) зачем в случае повышающей, мы используем резистор, ведь когда мы замкнем на землю (хотим ноль) что с резистором что без всеравно замкнется на землю и все на шине получат ноль?

2) если мы хотим два мк (контролера) соеденить по 1wire

первый соеденяем так

http://microsin.net/images/stories/programming/AVR318-open-collector-buffer.png

а второй также ? т.е. еще одна линия Vcc подводится к нему и там 3 резистора 2 транзистора . или Vcc к нему не подводится а питается он от шины но тогда какая схема разводки будет у второго мк ?

и тут же

- когда на первом мк мы подаем Tx, HIGH это получается мы опустили шину в ноль ?

- когда на Tx, LOW то на Rx, HIGH ?

спасибо

Ссылка на комментарий
Поделиться на другие сайты

Здравствуйте. Пытался прошить мегу 8 для USBAsp, но в программе UniProf нет 4 окна фьюзов, нет Fuse(Ext), почему?

Изменено пользователем Mika091
Ссылка на комментарий
Поделиться на другие сайты

Потому что в ATmega8 нет efuse.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Может запретить прерывание перед передачей значения в функцию, а потом в самой функции разрешить?

Даже и не думай так делать! Очень, очень вредная привычка.

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

если из тела прерывания разрешить прерывания командой sei, это сработает?
Конечно сработает, но для этого обработчик прерывания должен быть реентерабельным, как и все остальные обработчики. На практике добиться этого бывает очень трудно.
т.е. еще одна линия Vcc подводится к нему и там 3 резистора 2 транзистора . или Vcc к нему не подводится а питается он от шины но тогда какая схема разводки будет у второго мк ?

для низкой скорости не важно... а на больших скоростях и расстояниях оба конца линии должны быть терминированы.

прерывание срабатывает, если в аппаратном фифо буфере меньше символов, чем задано в настройках триггера. При чём срабатывает с задержкой. Пользуются обычно если фиксированная длинна принимаемых пакетов. Вот только в чём его удобство не пойму, может кто сталкивался, объяснит в каких случаях удобней применять?

Когда размер пакетов не фиксирован, вспомни модемный протокол с AT-командами. Это прерывание может быть сигналом к окончанию передачи пакета и что его нужно разбирать, если он не кратен размеру буфера FIFO.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...