Dimon, Refletor " а сейчас ~*port читает с порта один раз в момент передачи в функцию, потом там в цикле проверяется одно и то же значение. Со ссылками будет то же самое." т.е. даже если нам удастьтся передать всеми правдами и не правдами (как rvalue ссылку или даже как поинтер или еще как) инверсное значение состотояния порта, то в цикле будет участвовать не реальное каждый раз занаво считываемое значение а какойто временный необновляемый объект?
т.е. даже если нам удастьтся передать всеми правдами и не правдами (как rvalue ссылку или даже как поинтер или еще как) инверсное значение состотояния порта, то в цикле будет участвовать не реальное каждый раз занаво считываемое значение а какойто временный необновляемый объект?
Допустим на входе порта одни нули, тогда результатом выполнения ~port или ~*port будет ~0 или 0xFFFF(для AVR). Дальше передавай это значение куда хочешь, никаких портов тут уже нет.
Где гарантия что там будет ~0 или 0xFFFF, может там будет 0xB3 или еще что? К примеру у Леонардо на выводе PD5 висит светодиод и он конфигурируется как выход (USB то будете использовать), вы можете предсказать состояние этого светодиода? Может еще что на портД повесите. Это ~port или это ~*port читает полностью порт, надо конкретный пин читать.
Вы читаете состояние пина порта, в зависимости от этого состояния принимаете решение 0 ждать на порту или 1, или опять не так?
Reflector , почему нет ? если эта инверсия производиться только для сверки и не меняет реальный порт. то всё там нормально. но я не понял в WHILE он (порт) будет каждый раз заново считываться и инвертироваться во время сверки ? по идее да. но лучше спрошу у более знающих
вот например
Код:
// Example program #include <iostream> #include <string>
Dimon, всё так. но для проверки пина нам же нужно считать весь порт ? port&pin у меня в WHILE как раз port&pin
Все верно, но пока вы ждете 8 секунд необходимый импульс на определенном пине, а на PD5 USB решил 1 выставить, 4к коду, там не известно что выполняется, могут и прерывания USB использоватьсяСпойлер
Код:
#include <mega32u4.h>
// Declare your global variables here
// USB general interrupt service routine interrupt [USB_GENERAL] void usb_general_isr(void) { if (USBINT & (1<<VBUSTI)) { // IVBUS Transition interrupt // Place your code here
} // Clear the interrupt flag USBINT=(0<<VBUSTI); }
// USB Endpoint interrupt service routine interrupt [USB_ENDPOINT] void usb_endpoint_isr(void) { if (UEINTX & (1<<TXINI)) { // Transmitter Ready interrupt // Place your code here
} if (UEINTX & (1<<STALLEDI)) { // STALL interrupt // Place your code here
} if (UEINTX & (1<<RXOUTI)) { // Received OUT Data interrupt // Place your code here
} if (UEINTX & (1<<RXSTPI)) { // Received SETUP interrupt // Place your code here
} if (UEINTX & (1<<NAKOUTI)) { // NAK OUT Received interrupt // Place your code here
} if (UEINTX & (1<<NAKINI)) { // NAK IN Received interrupt // Place your code here
совершено верно level = ((D_PIN&(1<<D_INT))>>D_INT); можно отбросить обратный шифт level = PIND & 1 << 6; //64 это всеравно читается как true/high если 6ой бит у порта 1 и не важно какие остальные биты и что с ними там сделает USB т.е. PORT & PIN я в while так и проверяю while (port&pin) но можно и обратный шифт сделать для ясности. ну это риторика
Dimon, блин значит придёться остаться на вашем коде с level. я просто хотел избавиться от еще одного аргумента в функции. но видно одним & не получиться и high и low проверять
Reflector, я это понимаю так>> условно первая колонка время : далее что происходит 1мс : port // 1100 10мс : перелаем в soft_reset ~port //0011 11мс : проверяем в while (0011 & 1) 14мс : тк предыдущее true еще раз запрашиваем ~port и проверяем его в while (0011 & 1) 15мс : порт изменил свое значение на 1111 //на входе появился high например. это изменение порта в не программы 16мс : т.к. проверка на 14мс была true еще раз запрашиваем ~port и проверяем его в while (0000 & 1) 17мс : выходим из while
я это понимаю так>> условно первая колонка время : далее что происходит 1мс : port // 1100 10мс : перелаем в soft_reset ~port //0011 11мс : проверяем в while (0011 & 1) 14мс : тк предыдущее true еще раз запрашиваем ~port и проверяем его в while (0011 & 1)
В функцию передается адрес, в цикле читается значение по этому адресу, если передали port, то это будет значение по адресу PINx, т.к. это реально существующий объект и этот адрес у него можно взять, но ~port - это выражение, можно только создать временную переменную, скопировать туда результат и передать адрес этой переменной. Потом читай по нему сколько хочешь, результат от этого не изменится.
у вас что, по ходу программы опрашиваемый порт меняется? т.е. в одом случае вы должны чего-то ждать в PORTB, а в другом - в PORTD? если нет - к чему весь этот огород с передачей порта по его адресу? описали бы МАКРОС, и прописали бы его намертво в нужном месте. и с маской ожидания та же песня...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
нет, я везде проверяю PIND, в данном конкретном примере, т.к. там датчик/сенсор. огород с передачей адреса. чтобы в случае копировании кода на другой МК просто в макросе поменять пин,порт. красивее не придумал. а с маской ожидания (уровня) можно как Dimon, вначале читаем состояние и проверяем инверсию. но я опять же с прицелом на универсальность жестко проверяю оба состояния. а то может датчик/сенсор или что там будет вдруг залипнет в одном состоянии или при переходе. да я понимаю что это возня в песочнице. ну так пошевелить мозгами, потренироваться никогда не вредно. сорри что так долго морочил вам голову.
в любом проекте меняете эти три макроса и больше ничего не надо делать - все можно копипастить. и никакие ссылки не нужны, никакие указатели, никакие лишние многопараметровые функции. и код получится оптимальным и переносимым
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
ARV результат выполнения PIND & (1 << 1) даст либо 2 либо 0, соответственно програмер должен знать чему равно SENSOR_VAL. Я подводил к результату либо 1 либо 0.
Пример, более компактный код, стырил с iomacros.hСпойлер
результат выполнения PIND & (1 << 1) даст либо 2 либо 0, соответственно програмер должен знать чему равно SENSOR_VAL
я это и написал. ваш вариант с 1 и 0 ничем абсолютно не отличается о варианта 0 и 2, или 0 и 8 - описал макрос и сравнивай с ним, результат будет или равно, или не равно. а чему конкретно равно/не равно - без разницы.
и да, ваш код намного компактней а если учесть, что далеко не все порты доступны команде SBIC или SBIS, он еще и не совсем рабочий
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
да ладно что вы сразу тролите яж только познаю многогранный мир с/с++
Цитата:
while((SENSOR_PORT & SENSOR_MASK) != SENSOR_VAL)
ну так это по сути тоже самое к чему я пришел выше. просто передаю значения в функцию а вы через макрос.
Код:
//остановился на таком варианте. красиво с одним while не получалось void soft_reset(const uint8_t wdt_prescale, const volatile uint8_t *port, const uint8_t pin, const uint8_t level){ wdt_enable(wdt_prescale); if (port == NULL) while (1); while ((*port & pin) ^ level); wdt_disable(); }
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 331
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения