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

Условие if() и lan_модуль ENC28J60


kostya_unix

Рекомендуемые сообщения

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

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

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

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

Собственно вопрос: - не понятно возвращаемое значение условия if(adr & 0x80).

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

Цитата

Если выражение истинно[1] (т.е. принимает любое значение, отличное от нуля), то выполняется оператор или блок операторов, следующий за if. https://cpp.com.ru/shildt_spr_po_c/03/0302.html

 

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

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

 

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

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

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

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

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

 

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

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

логическая операция тут одна = оператор if , а какое выражение ты ему подсунешь , ему монопенесуально, результат выполнения будет один, все что не равно нулю есть ИСТИНА.

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, Vascom сказал:

Какая разница какой диапазон, если тебе надо проверить только восьмой бит?

А Вы, случайно, не имели дело с этим (ENC28J60) модулем ?

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

Спасибо!!!

 

Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
    • А что нить из ассортимента активных щупов производства СССР..))
    • Типа такого: https://aliexpress.ru/item/2044864227.html?sku_id=58855020183
    • поняли неправильно. У ТЛ494 никакой защиты нет, усилители ошибки не защита, они не должны приводить к ложным импульсам. Причем тут "микруха" ?  надо нагружать ВСЁ. До сих пор вообще непонятно о каком ИИП идет речь и сколько у него каналов. Бесполезно схему рисовать? - Помогать так бесполезно. Картина кривая по самое "немогу" продолжаются картинки, снятые через ногу и без цены деления.
×
×
  • Создать...