ну так это по сути тоже самое к чему я пришел выше. просто передаю значения в функцию а вы через макрос.
Нет, не одно и то же. В случае ARV макрос привязан к конкретному значению порта или const, оно неизменно на протяжении всей выполнения программы. К примеру так
Код:
#define SENSOR_PORT PIND #define SENSOR_MASK (1<<5)
while((SENSOR_PORT & SENSOR_MASK) != SENSOR_VAL)
И это выражение справедливо только при одном значении SENSOR_VAL. Либо так
почему? вроде оно у меня работает для обоих состояний
А level чему у вас равно? Давайте конкретно на примере
Код:
while ((PIND & 0) ^ level); level-?
Код:
while ((PIND & 5) ^ level); level-?
alex68md писал(а):
иногда у меня адрес будет NULL
Это как? Мне просто интересно, как можно вызвать функцию принимающую параметр без передачи самого параметра? И, вы должны быть в курсе чему принадлежит адрес 0x0000 SRAM?
вы должны быть в курсе чему принадлежит адрес 0x0000 SRAM? --- нет. чему? но думаю 0. но вроде оно мне и не надо. мне сам адрес 0 для if нужен. разве код не будет работать ?
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Сори не заметил этот вопрос Вот так soft_reset ();
На виртуалке код работает. Есть причины почему оно не будет работать в железе? Например как ~port оказалось что в железе не будет работать хотя виртуалка ок. Но вроде исправит теперь все косяки. Так что там в 0x00 SRAM ?
равносилен записи --- да правильно. и далее if (!0) while (1); //тут должно остановиться. if должен сработать. ??
в железе не проверял. но виртуал вроде работает, arduino ide компилит. проблема что виртуал не показывает такие фокусы как изначально например у меня было ~port о чём Reflector указал. но в данной реализации вроде упростил до немогу и никаких rvalue/lvalue временных не создаётся. port должен быть real time обновляемый volatile при каждой проверке while/ если я ничего не упустил из виду?
wdt_enable(wdt_prescale); Serial.print("wdt ="); Serial.println(wdt_prescale); Serial.print("port ="); Serial.println(*port); Serial.print("pin ="); Serial.println(pin); Serial.print("level ="); Serial.println(level); if (!port) do {Serial.println("while 1");} while (1); while ((*port & pin) ^ level); Serial.println("wdt disable"); wdt_disable();
выводит
Код:
wdt =0 port =160 pin =1 level =1 while 1 while 1 while 1
т.е. передаем но if почему то не срабатывает и уходит в while(1); как сделать чтоб if(!port) сработал?
Добавлено after 39 minutes 58 seconds: я заметил когда port =160 if не срабатывает. а иногда на тот же самый вызов передает port =32 и тогда if срабатывает
т.е. if (! 160) true //но тут тоже должно быть false if (! 32) false
поскольку вы завели уже не одну тему с проблемами, которые есть только у вас и ни разу не встречались всем остальным, дело явно не в AVR.
и смею вас заверить, что в моих играх с AVR (а веду я их уже лет 10, не меньше) и все пины читаются, и все if-ы срабатывают, и циклы крутятся, сколько надо, и указатели разыменовываются и все прочее функционирует, как должно.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
эксперименты с функией приведенной выше показали следующее...
после того как ПИН у меня не читал значения я понял функцию на прием ПОРТ, однако ПОРТ у меня как выяснилось вообще не читает изменения на ноге инпут на которой висит датчик для прерывания. чтоб вы не говорили что это не ПОРТ а мой код. посмотрите код в соседней теме где нет ни кого кода кроме записи нулей во все порты и порт и пин разные результаты даёт. ПИН больше видит единиц на ногах. но при этом более медленный чем ПОРТ
вообщем передача PINx как аргумент в конце концов решило проблему просто оно все как тормознуто работает внутри функции. когда просто в лупе рил тайм я сканирую лапку то четко видна единица от датчика. а передаю порт в функцию и проверяю там както неохотно while внутри функции видит единицу. поэтому решил там увеличить время (8с маловато) на отлов единицы и в конце концов наверно вообще закоментирую этот блок. както не smoothly протекает автопроверка роботоспособности датчика.
я смотрел и не увидел катастрофы. но тот факт, что тривиальный код не работает, как должен, говорит о том, что проблема где-то есть. но я утверждаю, что она не внутри микроконтроллера (с оговоркой, что микроконтроллер на самом деле соответствует даташиту Atmel). в качестве оснований моего утверждения сошлюсь на миллионы конструкций, напрямую работающих с чтением PINx и не имеющих подобных проблем - даже ардуинщики наклепали тысячи поделок, не говоря про "хардкорщиков", обходящихся без наворотов ардуины.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 47
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения