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

kostya_unix

Members
  • Постов

    42
  • Зарегистрирован

  • Посещение

Весь контент kostya_unix

  1. Владимир спасибо за разъяснение правил. Поверьте мне, я не со зла. Впредь буду аккуратней. Про измерение длительности импульсов @Eddy_Em .... Все, как раз, и началось с того, что по тексту программы все длительности в аккурат укладывались в тайминг. Но вот только ответа (импульс присутствия) так и не удавалось получить. И это все приключилось тогда, когда я только начал изучать и этот датчик и знакомится с интерфейсом 1-Wire.Просидел над этой проблемой неделю. Перечитал инструкцию несколько раз, пересчитал тайминги согласно графику не один раз. А проблема была в программе AVRDUDE. Вернее в использовании ее мной. Насчет жуткости кода.... Вы еще не видели, что я потом наваял. Вот это действительно жуть. Но я его не покажу. Боюсь гнева профессионалов. Ну да ладно. Научимся и мы. Не боги горшки обжигают. Всем здоровья и благополучия.
  2. @Starichok Вы знаете, разобрался. Спасибо ребятам, подсказали. В этой ветке задавал этот вопрос.
  3. @IMXO @Vascom спасибо Вам большое. Хотелось бы сказать, что недоглядел или еще что то вроде того. Но нет. Знаний не хватает - это так. На чужих ошибках не учусь, только на своих. @IMXO буду читать, читать, читать. И пытаться понять. Спасибо!!!
  4. Я предполагал, что команда (cmd) будет именно 0x80 Еще раз спасибо за ответ. Я, почему то, подумал, что будет проверятся не один бит, а несколько. Еще раз спасибо. Понимаете что меня смутило. Это то что если эту операцию (0x80 & 0x80) я через UART вывел в консоль компьютера и там было именно 128. Ни 1 ни 0. Да. Именно так. 128 отличное от 0.
  5. А Вы, случайно, не имели дело с этим (ENC28J60) модулем ?
  6. Но тогда и диапазон между 0x80 и 0x7F уж очень большой. Тогда проверяется старший бит?
  7. Если com = 0x80, тогда возвращается 0x80. И если com = 0x8F тогда возвращается тоже 0x80. Зачем тогда сравнение в if(). Возвращаемое значение никак не изменяется. Я бы понял, если бы проверялся один бит. НО тут их гораздо больше участвует.
  8. Для логических значений - правильно. Но как быть с битовой операцией & ? Прошу прощения за свой вопрос. Но тут как раз и не принимает (т.е не возвращает 1 или 0) действие с операндами в условии if(). В условии, насколько я понял, происходит проверка команды на соответствие значения 0x80. Если com = 0x80, тогда возвращается 0x80. И если com = 0x8F тогда возвращается тоже 0x80. Зачем тогда сравнение в if(). Если я не прав, тогда пожалуйста укажите где. Еще раз повторю: -- bool_значение возвращают операторы сравнения и логические операторы
  9. Во время изучения кода для модуля 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. Пожалуйста подскажите что тут не так. Заранее всем благодарен.
  10. Очень рад Вас видеть. Да. Я этой функцией превратил в кирпич два контроллера. Но отрицательный результат тоже результат. Научился и понял. Очень хотелось бы Вас по имени назвать, но не знаю его (жаль). Мое имя Константин. Уважаемый @Starichok. Может Вы подскажете по возвращаемым значениям в проверке условия if() ? Начал изучат модуль ENC26J60 и в коде программы нашел вот такой кусочек кода : // При необходимости, пропускаем "ложный" байт if(adr & 0x80) enc28j60_rx(); Понимаю, что 0x80 это маска, но вот с какое возвращаемое значение не пойму. По идее должно быть числовое, тогда с каким числом сравнивается? Опять же маска, в этом случае, не возвратит bool_значение....
  11. И снова здравствуйте. С момента публикации моего последнего комментария прошло 1,5 года. Многое за это время изменилось и в моей жизни (переболел то-ли короной, то-ли гормональный сбой в организме был (еле еле "вычухался")) и в жизни нашей страны. Хотелось бы уточнить по поводу инициализации DS18B20. Понимаю, что тема избитая, но все же. Может кому ни будь да полезной будет. Вся эта история началась с невозможности програмно определить присутствие датчика в схеме. По всей видимости (пришлось столкнуться с этим еще раз), проблема была в программе AVRDUDE_PROG. Заметил, что когда установлена галочка в FUSE автоматического программирования, тогда и вылазила проблема с присутствием датчика. А если программировать по отдельности (с начало fuse, а затем programm), то все проходит хорошо. Всем крепкого здоровья и благополучия.
  12. @elki спасибо. Евстифеева скачал (5-е издание). Наверное в книгах есть ответы на многие вопросы. Но ,Вы знаете, живое общение ( а особенно со знающими и , главное, помогающим начинающим (@Starichok ,@ARV особая благодарность) ) дорогого стоит. Опять же и Вам @elki спасибо большое.
  13. Мне достались , по случаю, несколько приборов безопасности ОНК-160 от автомобильных кранов, так в них стоят ЖКИ MT-20S4M. Четыре строки по 20 символов. Контроллер в нем идентичен с дисплеем 1602. За неимением другого экрана использую его. Устройство у меня просто термометр. Но.... Началось вся эта история с термометром , как говорится, с выходом из-за печки. Живу в своем доме, местное отопление (котел, батареи и тому подобное). В один прекрасные день накрылся медным тазом центробежный насос, который гонял воду по батареям. Поставил другой. Так тот другой, на третьей скорости гудит, не сказать что сильно, но ночью , проснувшись слышишь и это мешает. Вставать переключать на 1 скорость нет никакого желания. Так вот собственно и зародилась мысль с помощью терморегулятора переключать, в зависимости от температуры, эти самые скоростя. Скажем от 25 до 40 градусов первая скорость, 40-60 вторая, ну и выше 60 уже третья. Но если температура ниже 20 что бы отключал насос совсем. Опять же выставлять уставки температурные хочу через кнопки (3 штуки). 25 градусов дошла температура - нажал первую кнопку - значения записались в EEPROM на первую скорость. Дошла температура до второго рубежа - нажал вторую кнопку и т.д. Но с моим навыком и знаниями в пропграммировании понимаю, что без костылей не обойдусь. Зато опыт, какой никакой приобрету. А это в коком устройстве используется? Я с помощью АЦП хочу в дальнейшем сделать управление позиционирования задвижки в котельном оборудовании. Но это пока в далеких мечтах. А вот этот момент для меня вообще..... Вообщем понимаю, что я дуб как дерево. Но не боги горшки обжигают - сдюжим и мы.
  14. Действительно так ! Прочитали, запустили конвертацию (именно в такой последовательности) и ушли "заниматься" другими, делами. А до следующего обращения к датчику, температура уже будет преобразована и ждать нашей команды считывания. Дело в том, что первоначально меня смутила задержка между командами конвертации и считывания температуры. Поэтому алгоритму я и реализовал получение температуры. В Вашем случае, @Starichok , получается более изящно - признаю. Подправил свой код по Вашему примеру. Спасибо! И еще вопрос: критично ли запускать функцию конвертации/считывания непосредственно в обработчике прерывания или лучше использовать действие над переменной ( в обработчике прерывания) и уже исходя из результата обработки переменной выполнять какое либо действие в рабочем цикле программы?
  15. @Starichok здравствуйте. Сегодня реализовал команды измерения и считывания температуры с датчика через прерывание от Т/С_1. Написал две функции: первая для измерения, вторая для считывания температуры. В обработке таймера, с интервалом примерно в 1 секунду, выполнял операцию XOR над единицей (I ^= 1;). А уже в главном цикле программы, в проверке условия, проверял значение I. Если i==1 тогда функция измерения температуры, иначе считывание. Спасибо Вам за подсказку!
  16. @ARV здравствуйте. В вашем примере выше (вывод строки на дисплей) Вы использовали указатель. Подскажите пожалуйста, в каких случаях предпочтительнее использовать указатели? В случае вывода строки на дисплей - очень удобно ( нет нужды использовать массив).
  17. Да @ARV все понятно. Тем более, что после Вашего предыдущего ответа с примером по преобразованию числового значения в строковое еще раз перечитал по функциям (входящие аргументы, возвращение значения и то что в теле функции можно присвоить возвращающее значение глобальной переменно и при этом не использовать return). Начал изучать указатели (только пока с большим скрипом в понимании). И еще. Чем больше читаю как ваши и @Starichok ответы, как у меня в теме, так и в других, тем больше понимаю, что я не знаю в программировании ничего от слова совсем. Но это меня не расстраивает - есть к чему стремится. Спасибо вам.
  18. Здравствуйте @ARV и @Starichok . Из приведенного Вами примера выше стал изучать указатели. Еще раз спасибо Вам за участие и помощь. Хотя по поводу использования локальных переменных в функциях в глобальной видимости пока ничего не нашел. Это по поводу моего вопроса и моих поисков ответа по нему - же.
  19. @ARV и @Starichok спасибо Вам бОльшое за участи в моем "гиблом" деле Я прям увереннее стал чувствовать себя, спасибо. В ближайшее время обязательно ознакомлюсь с функцией itoa, со строковым представлением символьных данных. Все таки общение в сообществе приносит гораздо больше знаний и результата нежели самостоятельное изучение (хотя и оно тоже приносит не малый результат). Учится мне еще и учится.
  20. Уважаемый @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); Подскажите пожалуйста. @Starichok обязательно найду и разберусь в сути вопроса, но без учителя у меня уйдет много времени. В интернете находил такую информацию, но я ее читаю, а она от моей головы отскакивает как от стенки горох. Слишком уж много непонятных слов для меня (пока). Мне бы решение этого вопроса на бумагу переложить (подсчитать вручную с помощью карандаша и бумаги). Если не получится самостоятельно разобраться, пойду в институт к своему преподавателю по математики, попрошу ее растолковать мне эту методику. Она нам всегда говорила, что красивей математики может быть только музыка.
  21. @ARV спасибо бОльшое за ценные советы. Исправил. Опять же спасибо большое. Сейчас на работе проверил - все именно так. У меня у Вам небольшой вопрос (уточнение): возвращает в случке ошибки не ноль, а от чего зависит значение возвращаемого числа в случае ошибки ( не совпадения)? У меня выводится число 99 в десятичной системе ( вывожу на Ж.К. дисплей для контроля): lcd_dat(((checkcrc()/100)%10)+48); lcd_dat(((checkcrc()/10)%10)+48); lcd_dat((checkcrc()%10)+48);
×
×
  • Создать...