при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Код: Выделить всё
// Example program
#include <iostream>
#include <string>
void soft_reset(const uint8_t &port = 1, const uint8_t &pin = 1){
uint8_t result = port & pin;
printf("PINC = %hhu ", port);
printf("PC6 = %hhu ", pin);
printf("result = %hhu \n", result);
}
void isPIRLow(uint8_t &port, uint8_t &pin){
soft_reset(port, pin);
//finish when PD0 low
}
void isPIRHigh(uint8_t &port, uint8_t &pin){
soft_reset(~port, pin);
//finish when PD0 high
}
int main()
{
//PINC ^= 1<<7;
//PINC & 1<<7; //= 128
uint8_t PINC = 0b10100001;
printf("PINC = %hhu ", PINC);
uint8_t PC6 = 1<<6;
printf("PC6 = %hhu \n", PC6);
uint8_t &port = PINC;
uint8_t &pin = PC6;
/////////////////////////////
isPIRLow(port, pin);
isPIRHigh(port, pin);
printf("PINC = %hhu ", PINC);
printf("PC6 = %hhu \n", PC6);
PINC = 0b11100001;
isPIRLow(port, pin);
isPIRHigh(port, pin);
printf("PINC = %hhu ", port);
printf("PC6 = %hhu \n", pin);
}
Все верно, но пока вы ждете 8 секунд необходимый импульс на определенном пине, а на PD5 USB решил 1 выставить, 4к коду, там не известно что выполняется, могут и прерывания USB использоватьсяalex68md писал(а):Dimon, всё так. но для проверки пина нам же нужно считать весь порт ? port&pin
у меня в WHILE как раз port&pin
Код: Выделить всё
#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
}
// Clear the interrupt flags
UEINTX&=~((1<<NAKINI) | (1<<NAKOUTI) | (1<<RXSTPI) | (1<<RXOUTI) | (1<<STALLEDI) | (1<<TXINI));
if (UESTA0X & (1<<UNDERFI))
{
// Underflow Error interrupt
// Place your code here
}
if (UESTA0X & (1<<OVERFI))
{
// Overflow Error interrupt
// Place your code here
}
// Clear the interrupt flags
UESTA0X&=~((1<<OVERFI) | (1<<UNDERFI));
}
Код: Выделить всё
level = ((D_PIN&(1<<D_INT))>>D_INT); //получение состояния пина порта
4 строчки ассемблерного кода.Код: Выделить всё
void soft_reset(volatile uint8_t&& port){
while(port & 1);
}
soft_reset( ~PIND);
Нет, не будет он так работать.alex68md писал(а):в цикле будет участвовать реальное каждый раз занаво считываемое значение или какойто закэшированный необновляемый объект?
Код: Выделить всё
void soft_reset(volatile uint8_t *port){
while(~(*port) & 1);
}
soft_reset( &PIND);вот на этом и надо было остановитьсяalex68md писал(а):чтобы в случае копировании кода на другой МК просто в макросе поменять пин,порт
Код: Выделить всё
while((SENSOR_PORT & SENSOR_MASK) == SENSOR_VAL) //или по контексту
while((SENSOR_PORT & SENSOR_MASK) != SENSOR_VAL)Код: Выделить всё
#define D_PIN PIND
#define D_INT 5
#define bit_is_set_2(port, pin) ({ \
uint8_t __t; \
__asm__ __volatile__ ( \
"clr %0" "\n\t" \
"sbic %1,%2" "\n\t" \
"inc %0" \
: "=r" (__t) \
: "I" ((uint8_t)(_SFR_IO_ADDR(port))), \
"I" ((uint8_t)(pin)) \
); \
__t; \
})
while((level == bit_is_set_2(D_PIN,D_INT))); \\ CP
while((level != bit_is_set_2(D_PIN,D_INT))); \\ CPSE
while(!(level == bit_is_set_2(D_PIN,D_INT))); \\ CPSE
while(!(level != bit_is_set_2(D_PIN,D_INT))); \\ CP
while((level ^ bit_is_set_2(D_PIN,D_INT))); \\ CPSE
while(!(level ^ bit_is_set_2(D_PIN,D_INT))); \\ CPя это и написал. ваш вариант с 1 и 0 ничем абсолютно не отличается о варианта 0 и 2, или 0 и 8 - описал макрос и сравнивай с ним, результат будет или равно, или не равно. а чему конкретно равно/не равно - без разницы.Dimon456 писал(а):результат выполнения PIND & (1 << 1) даст либо 2 либо 0, соответственно програмер должен знать чему равно SENSOR_VAL
Это ж можно подкорректировать, две строчки поменять, делов то, два макроса использовать. О проблему нашли.ARV писал(а):и да, ваш код намного компактнейа если учесть, что далеко не все порты доступны команде SBIC или SBIS, он еще и не совсем рабочий
два хуже, чем ни одногоDimon456 писал(а):делов то, два макроса использовать. О проблему нашли
ну так это по сути тоже самое к чему я пришел выше. просто передаю значения в функцию а вы через макрос.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();
}