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

kostya_unix

Members
  • Постов

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

  • Посещение

Сообщения, опубликованные kostya_unix

  1. Владимир  спасибо за разъяснение правил. Поверьте мне, я не со зла. Впредь буду аккуратней.

    Про измерение длительности импульсов @Eddy_Em .... Все, как раз, и началось с того, что по тексту программы все длительности в аккурат укладывались в тайминг. Но вот только ответа (импульс присутствия) так и не удавалось получить. И это все приключилось тогда, когда я только начал изучать и этот датчик и знакомится с интерфейсом 1-Wire.Просидел над этой проблемой неделю. Перечитал инструкцию несколько раз, пересчитал тайминги согласно графику не один раз.

    А проблема была в программе AVRDUDE. Вернее в использовании ее мной.

    Насчет жуткости кода.... Вы еще не видели, что я потом наваял. Вот это действительно жуть.

    Но я его не покажу. Боюсь гнева профессионалов.

    Ну да ладно. Научимся и мы. Не боги горшки обжигают.

    Всем здоровья и благополучия.

      

     

  2. 2 часа назад, kostya_unix сказал:

    Очень рад Вас видеть.

    Да. Я этой функцией превратил в кирпич два контроллера.

    Но отрицательный результат тоже результат. Научился и понял.:D

    Очень хотелось бы Вас по имени назвать, но не знаю его (жаль). Мое имя Константин.

     Уважаемый @Starichok. Может Вы подскажете по возвращаемым значениям в проверке условия if() ?

     Начал изучат модуль ENC26J60 и в коде программы нашел вот такой кусочек кода :

    
    // При необходимости, пропускаем "ложный" байт
        if(adr & 0x80)
            enc28j60_rx();

    Понимаю, что 0x80 это маска, но вот с какое возвращаемое значение не пойму. По идее должно быть числовое, тогда с каким числом сравнивается?

    Опять же маска, в этом случае, не возвратит bool_значение....

     

    @Starichok Вы знаете, разобрался. Спасибо ребятам, подсказали.

    В этой ветке задавал этот вопрос.

  3. @IMXO @Vascom спасибо Вам большое.

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

    @IMXO буду читать, читать, читать. И пытаться понять.

    Спасибо!!!

     

  4. Только что, 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.

  5. Только что, kostya_unix сказал:

    Тогда возвращается 0.

    Но тогда и диапазон между 0x80 и 0x7F уж очень большой.

    Только что, Vascom сказал:

    Сперва выполняется битовая операция (она нужна чтобы выделить один бит из adr), затем уже if.

    Тогда проверяется старший бит?

  6. 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().

    Возвращаемое значение никак не изменяется.

    Я бы понял, если бы проверялся один бит. НО тут их гораздо больше участвует.

  7. 3 минуты назад, IMXO сказал:

    серьезно? и поэтому ты решил этим тупым вопросом засрать весь форум?
    а открыть учебник по Си религия не позволяет? читаем до полного просветления

     

    Только что, Vascom сказал:

    Логическое значение в C-это целое число: ноль для false и ненулевое для true.

    Для логических значений - правильно. Но как быть с битовой операцией &      ?

    9 минут назад, IMXO сказал:

    серьезно? и поэтому ты решил этим тупым вопросом засрать весь форум?
    а открыть учебник по Си религия не позволяет? читаем до полного просветления

     

    Прошу прощения за свой вопрос. Но тут как раз и не принимает (т.е не возвращает 1 или 0) действие с операндами в условии if().

    В условии, насколько я понял, происходит проверка команды на соответствие значения 0x80. Если com = 0x80, тогда возвращается 0x80.

    И если com = 0x8F тогда возвращается тоже 0x80.

    Зачем тогда сравнение в if().

    Если я не прав, тогда пожалуйста укажите где.

    Еще раз повторю: -- bool_значение возвращают операторы сравнения и логические операторы

  8. Во время изучения кода для модуля 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.

    Пожалуйста подскажите что тут не так. Заранее всем благодарен.

  9. Только что, Starichok сказал:

    очень вредная функция в твоем программаторе. забудь про нее и никогда не пользуйся.

    Очень рад Вас видеть.

    Да. Я этой функцией превратил в кирпич два контроллера.

    Но отрицательный результат тоже результат. Научился и понял.:D

    2 минуты назад, Starichok сказал:

    очень вредная функция в твоем программаторе. забудь про нее и никогда не пользуйся.

    Очень хотелось бы Вас по имени назвать, но не знаю его (жаль). Мое имя Константин.

     Уважаемый @Starichok. Может Вы подскажете по возвращаемым значениям в проверке условия if() ?

     Начал изучат модуль ENC26J60 и в коде программы нашел вот такой кусочек кода :

    // При необходимости, пропускаем "ложный" байт
        if(adr & 0x80)
            enc28j60_rx();

    Понимаю, что 0x80 это маска, но вот с какое возвращаемое значение не пойму. По идее должно быть числовое, тогда с каким числом сравнивается?

    Опять же маска, в этом случае, не возвратит bool_значение....

     

  10. И снова здравствуйте. С момента публикации моего последнего комментария прошло 1,5 года. Многое за это время изменилось и в моей жизни (переболел то-ли короной, то-ли гормональный сбой в организме был (еле еле "вычухался")) и в жизни нашей страны.

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

    Вся эта история началась с невозможности програмно определить присутствие датчика в схеме. По всей видимости (пришлось столкнуться с этим еще раз), проблема была в программе AVRDUDE_PROG. Заметил, что когда установлена галочка в FUSE автоматического программирования, тогда и вылазила проблема с присутствием датчика. А если программировать по отдельности (с начало fuse, а затем programm), то все проходит хорошо.

    Всем крепкого здоровья и благополучия.

  11. 8 hours ago, elki said:

    Скачайте себе книгу  по С, очень доходчиво все и с контрольными вопросами Дейтел П.Дж., Дейтел Х.М. Как программировать на С. и Евстифеев микроконтроллеры avr очень все расписано доходчиво, помогут разобраться что к чему.

    @elki спасибо. Евстифеева скачал (5-е издание). 

    Наверное в книгах есть ответы на многие вопросы. Но ,Вы знаете, живое общение ( а особенно со знающими и , главное, помогающим начинающим (@Starichok ,@ARV  особая благодарность) ) дорогого стоит.

    Опять же и Вам @elki  спасибо большое.

  12. Мне достались , по случаю, несколько приборов безопасности ОНК-160 от автомобильных кранов, так в них стоят ЖКИ MT-20S4M. Четыре строки по 20 символов. Контроллер в нем идентичен с дисплеем 1602. За неимением другого экрана использую его.

    1 час назад, Starichok сказал:

    но я так понял, что твое устройство не критично к потерям времени во время прерывания по таймеру.

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

    Устройство у меня просто термометр. Но.... Началось вся эта история с термометром , как говорится, с выходом из-за печки. Живу в своем доме, местное отопление (котел, батареи и тому подобное). В один прекрасные день накрылся медным тазом центробежный насос, который гонял воду по батареям. Поставил другой. Так тот другой, на третьей скорости гудит, не сказать что сильно, но ночью , проснувшись слышишь и это мешает. Вставать переключать на 1 скорость нет никакого желания. Так вот собственно и зародилась мысль с помощью терморегулятора переключать, в зависимости от температуры, эти самые скоростя. Скажем от 25 до 40 градусов первая скорость, 40-60 вторая, ну и выше 60 уже третья. Но если температура ниже 20 что бы отключал насос совсем.

    Опять же выставлять уставки температурные хочу через кнопки (3 штуки). 25 градусов дошла температура - нажал первую кнопку - значения записались в EEPROM на первую скорость. Дошла температура до второго рубежа - нажал вторую кнопку и т.д. Но с моим навыком и знаниями в пропграммировании понимаю, что без костылей не обойдусь. Зато опыт, какой никакой приобрету.

    1 час назад, Starichok сказал:

    запускать измерения в АЦП и проверять энкодер

    А это в коком устройстве используется? Я с помощью АЦП хочу в дальнейшем сделать управление позиционирования задвижки в котельном оборудовании. Но это пока в далеких мечтах. 

    1 час назад, Starichok сказал:

    там у меня таймер просто в начало стека помещает адрес начала главного цикла, и больше ничего не делает.

    А вот этот момент для меня вообще..... Вообщем понимаю, что я дуб как дерево. Но не боги горшки обжигают - сдюжим и мы. :rolleyes:

  13. 7 часов назад, Starichok сказал:

    ты меня не понял (не совсем понял).

    у тебя получилось "через раз". первую секунду запускаешь конвертацию, вторую секунду читаешь температуру.

    а у меня это делается КАЖДУЮ секунду. я прочитал температуру, и тут же запускаю конвертацию.

    к следующей секунде конвертация уже завершена, и я опять читаю и запускаю...

    таким образом, тебе не нужен этот признак работы "через раз". ты тоже можешь делать также - читать и запускать измерение КАЖДУЮ секунду.

    Действительно так ! Прочитали, запустили конвертацию (именно в такой последовательности) и ушли "заниматься" другими, делами. А до следующего обращения к датчику, температура уже будет преобразована и ждать нашей команды считывания.

    Дело в том, что первоначально меня смутила задержка между  командами конвертации и считывания температуры. Поэтому алгоритму я и реализовал получение температуры. В Вашем случае, @Starichok , получается более изящно - признаю. 

    Подправил свой код по Вашему примеру. Спасибо!

    И еще вопрос: критично ли запускать функцию конвертации/считывания непосредственно в обработчике прерывания или лучше использовать действие над переменной ( в обработчике прерывания) и уже исходя из результата обработки переменной выполнять какое либо действие в рабочем цикле программы?

  14. В 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 тогда функция измерения температуры, иначе считывание. Спасибо Вам за подсказку!

  15. @ARV здравствуйте. В вашем примере выше (вывод строки на дисплей) Вы использовали указатель. Подскажите пожалуйста, в  каких случаях предпочтительнее использовать указатели? 

    В случае вывода строки на дисплей - очень удобно ( нет нужды использовать массив).

     

  16. 27 минут назад, ARV сказал:

    У вас как-то, похоже, перепутано что-то.

    Глобальная переменная в модуле видна везде "ниже по тексту". Если эта глобальная переменная описана, как static, она не видна в других модулях нигде, если не описана как static, то линкер найдет её, хотя, вероятно, будет warning (лучше стараться избегать такого путем описания в h-файле этой переменной с префиксом extern, тогда все будет идеально правильно).

    Внутри функции вы можете использовать любые видимые переменные, включая локальные. Наружу из функции результат выдается традиционно - возвратом значения функции (при помощи return). Этот самый результат может быть помещен в месте обработки в переменную - локальную или глобальную, в зависимости от необходимости. Поскольку любая обработка ведется внутри другой функции, то жесткого требования для хранения результата в глобальной переменной нет - на ваш выбор. Но, как я уже писал, глобальные переменные - не очень хорошая штука, и, если можно, то лучше их избегать (без фанатизма, конечно).

    Я понятно объяснил?

    Да @ARV  все понятно. Тем более, что после Вашего предыдущего ответа с примером по преобразованию числового значения в строковое еще раз перечитал по функциям (входящие аргументы, возвращение значения и то что в теле функции можно присвоить возвращающее значение глобальной переменно и при этом не использовать return).

    Начал изучать указатели (только пока с большим скрипом в понимании).

    И еще. Чем больше читаю как ваши и @Starichok ответы, как у меня в теме, так и в других, тем больше понимаю, что я не знаю в программировании ничего от слова совсем. Но это меня не расстраивает - есть к чему стремится.

    Спасибо вам.

     

  17. Здравствуйте @ARV  и @Starichok . Из приведенного Вами примера выше стал изучать указатели.

    Еще раз спасибо Вам за участие и помощь.

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

    В 25.06.2019 в 13:02, kostya_unix сказал:

    Или есть другой способ отобразить, в данном случае, возвращаемые данные на LCD_дисплее?

    Это по поводу моего вопроса и моих поисков ответа по нему - же.

  18. @ARV  и @Starichok  спасибо Вам бОльшое за участи в моем "гиблом" деле :) Я прям увереннее стал чувствовать себя, спасибо.

    В ближайшее время обязательно ознакомлюсь с функцией itoa, со строковым представлением символьных данных.

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

    Учится мне еще и учится. 

     

  19. Уважаемый @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  обязательно найду и разберусь в сути вопроса, но без учителя у меня уйдет много времени. В интернете находил такую информацию, но я ее читаю, а она от моей головы отскакивает как от стенки горох. Слишком уж много непонятных слов для меня (пока). Мне бы решение этого вопроса на бумагу переложить (подсчитать вручную с помощью карандаша и бумаги).

     Если не получится самостоятельно разобраться, пойду в институт к своему преподавателю по математики, попрошу ее растолковать мне эту методику.

    Она нам всегда говорила, что красивей математики может быть только музыка.

  20. В 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);

     

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