kostya_unix

Members
  • Content count

    20
  • Joined

  • Last visited

Community Reputation

1 Обычный

About kostya_unix

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

Информация

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

Электроника

  • Стаж в электронике
    10-20 лет
  • Сфера радиоэлектроники
    микроконтроллеры

Recent Profile Visitors

117 profile views
  1. @ARV и @Starichok спасибо Вам бОльшое за участи в моем "гиблом" деле Я прям увереннее стал чувствовать себя, спасибо. В ближайшее время обязательно ознакомлюсь с функцией itoa, со строковым представлением символьных данных. Все таки общение в сообществе приносит гораздо больше знаний и результата нежели самостоятельное изучение (хотя и оно тоже приносит не малый результат). Учится мне еще и учится.
  2. Уважаемый @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 обязательно найду и разберусь в сути вопроса, но без учителя у меня уйдет много времени. В интернете находил такую информацию, но я ее читаю, а она от моей головы отскакивает как от стенки горох. Слишком уж много непонятных слов для меня (пока). Мне бы решение этого вопроса на бумагу переложить (подсчитать вручную с помощью карандаша и бумаги). Если не получится самостоятельно разобраться, пойду в институт к своему преподавателю по математики, попрошу ее растолковать мне эту методику. Она нам всегда говорила, что красивей математики может быть только музыка.
  3. @ARV спасибо бОльшое за ценные советы. Исправил. Опять же спасибо большое. Сейчас на работе проверил - все именно так. У меня у Вам небольшой вопрос (уточнение): возвращает в случке ошибки не ноль, а от чего зависит значение возвращаемого числа в случае ошибки ( не совпадения)? У меня выводится число 99 в десятичной системе ( вывожу на Ж.К. дисплей для контроля): lcd_dat(((checkcrc()/100)%10)+48); lcd_dat(((checkcrc()/10)%10)+48); lcd_dat((checkcrc()%10)+48);
  4. Всем участникам, всем оказывающим посильную помощь в изучении мной датчика 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/ Еще раз всем спасибо.
  5. Спасибо. Всех с наступающим дополнительным выходным!!!!
  6. Понятно. Такие операции, наверное лучше всего выполнять через таймеры (освоим и это). Уважаемый @Starichok подскажите пожалуйста алгоритм работы таймер/счетчиков, в частности обработка прерываний. Пишется, что при срабатывании прерываний по какому нибудь событию, нормальное выполнение программы прерывается и выполняется обработка прерывания. Собственно вопрос: - когда происходит обработка прерывания , основной цикл программы ожидает пока не завершится обработка прерывания ? - или цикл основной программы продолжается параллельно с выполнением обработки прерывания ? Собственно как то так. Прошу прощения, если изложил свой вопрос не грамотно.
  7. Да. Перевод вольный, согласен.
  8. Большое спасибо всем, кто участвует в решении моего вопроса. Сразу оговорюсь, что изучаю микроконтроллеры самостоятельно, не имея предварительных навыков программирования, но имея много "прыти" и желания. У меня вопрос возник (как во время чтения даташит_а на датчик, так и во время просмотров кодов работы с датчиком на сайтах).... В даташит_е есть такие строки: Если DS18B20 включен с внешним питанием, ведущий может контролировать конвертирование температуры (после команды [0х44]) по состоянию шины. На шине будет присутствовать логический «0» когда происходит температурное преобразование. И логическая «1», когда конвертирование выполнено. То есть, можно ли пренебречь паузой в _delay_ms(750); (так как по умолчанию разрядность выставлена в 12 бит) и пользоваться только проверкой завершения конвертации?
  9. Здоровья вам (после вчерашнего).
  10. Вы знаете, я еще не очень хорошо разбираюсь во всех командах датчика ( изучаю самостоятельно). Датчик у меня один. Я подаю команду на преобразование температуры (0x44). Собственно с этими данными и работаю. Если Вас не затруднит, подскажите пожалуйста как считать все 9 байт с датчика. Я так понимаю, что без массива тут не обойтись? Заранее благодарен. Привожу функцию с помощью которой общаюсь с датчиком. signed int dt_check(void) { DS18B20_reset(); // презагружаем (сброс\присутствие) датчик. dt_sendbyte(204); // (0xCC) (skip rom) пропускаем идентификацию, т.к. датчик один dt_sendbyte(68); // (0x44) измерить температуру _delay_ms(750); // такая задержка нужна для 12-ти битного ПРЕОБРАЗОВАНИЯ (это максимальная задержка) DS18B20_reset(); // презагружаем (сброс\присутствие) датчик. Инициализация нужна для того, что бы // датчик понял, что ему сейчас будет послана команда. dt_sendbyte(204); // (0xCC) (skip rom) пропускаем идентификацию dt_sendbyte(190); // (0xBE) (convert t) отправляем команду на чтение показаний с датчика T_L = dt_readbyte(); // читаем младший байт регистра температуры T_H = dt_readbyte(); // читаем старший байт регистра температуры tt = (((T_H<<8)|T_L)*10); // общий результат полученого значения (кода) с датчика // вывод знака при положительной и отрецательной температуре if ((T_H & 128) ==0) { // положительная температура znack = 32;// знак пробел при положительной температуре } else { // отрицательная температура tt = (65536-tt); // формула расчета отрицательной температуры znack = 45;// знак минус } return tt; }
  11. Здравствуйте всем. Вчера разобрался с расчетом отрицательной температуры..... Это окажется полезным особенно начинающим в разборе этих расчетах. И так..... Для начинающих (как я) формулы в примерах не всегда понятны (хотя работают на 100%), по причине несовершенного владения битовыми сдвигами. И что бы было более понятно и наглядно: T_L = dt_readbyte(); // считываем младшие 8 бит ( из 16 передаваемых датчиком значений температуры) T_H = dt_readbyte(): // считываем старшие 8 бит. для положительной температуры: temperatura = (((T_H<<8) | T_L) / 16) ; для отрицательной температуры: temperatura = ((65536 - temperatura)/16); // 65536 это максимально возможное значение 16 бит информации с датчика, и из этого // максимального значения мы вычитаем реальные значения датчика в промежуток времени. Пример: с датчика в момент времени мы получили значение (при условии, что мы определили знак температуры ( if (!((T_H & 128) ==0)); т.е. температура отрицательная) FECCh и если перевести в десятичное значение: 65228, тогда при этом решении (65536 - 65228) мы получаем 308 и разделив его на 16 (т.е сдвинув в право на 4 (>>4) , мы и получаем искомое значение отрицательной температуры. Ну вот как то так...... Если что-то не так в моем комментарии прошу более опытных пользователей меня поправить. Думаю, что от этого выиграют все.
  12. Всем здравствуйте. На днях вывел первые показания температуры с DS18B20 на LED_индикатор (пока правда без знака + или -). Долго шел к этому результату, не забрасывал изучение. Советовался только с вами форумчанами (больше нескем было). Спасибо большое всем кто помогал, кто участвовал в обсуждении моего вопроса. По возможности буду и дальше информировать о дальнейшем ходе изучения. Продолжение будет в изучении определения знака температуры., считывания ROM кода датчика( с выводом на дисплей) ну и так далее.
  13. После смены среды разработки продолжил изучение функции инициализации датчик ( формирование импульса присутствия) и некоторого исправления (уточнения) моего кода выложенного ранее . Опытным товарищам продолжение этой темы может показаться не интересным, но это может избавить начинающих от некоторых проблем или внести дополнительную ясность. Итак вот что узнал..... Т.к. все подключенные к шине устройства имеют выходы с открытым стоком, то для формирования логической 1 на шине используется подтягивающее сопротивление (4,7 кОм) Для инициализации всех подключенных ведомых устройств (датчиков), м.к. сначала формирует импульс сброса, логический ноль на шине данных, не менее 480 мкс, для того что бы после формирования положительного перепада датчики смогли ответить импульсом присутствия. После импульса сброса от м.к. временем нарастания единицы можно пренебречь (1 мкс.) в моем коде это было ошибочно обозначено как: _delay_us(68); //делаем задержку для "подъема" логической единицы(через сопротивление) и ожидаем сигнал присутствия датчика (датчик просаживает на 0 шину данных). Когда датчик определил положительный перепад (от ноля к единице), он ожидает от 15 до 60 мкс и затем формирует импульс присутствия устанавливая на шине данных логический ноль на время от 60 до 240 мкс. Так что импульс присутствия может начаться, самое позднее через 60 мкс от завершения импульса сброса и может закончится, самое ранее, через (15+60) = 75 мкс от завершения импульса сброса м.к. Для считывания импульса присутствия от датчика, выбираем среднее значение (60~70) = 68 мкс. Общее время импульса присутствия датчика не менее 480 мкс (68 мкс+412 мкс)
  14. Здравствуйте Armenn. Спасибо за соучастие в решении моей проблемы! После того как отсоединяешь сопротивление 4,7 кОм контроллер реагирует на отключение сигнального провода датчика. Но светодиод горит тускло, точней не то что бы тускло, а с определенной (большой) частотой включается и выключается. НО в моих попытках докопаться до истины, появились сдвиги. Как и писал ранее, переписал код инициализации датчика в eclipse, и все заработало так как и должно. И с сопротивлением 4,7к и с "правильным" использованием _delay_us(); (asm "nop" не использовал). Вот как то так..... Сейчас пытаюсь понять почему в AVR_studio прошивка не работала так как надо (может быть оптимизация кода в studio имеет место быть?). Буду дальше изучать как DS18D20, так и протокол 1-wire. Еще раз спасибо большое всем, кто помогал мне.
  15. По трем проводам. Красный на плюс, черный минус, желтый передача данных (подтянут через сопротивление к питанию). Датчик в герметичном корпусе.