Jump to content

kostya_unix

Members
  • Content Count

    28
  • Joined

  • Last visited

Community Reputation

1 Обычный

About kostya_unix

  • Rank
    Новенький
  • Birthday 02/28/1970

Информация

  • Пол
    Мужчина
  • Интересы
    КИП, микроконтроллеры
  • Город
    Уссурийск

Электроника

  • Стаж в электронике
    10-20 лет
  • Сфера радиоэлектроники
    микроконтроллеры
  • Оборудование
    Паяльник, ноутбук, микроконтроллер.

Recent Profile Visitors

185 profile views
  1. @elki спасибо. Евстифеева скачал (5-е издание). Наверное в книгах есть ответы на многие вопросы. Но ,Вы знаете, живое общение ( а особенно со знающими и , главное, помогающим начинающим (@Starichok ,@ARV особая благодарность) ) дорогого стоит. Опять же и Вам @elki спасибо большое.
  2. Мне достались , по случаю, несколько приборов безопасности ОНК-160 от автомобильных кранов, так в них стоят ЖКИ MT-20S4M. Четыре строки по 20 символов. Контроллер в нем идентичен с дисплеем 1602. За неимением другого экрана использую его. Устройство у меня просто термометр. Но.... Началось вся эта история с термометром , как говорится, с выходом из-за печки. Живу в своем доме, местное отопление (котел, батареи и тому подобное). В один прекрасные день накрылся медным тазом центробежный насос, который гонял воду по батареям. Поставил другой. Так тот другой, на третьей скорости гудит, не сказать что сильно, но ночью , проснувшись слышишь и это мешает. Вставать переключать на 1 скорость нет никакого желания. Так вот собственно и зародилась мысль с помощью терморегулятора переключать, в зависимости от температуры, эти самые скоростя. Скажем от 25 до 40 градусов первая скорость, 40-60 вторая, ну и выше 60 уже третья. Но если температура ниже 20 что бы отключал насос совсем. Опять же выставлять уставки температурные хочу через кнопки (3 штуки). 25 градусов дошла температура - нажал первую кнопку - значения записались в EEPROM на первую скорость. Дошла температура до второго рубежа - нажал вторую кнопку и т.д. Но с моим навыком и знаниями в пропграммировании понимаю, что без костылей не обойдусь. Зато опыт, какой никакой приобрету. А это в коком устройстве используется? Я с помощью АЦП хочу в дальнейшем сделать управление позиционирования задвижки в котельном оборудовании. Но это пока в далеких мечтах. А вот этот момент для меня вообще..... Вообщем понимаю, что я дуб как дерево. Но не боги горшки обжигают - сдюжим и мы.
  3. Действительно так ! Прочитали, запустили конвертацию (именно в такой последовательности) и ушли "заниматься" другими, делами. А до следующего обращения к датчику, температура уже будет преобразована и ждать нашей команды считывания. Дело в том, что первоначально меня смутила задержка между командами конвертации и считывания температуры. Поэтому алгоритму я и реализовал получение температуры. В Вашем случае, @Starichok , получается более изящно - признаю. Подправил свой код по Вашему примеру. Спасибо! И еще вопрос: критично ли запускать функцию конвертации/считывания непосредственно в обработчике прерывания или лучше использовать действие над переменной ( в обработчике прерывания) и уже исходя из результата обработки переменной выполнять какое либо действие в рабочем цикле программы?
  4. @Starichok здравствуйте. Сегодня реализовал команды измерения и считывания температуры с датчика через прерывание от Т/С_1. Написал две функции: первая для измерения, вторая для считывания температуры. В обработке таймера, с интервалом примерно в 1 секунду, выполнял операцию XOR над единицей (I ^= 1;). А уже в главном цикле программы, в проверке условия, проверял значение I. Если i==1 тогда функция измерения температуры, иначе считывание. Спасибо Вам за подсказку!
  5. @ARV здравствуйте. В вашем примере выше (вывод строки на дисплей) Вы использовали указатель. Подскажите пожалуйста, в каких случаях предпочтительнее использовать указатели? В случае вывода строки на дисплей - очень удобно ( нет нужды использовать массив).
  6. Да @ARV все понятно. Тем более, что после Вашего предыдущего ответа с примером по преобразованию числового значения в строковое еще раз перечитал по функциям (входящие аргументы, возвращение значения и то что в теле функции можно присвоить возвращающее значение глобальной переменно и при этом не использовать return). Начал изучать указатели (только пока с большим скрипом в понимании). И еще. Чем больше читаю как ваши и @Starichok ответы, как у меня в теме, так и в других, тем больше понимаю, что я не знаю в программировании ничего от слова совсем. Но это меня не расстраивает - есть к чему стремится. Спасибо вам.
  7. Здравствуйте @ARV и @Starichok . Из приведенного Вами примера выше стал изучать указатели. Еще раз спасибо Вам за участие и помощь. Хотя по поводу использования локальных переменных в функциях в глобальной видимости пока ничего не нашел. Это по поводу моего вопроса и моих поисков ответа по нему - же.
  8. @ARV и @Starichok спасибо Вам бОльшое за участи в моем "гиблом" деле Я прям увереннее стал чувствовать себя, спасибо. В ближайшее время обязательно ознакомлюсь с функцией itoa, со строковым представлением символьных данных. Все таки общение в сообществе приносит гораздо больше знаний и результата нежели самостоятельное изучение (хотя и оно тоже приносит не малый результат). Учится мне еще и учится.
  9. Уважаемый @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 обязательно найду и разберусь в сути вопроса, но без учителя у меня уйдет много времени. В интернете находил такую информацию, но я ее читаю, а она от моей головы отскакивает как от стенки горох. Слишком уж много непонятных слов для меня (пока). Мне бы решение этого вопроса на бумагу переложить (подсчитать вручную с помощью карандаша и бумаги). Если не получится самостоятельно разобраться, пойду в институт к своему преподавателю по математики, попрошу ее растолковать мне эту методику. Она нам всегда говорила, что красивей математики может быть только музыка.
  10. @ARV спасибо бОльшое за ценные советы. Исправил. Опять же спасибо большое. Сейчас на работе проверил - все именно так. У меня у Вам небольшой вопрос (уточнение): возвращает в случке ошибки не ноль, а от чего зависит значение возвращаемого числа в случае ошибки ( не совпадения)? У меня выводится число 99 в десятичной системе ( вывожу на Ж.К. дисплей для контроля): lcd_dat(((checkcrc()/100)%10)+48); lcd_dat(((checkcrc()/10)%10)+48); lcd_dat((checkcrc()%10)+48);
  11. Всем участникам, всем оказывающим посильную помощь в изучении мной датчика DS18B20 здравствуйте. После вопроса уважаемого @ARV по подсчету контрольной суммы полученного значения 9 байтов scratchpad - ОЗУ прошло ровно две недели. Все это время я старался изучить (более или менее вдумчиво) этот вопрос, найти способ расчета контрольной суммы. Так как учится, изучать приходится самостоятельно ( в моем профессиональном окружении нет любителей микроконтроллеров ( и язык C так же осваиваю самостоятельно)), то время уходит много. Так же информации в интернете мнОго по этому вопросу, но понятной для меня, оказалось очень не много. Но по истечению полутора недель изучения вопроса постепенно начал вникать в суть решения этого вопроса. В итоге решение оказалось не таким и сложным как казалось вначале (но это было чуть позже ). Дорога привела меня к стандартной библиотеки <util/crc16.h> в описании которой и лежит алгоритм расчета контрольных сумм. Ссылка на описание этой библиотеки http://avr-libc.narod.ru/group__util__crc.html#g37b2f691ebbd917e36e40b096f78d996 Уважаемые @ARV , @Starichok (и все кто может внести конструктивную критику) прошу Вас поправить меня и указать на ошибки. Вот код подсчета CRC: #include <util/crc16.h> uint8_t term_code[8] = {0,0,0,0,0,0,0,0}; // массив для полученного кода значения температуры(без CRC_кода) uint8_t crcCode = 0; // переменная для хранения полученного CRC_кода uint8_t c = 0; // переменная для отображения ошибок несоответствия контрольных сумм int checkcrc() // функция подсчета значения контрольной суммы { uint8_t crc =0; for (uint8_t i=0; i<sizeof term_code / sizeof term_code[0]; i++) { crc = _crc_ibutton_update(crc, term_code[i]); } return crc; } Так же создал функцию, которая сравнивает полученное значение CRC и расчетное для отображения на LCD_дисплее ( для контроля ошибок) : void error_crc() { if (checkcrc() != crcCode) { c=c+1; // c определена глобально } } Код функции _crc_ibuttin_update(): из стандартной библиотеки <util/crc16.h> uint8_t _crc_ibutton_update(uint8_t crc, uint8_t data) { uint8_t i; crc = crc ^ data; for (i = 0; i < 8; i++) { if (crc & 0x01) crc = (crc >> 1) ^ 0x8C; else crc >>= 1; } return crc; } Способ считывания значения scratchpad ОЗУ стандартный. Описан на многих сайтах. Ссылка на один из них : http://narodstream.ru/avr-urok-20-podklyuchaem-datchik-temperatury-ds18b20-chast-1/ Еще раз всем спасибо.
  12. Спасибо. Всех с наступающим дополнительным выходным!!!!
  13. Понятно. Такие операции, наверное лучше всего выполнять через таймеры (освоим и это). Уважаемый @Starichok подскажите пожалуйста алгоритм работы таймер/счетчиков, в частности обработка прерываний. Пишется, что при срабатывании прерываний по какому нибудь событию, нормальное выполнение программы прерывается и выполняется обработка прерывания. Собственно вопрос: - когда происходит обработка прерывания , основной цикл программы ожидает пока не завершится обработка прерывания ? - или цикл основной программы продолжается параллельно с выполнением обработки прерывания ? Собственно как то так. Прошу прощения, если изложил свой вопрос не грамотно.
×
×
  • Create New...