Пн апр 22, 2019 13:58:18
Пн апр 22, 2019 14:52:04
while((level ^ (PIND&(1 << INT0)))); // где level либо 0 либо 1
Пн апр 22, 2019 14:55:44
Пн апр 22, 2019 15:23:03
Пн апр 22, 2019 18:52:41
void soft_reset(const uint8_t wdt_prescale, const volatile uint8_t &port, const uint8_t pin){
const volatile uint8_t &port_new = (port == NULL) ? 1 : port;
const uint8_t pin = (pin == NULL) ? 1 : pin;
const uint8_t wdt_prescale = (wdt_prescale == NULL) ? WDTO_15MS : wdt_prescale;
wdt_enable(wdt_prescale);
while(port_new & pin);
wdt_disable();
}
while((level ^ (PIND&(1 << INT0)))); // где level либо 0 либо 1
Пн апр 22, 2019 19:25:54
void soft_reset(uint8_t wdt_prescale = WDTO_15MS)
{
wdt_enable(wdt_prescale);
while(true) {}
}
void soft_reset(const volatile uint8_t& port, uint8_t pin, uint8_t wdt_prescale = WDTO_15MS)
{
wdt_enable(wdt_prescale);
while(port_new & pin) {}
wdt_disable();
}
Пн апр 22, 2019 19:40:22
alex68md писал(а):да оно(состояние порта) в коде может меняться
volatile uint8_t *portd;
volatile uint8_t int_pin;
void isPIRAlive(){
portd = &PIND;
int_pin = 0;
isPIRHigh();
portd = &PINC;
int_pin = 1;
isPIRLow();
}
while((level ^ (*portd &(1 << int_pin))));
Пн апр 22, 2019 19:46:01
Вт апр 23, 2019 06:24:50
#include <avr/wdt.h>
#define D_PIN PIND
#define D_INT PIND0
#define C_PIN PINC
#define C_INT PINC1
void soft_reset(const uint8_t wdt_prescale, volatile uint8_t *PORT_set, const uint8_t int_pin, const uint8_t level){ //uint8_t *PIN_set
wdt_enable(wdt_prescale);
//while((level ^ (*PORT_set &(1 << int_pin)))); // если level=1 то 1 на пине порта ждем
while(!(level ^ (*PORT_set &(1 << int_pin)))); // если level=1 то 0 на пине порта ждем
wdt_reset();
wdt_disable();
}
void isPIRHigh(void){
soft_reset(WDTO_8S, &D_PIN, D_INT, 1); //finish when PD0 high
}
void isPIRLow(void){
soft_reset(WDTO_8S, &D_PIN, D_INT, 0); //finish when PD0 low
}
void isPIRAlive(){
isPIRHigh();
isPIRLow();
// для наглядности
soft_reset(WDTO_8S, &D_PIN, D_INT, 1);
soft_reset(WDTO_8S, &D_PIN, D_INT, 0);
soft_reset(WDTO_8S, &C_PIN, C_INT, 1);
soft_reset(WDTO_8S, &C_PIN, C_INT, 0);
}
void setup(){
// конфигурация портов на вход на выход
// назначить вывод порта на ввод
// включить подтягивающий резистор
isPIRAlive();
}
void loop()
{ //
}
Вт апр 23, 2019 15:54:24
soft_reset(WDTO_8S, ~port, pin);
Вт апр 23, 2019 16:14:22
void soft_reset(volatile uint8_t&& port);
Вт апр 23, 2019 17:28:58
это творить... 2 функции - 1 минута делов и все свободны. нет, надо неделю на форуме людям головы морочить, самому себе голову морочить - а ради чего? какая ценность в этом варианте есть, что стоит этого геморроя?!Reflector писал(а):Другое дело что непонятно зачем в принципе
Вт апр 23, 2019 19:20:36
Открываем даташит на контроллер, читаемalex68md писал(а): на втором методе я пока и остановился но упёрся в строчку
Код:
soft_reset(WDTO_8S, ~port, pin);
~port не хочет передаваться как volatile и пока даже не представляю как решить эту загвоздку ...
Чего вы пытаетесь ~port туда записать?С помощью регистров PINx осуществляется доступ к физическим значениям сигналов на выводах порта, они доступны только для чтения
Константа, переменная — это основополагающие понятия в любом языке программирования.
Вт апр 23, 2019 19:28:35
вот именно, читаем (конкретно эта цитата из даташита на atmega328, но такое поведение во всех "новых" МК семейства AVR8):Dimon456 писал(а):Открываем даташит на контроллер, читаем
так что запись в PINx очень даже имеет смыслHowever, writing '1' to a bit in the PINx Register will result in a toggle in the corresponding bit in the Data Register.
Вт апр 23, 2019 20:21:47
То есть другими словами включим подтяжку, выключим подтяжку. Что это изменило?Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn.
Note that the SBI instruction can be used to toggle one single bit in a port.
Вт апр 23, 2019 20:49:34
Ср апр 24, 2019 05:54:13
soft_reset(WDTO_8S, ~port, pin);
Ср апр 24, 2019 08:39:24
Ср апр 24, 2019 08:55:55
подождите, так что получается эта строчка, это будет запись в порт ? а не просто инверсное чтение ? мне запись категорически нельзя
- Код:
soft_reset(WDTO_8S, ~port, pin);
Ср апр 24, 2019 12:20:57
#include <avr/wdt.h>
#define D_PIN PIND
#define D_INT 0
void soft_reset(const uint8_t wdt_prescale, volatile uint8_t *PORT_set, const uint8_t int_pin, const uint8_t level){
wdt_enable(wdt_prescale);
while((level ^ ((*PORT_set &(1 << int_pin))>>int_pin))); //
wdt_reset();
wdt_disable();
}
void isPIRHigh(void){
uint8_t level;
level = ((D_PIN&(1<<D_INT))>>D_INT); //получение состояния пина порта
if (level==1) { //если пин порта равен 1 то
soft_reset(WDTO_8S, &D_PIN, D_INT, 0); //ждать на пине порта 0
} else { //иначе если пин порта равен 0 то
soft_reset(WDTO_8S, &D_PIN, D_INT, 1); //ждать на пине порта 1
}
}
void isPIRAlive(){
isPIRHigh();
}
void setup(){
// назначить вывод порта на ввод
// включить подтягивающий резистор
// конфигурация портов на вход на выход
isPIRAlive();
}
void loop()
{
}