-
Постов
42 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Блоги
Сообщения, опубликованные kostya_unix
-
-
2 часа назад, kostya_unix сказал:
Очень рад Вас видеть.
Да. Я этой функцией превратил в кирпич два контроллера.
Но отрицательный результат тоже результат. Научился и понял.
Очень хотелось бы Вас по имени назвать, но не знаю его (жаль). Мое имя Константин.
Уважаемый @Starichok. Может Вы подскажете по возвращаемым значениям в проверке условия if() ?
Начал изучат модуль ENC26J60 и в коде программы нашел вот такой кусочек кода :
// При необходимости, пропускаем "ложный" байт if(adr & 0x80) enc28j60_rx();
Понимаю, что 0x80 это маска, но вот с какое возвращаемое значение не пойму. По идее должно быть числовое, тогда с каким числом сравнивается?
Опять же маска, в этом случае, не возвратит bool_значение....
@Starichok Вы знаете, разобрался. Спасибо ребятам, подсказали.
0 -
-
Только что, IMXO сказал:
кем проверяются? очередной тупой вопрос ради вопроса
Я предполагал, что команда (cmd) будет именно 0x80
2 минуты назад, Vascom сказал:Ты же сказал, что понимаешь что такое маска.
Нет, дел не имел.
Еще раз спасибо за ответ. Я, почему то, подумал, что будет проверятся не один бит, а несколько. Еще раз спасибо.
5 минут назад, kostya_unix сказал:Я предполагал, что команда (cmd) будет именно 0x80
Еще раз спасибо за ответ. Я, почему то, подумал, что будет проверятся не один бит, а несколько. Еще раз спасибо.
Понимаете что меня смутило. Это то что если эту операцию (0x80 & 0x80) я через UART вывел в консоль компьютера и там было именно 128.
Ни 1 ни 0.
12 минут назад, kostya_unix сказал:Я предполагал, что команда (cmd) будет именно 0x80
Еще раз спасибо за ответ. Я, почему то, подумал, что будет проверятся не один бит, а несколько. Еще раз спасибо.
Понимаете что меня смутило. Это то что если эту операцию (0x80 & 0x80) я через UART вывел в консоль компьютера и там было именно 128.
Ни 1 ни 0.
Да. Именно так. 128 отличное от 0.
0 -
Только что, Vascom сказал:
Тогда маска была бы 0xFF.
Да. Вы правы. Теперь понятно.
0 -
1 минуту назад, Vascom сказал:
Какая разница какой диапазон, если тебе надо проверить только восьмой бит?
А Вы, случайно, не имели дело с этим (ENC28J60) модулем ?
0 -
А если проверяются все 8 бит?
0 -
Только что, kostya_unix сказал:
Тогда возвращается 0.
Но тогда и диапазон между 0x80 и 0x7F уж очень большой.
Только что, Vascom сказал:Сперва выполняется битовая операция (она нужна чтобы выделить один бит из adr), затем уже if.
Тогда проверяется старший бит?
0 -
Только что, IMXO сказал:
а если сом=0х7F , что вернется?
Тогда возвращается 0.
0 -
1 минуту назад, IMXO сказал:
все что не равно нулю есть ИСТИНА
Если com = 0x80, тогда возвращается 0x80.
И если com = 0x8F тогда возвращается тоже 0x80.
Зачем тогда сравнение в if().
Только что, kostya_unix сказал:Если com = 0x80, тогда возвращается 0x80.
И если com = 0x8F тогда возвращается тоже 0x80.
Зачем тогда сравнение в if().
Возвращаемое значение никак не изменяется.
Только что, kostya_unix сказал:Если com = 0x80, тогда возвращается 0x80.
И если com = 0x8F тогда возвращается тоже 0x80.
Зачем тогда сравнение в if().
Возвращаемое значение никак не изменяется.
Я бы понял, если бы проверялся один бит. НО тут их гораздо больше участвует.
0 -
3 минуты назад, IMXO сказал:
серьезно? и поэтому ты решил этим тупым вопросом засрать весь форум?
а открыть учебник по Си религия не позволяет? читаем до полного просветленияТолько что, Vascom сказал:Логическое значение в C-это целое число: ноль для false и ненулевое для true.
Для логических значений - правильно. Но как быть с битовой операцией & ?
9 минут назад, IMXO сказал:серьезно? и поэтому ты решил этим тупым вопросом засрать весь форум?
а открыть учебник по Си религия не позволяет? читаем до полного просветленияПрошу прощения за свой вопрос. Но тут как раз и не принимает (т.е не возвращает 1 или 0) действие с операндами в условии if().
В условии, насколько я понял, происходит проверка команды на соответствие значения 0x80. Если com = 0x80, тогда возвращается 0x80.
И если com = 0x8F тогда возвращается тоже 0x80.
Зачем тогда сравнение в if().
Если я не прав, тогда пожалуйста укажите где.
Еще раз повторю: -- bool_значение возвращают операторы сравнения и логические операторы
0 -
Во время изучения кода для модуля ENC28J60 столкнулся с частью кода, который не совсем понятен.
Может быть кто растолкует?
Использую Atmel Studio 7
// Отправляем команду enc28j60_tx(cmd | (adr & 0x1f)); // При необходимости, пропускаем "ложный" байт if(adr & 0x80) enc28j60_rx(); // Читаем данные data = enc28j60_rx();
Собственно вопрос: - не понятно возвращаемое значение условия if(adr & 0x80).
Понимаю, что & 0x80 это маска и она накладывается на значение переменной adr, но , в таком случае, полученное значение должно с чем-то сравниваться.
Насколько я понимаю bool_значение возвращают операторы сравнения и логические операторы( в этом случае было бы понятно выражение (adr & 0x80).
Но тут возвращается целочисленное значение и никак не 1 или 0.
Пожалуйста подскажите что тут не так. Заранее всем благодарен.
0 -
Только что, Starichok сказал:
очень вредная функция в твоем программаторе. забудь про нее и никогда не пользуйся.
Очень рад Вас видеть.
Да. Я этой функцией превратил в кирпич два контроллера.
Но отрицательный результат тоже результат. Научился и понял.
2 минуты назад, Starichok сказал:очень вредная функция в твоем программаторе. забудь про нее и никогда не пользуйся.
Очень хотелось бы Вас по имени назвать, но не знаю его (жаль). Мое имя Константин.
Уважаемый @Starichok. Может Вы подскажете по возвращаемым значениям в проверке условия if() ?
Начал изучат модуль ENC26J60 и в коде программы нашел вот такой кусочек кода :
// При необходимости, пропускаем "ложный" байт if(adr & 0x80) enc28j60_rx();
Понимаю, что 0x80 это маска, но вот с какое возвращаемое значение не пойму. По идее должно быть числовое, тогда с каким числом сравнивается?
Опять же маска, в этом случае, не возвратит bool_значение....
0 -
И снова здравствуйте. С момента публикации моего последнего комментария прошло 1,5 года. Многое за это время изменилось и в моей жизни (переболел то-ли короной, то-ли гормональный сбой в организме был (еле еле "вычухался")) и в жизни нашей страны.
Хотелось бы уточнить по поводу инициализации DS18B20. Понимаю, что тема избитая, но все же. Может кому ни будь да полезной будет.
Вся эта история началась с невозможности програмно определить присутствие датчика в схеме. По всей видимости (пришлось столкнуться с этим еще раз), проблема была в программе AVRDUDE_PROG. Заметил, что когда установлена галочка в FUSE автоматического программирования, тогда и вылазила проблема с присутствием датчика. А если программировать по отдельности (с начало fuse, а затем programm), то все проходит хорошо.
Всем крепкого здоровья и благополучия.
0 -
8 hours ago, elki said:
Скачайте себе книгу по С, очень доходчиво все и с контрольными вопросами Дейтел П.Дж., Дейтел Х.М. Как программировать на С. и Евстифеев микроконтроллеры avr очень все расписано доходчиво, помогут разобраться что к чему.
@elki спасибо. Евстифеева скачал (5-е издание).
Наверное в книгах есть ответы на многие вопросы. Но ,Вы знаете, живое общение ( а особенно со знающими и , главное, помогающим начинающим (@Starichok ,@ARV особая благодарность) ) дорогого стоит.
Опять же и Вам @elki спасибо большое.
0 -
Мне достались , по случаю, несколько приборов безопасности ОНК-160 от автомобильных кранов, так в них стоят ЖКИ MT-20S4M. Четыре строки по 20 символов. Контроллер в нем идентичен с дисплеем 1602. За неимением другого экрана использую его.
1 час назад, Starichok сказал:но я так понял, что твое устройство не критично к потерям времени во время прерывания по таймеру.
я не знаю логику работы твоей программы. я не знаю, с какой периодичностью "крутится" твой главный цикл в ожидании прерывания по таймеру.
Устройство у меня просто термометр. Но.... Началось вся эта история с термометром , как говорится, с выходом из-за печки. Живу в своем доме, местное отопление (котел, батареи и тому подобное). В один прекрасные день накрылся медным тазом центробежный насос, который гонял воду по батареям. Поставил другой. Так тот другой, на третьей скорости гудит, не сказать что сильно, но ночью , проснувшись слышишь и это мешает. Вставать переключать на 1 скорость нет никакого желания. Так вот собственно и зародилась мысль с помощью терморегулятора переключать, в зависимости от температуры, эти самые скоростя. Скажем от 25 до 40 градусов первая скорость, 40-60 вторая, ну и выше 60 уже третья. Но если температура ниже 20 что бы отключал насос совсем.
Опять же выставлять уставки температурные хочу через кнопки (3 штуки). 25 градусов дошла температура - нажал первую кнопку - значения записались в EEPROM на первую скорость. Дошла температура до второго рубежа - нажал вторую кнопку и т.д. Но с моим навыком и знаниями в пропграммировании понимаю, что без костылей не обойдусь. Зато опыт, какой никакой приобрету.
1 час назад, Starichok сказал:запускать измерения в АЦП и проверять энкодер
А это в коком устройстве используется? Я с помощью АЦП хочу в дальнейшем сделать управление позиционирования задвижки в котельном оборудовании. Но это пока в далеких мечтах.
1 час назад, Starichok сказал:там у меня таймер просто в начало стека помещает адрес начала главного цикла, и больше ничего не делает.
А вот этот момент для меня вообще..... Вообщем понимаю, что я дуб как дерево. Но не боги горшки обжигают - сдюжим и мы.
0 -
7 часов назад, Starichok сказал:
ты меня не понял (не совсем понял).
у тебя получилось "через раз". первую секунду запускаешь конвертацию, вторую секунду читаешь температуру.
а у меня это делается КАЖДУЮ секунду. я прочитал температуру, и тут же запускаю конвертацию.
к следующей секунде конвертация уже завершена, и я опять читаю и запускаю...
таким образом, тебе не нужен этот признак работы "через раз". ты тоже можешь делать также - читать и запускать измерение КАЖДУЮ секунду.
Действительно так ! Прочитали, запустили конвертацию (именно в такой последовательности) и ушли "заниматься" другими, делами. А до следующего обращения к датчику, температура уже будет преобразована и ждать нашей команды считывания.
Дело в том, что первоначально меня смутила задержка между командами конвертации и считывания температуры. Поэтому алгоритму я и реализовал получение температуры. В Вашем случае, @Starichok , получается более изящно - признаю.
Подправил свой код по Вашему примеру. Спасибо!
И еще вопрос: критично ли запускать функцию конвертации/считывания непосредственно в обработчике прерывания или лучше использовать действие над переменной ( в обработчике прерывания) и уже исходя из результата обработки переменной выполнять какое либо действие в рабочем цикле программы?
0 -
В 09.06.2019 в 17:09, Starichok сказал:
дело в том, что при отработке паузы с помощью _delay_ms(750) МК больше НИЧЕГО в это время делать не может. это пустая трата процессорного времени.
точнее, МК во время отработки паузы может обрабатывать прерывания.
можно делать такую проверку. а можно и не делать.
например, у меня полный приборный цикл равен 1 секунде. но я точно знаю (и ты это знаешь), что 1 секунду преобразование температуры гарантированно закончится.
поэтому я без проверки считываю новую температуру и запускаю новую конвертацию.
что должен делать твой прибор, я не знаю. могу только сказать, что окончательное решение ты должен выбрать сам.
вариантов тут несколько.
1. тупо делать задержку с помощью delay.
2. тупо сидеть в цикле и по кругу проверять на завершение конвертации. этот вариант потребует те же самые 700-750 мс бесполезной потери времени.
3. делать, как я - 1 раз в секунду без проверки считывать новую температуру и запускать новую конвертацию.
может, чья-то фантазия придумает еще другие способы...
@Starichok здравствуйте. Сегодня реализовал команды измерения и считывания температуры с датчика через прерывание от Т/С_1. Написал две функции: первая для измерения, вторая для считывания температуры. В обработке таймера, с интервалом примерно в 1 секунду, выполнял операцию XOR над единицей (I ^= 1;). А уже в главном цикле программы, в проверке условия, проверял значение I. Если i==1 тогда функция измерения температуры, иначе считывание. Спасибо Вам за подсказку!
0 -
@ARV здравствуйте. В вашем примере выше (вывод строки на дисплей) Вы использовали указатель. Подскажите пожалуйста, в каких случаях предпочтительнее использовать указатели?
В случае вывода строки на дисплей - очень удобно ( нет нужды использовать массив).
0 -
27 минут назад, ARV сказал:
У вас как-то, похоже, перепутано что-то.
Глобальная переменная в модуле видна везде "ниже по тексту". Если эта глобальная переменная описана, как static, она не видна в других модулях нигде, если не описана как static, то линкер найдет её, хотя, вероятно, будет warning (лучше стараться избегать такого путем описания в h-файле этой переменной с префиксом extern, тогда все будет идеально правильно).
Внутри функции вы можете использовать любые видимые переменные, включая локальные. Наружу из функции результат выдается традиционно - возвратом значения функции (при помощи return). Этот самый результат может быть помещен в месте обработки в переменную - локальную или глобальную, в зависимости от необходимости. Поскольку любая обработка ведется внутри другой функции, то жесткого требования для хранения результата в глобальной переменной нет - на ваш выбор. Но, как я уже писал, глобальные переменные - не очень хорошая штука, и, если можно, то лучше их избегать (без фанатизма, конечно).
Я понятно объяснил?
Да @ARV все понятно. Тем более, что после Вашего предыдущего ответа с примером по преобразованию числового значения в строковое еще раз перечитал по функциям (входящие аргументы, возвращение значения и то что в теле функции можно присвоить возвращающее значение глобальной переменно и при этом не использовать return).
Начал изучать указатели (только пока с большим скрипом в понимании).
И еще. Чем больше читаю как ваши и @Starichok ответы, как у меня в теме, так и в других, тем больше понимаю, что я не знаю в программировании ничего от слова совсем. Но это меня не расстраивает - есть к чему стремится.
Спасибо вам.
0 -
Здравствуйте @ARV и @Starichok . Из приведенного Вами примера выше стал изучать указатели.
Еще раз спасибо Вам за участие и помощь.
Хотя по поводу использования локальных переменных в функциях в глобальной видимости пока ничего не нашел.
В 25.06.2019 в 13:02, kostya_unix сказал:Или есть другой способ отобразить, в данном случае, возвращаемые данные на LCD_дисплее?
Это по поводу моего вопроса и моих поисков ответа по нему - же.
0 -
Очень интересно !!!!
0 -
@ARV и @Starichok спасибо Вам бОльшое за участи в моем "гиблом" деле Я прям увереннее стал чувствовать себя, спасибо.
В ближайшее время обязательно ознакомлюсь с функцией itoa, со строковым представлением символьных данных.
Все таки общение в сообществе приносит гораздо больше знаний и результата нежели самостоятельное изучение (хотя и оно тоже приносит не малый результат).
Учится мне еще и учится.
1 -
Уважаемый @ARV простите меня за этот код:
lcd_dat(((checkcrc()/100)%10)+48); lcd_dat(((checkcrc()/10)%10)+48); lcd_dat((checkcrc()%10)+48);
Хочется что-то сказать в свое оправдание.... Но на ум ничего не приходит.По всей видимости торопился, когда писал ответ на форум и скорей всего от незнания.
Если я правильно понимаю, то возвращаемое значение функции должно быть присвоено глобальной переменной?
uint8_t crc_2; // объявлена глобально
int checkcrc() // функция посчета значения контрольной суммы { uint8_t crc =0; for (uint8_t i=0; i<(sizeof term_code / sizeof term_code[0]); i++) //for (uint8_t i=0; i<8; i++) { crc = _crc_ibutton_update(crc, term_code[i]); } return crc_2=crc; }
Или есть другой способ отобразить, в данном случае, возвращаемые данные на LCD_дисплее?
lcd_dat('R'); lcd_dat('C'); lcd_dat('_'); lcd_dat('2'); lcd_dat('='); lcd_dat(((crc_2/100)%10)+48); lcd_dat(((crc_2/10)%10)+48); lcd_dat((crc_2%10)+48);
Подскажите пожалуйста.
22 часа назад, Starichok сказал:вот, ты нашел алгоритм вычисления CRC.
ты должен был понять, что при вычислении обрабатывается КАЖДЫЙ бит всей последовательности плюс участвует КАЖДЫЙ байт последовательности.
а теперь поищи в инете, что такое CRC и что по возвращаемому числу можно определить в каком бите (или в нескольких разных битах) всей последовательности битов произошла ошибка.
@Starichok обязательно найду и разберусь в сути вопроса, но без учителя у меня уйдет много времени. В интернете находил такую информацию, но я ее читаю, а она от моей головы отскакивает как от стенки горох. Слишком уж много непонятных слов для меня (пока). Мне бы решение этого вопроса на бумагу переложить (подсчитать вручную с помощью карандаша и бумаги).
Если не получится самостоятельно разобраться, пойду в институт к своему преподавателю по математики, попрошу ее растолковать мне эту методику.
Она нам всегда говорила, что красивей математики может быть только музыка.
0 -
В 21.06.2019 в 17:26, ARV сказал:
Параметр sizeof должен быть в скобках.
@ARV спасибо бОльшое за ценные советы.
Исправил.
В 21.06.2019 в 17:26, ARV сказал:Считать CRC удобнее не для 8, а для всех 9 байтов, т.е. включая CRC, т.к. в этом случае при совпадении подсчитанной и переданной контрольных сумм результат будет равен нулю, а при несовпадении - не равен. Проверять проще.
Опять же спасибо большое.
Сейчас на работе проверил - все именно так. У меня у Вам небольшой вопрос (уточнение): возвращает в случке ошибки не ноль, а от чего зависит значение возвращаемого числа в случае ошибки ( не совпадения)? У меня выводится число 99 в десятичной системе ( вывожу на Ж.К. дисплей для контроля):
lcd_dat(((checkcrc()/100)%10)+48); lcd_dat(((checkcrc()/10)%10)+48); lcd_dat((checkcrc()%10)+48);
0
Инициализация DS18B20
в Периферия и внешние устройства
Опубликовано
Владимир спасибо за разъяснение правил. Поверьте мне, я не со зла. Впредь буду аккуратней.
Про измерение длительности импульсов @Eddy_Em .... Все, как раз, и началось с того, что по тексту программы все длительности в аккурат укладывались в тайминг. Но вот только ответа (импульс присутствия) так и не удавалось получить. И это все приключилось тогда, когда я только начал изучать и этот датчик и знакомится с интерфейсом 1-Wire.Просидел над этой проблемой неделю. Перечитал инструкцию несколько раз, пересчитал тайминги согласно графику не один раз.
А проблема была в программе AVRDUDE. Вернее в использовании ее мной.
Насчет жуткости кода.... Вы еще не видели, что я потом наваял. Вот это действительно жуть.
Но я его не покажу. Боюсь гнева профессионалов.
Ну да ладно. Научимся и мы. Не боги горшки обжигают.
Всем здоровья и благополучия.