Обсуждаем контроллеры компании Atmel.
Ответить

Сложный вопрос AVR на С про volatile to const

Пт апр 19, 2019 18:19:05

Код:
#include <avr/wdt.h>

volatile uint8_t &portd = PIND;      //interrupts port
const uint8_t pinint0 = 1 << INT0;   //pin INT0

void soft_reset(const uint8_t wdt_prescale, const uint8_t &port = 1, const uint8_t pin = 1){
   wdt_enable(wdt_prescale);
   while(port & pin);
   wdt_reset();
   wdt_disable();
}

void isPIRHigh(const uint8_t &port, const uint8_t pin){
   soft_reset(WDTO_8S, ~port, pin);               //finish when PD0 high
}

void isPIRLow(const uint8_t &port, const uint8_t pin){
   soft_reset(WDTO_8S, port, pin);                  //finish when PD0 low
}

void isPIRAlive(){
   isPIRHigh(portd, pinint0);
   isPIRLow(portd, pinint0);
}

void setup(){isPIRAlive();}


выдает ошибку binding 'volatile uint8_t {aka volatile unsigned char}' to reference of type 'const uint8_t& {aka const unsigned char&}' discards qualifiers

если убираю uint8_t &port = 1 то выдает ошибку invalid initialization of non-const reference of type 'uint8_t& {aka unsigned char&}' from an rvalue of type 'uint8_t {aka unsigned char}'

есть идеи?

Re: Сложный вопрос AVR на С про volatile to const

Пт апр 19, 2019 19:21:38

volatile uint8_t &portd
const uint8_t &port

Как это понимать?

Re: Сложный вопрос AVR на С про volatile to const

Пт апр 19, 2019 19:29:12

вы, наверное, хотели указатель на порт объявить... так это делается не так:
volatile uint8_t *portd = &PORTD;

Re: Сложный вопрос AVR на С про volatile to const

Пт апр 19, 2019 21:48:43

uk8amk, без const не присваивает дефолтное значение.
ARV, нет, я хотел референс на порт.pass-by-reference

Re: Сложный вопрос AVR на С про volatile to const

Пт апр 19, 2019 22:29:00

Но в Си нет ссылок!

Re: Сложный вопрос AVR на С про volatile to const

Сб апр 20, 2019 06:17:35

точно! спасибо в чисто С нету. но в ардуино иде есть :) я компилю там так что подойдут и ссылки . только не понимаю как пройти компиляцию без ошибок испоьзуя ссылки?

Re: Сложный вопрос AVR на С про volatile to const

Сб апр 20, 2019 06:32:58

Вы лучше скажите, что хотите сделать. А то одни догадки только...

Re: Сложный вопрос AVR на С про volatile to const

Сб апр 20, 2019 09:19:52

alex68md писал(а):точно! спасибо в чисто С нету. но в ардуино иде есть :)
В ней C++.

Re: Сложный вопрос AVR на С про volatile to const

Сб апр 20, 2019 22:51:22

Хочу передать значение порта в функцию soft _ reset. И там сравнить его рилтайм так сказать

Re: Сложный вопрос AVR на С про volatile to const

Вс апр 21, 2019 05:12:23

без const не присваивает дефолтное значение.

Смешные они, программисты... :)))
Как можно присвоить дефолтное значение переменной, которая имеет смысл входного сигнала и при этом является оригиналом, а не копией?
:dont_know:
Вы бы хотя бы иногда задумались о том, какой код может сгенерировать компилятор на планируемый Вами в исходнике анекдот....

Re: Сложный вопрос AVR на С про volatile to const

Вс апр 21, 2019 08:28:32

Если объявили в volatile, то volatile и должны передавать.
Теперь посмотрим на ассемблер:
Изображение
LD R24,Z В Z будет адрес volatile uint8_t &portd = PIND;
LD сами посмотрите кому надо.
ST Y+1,R24 далее загрузка значения (не адреса) из R24 по какому-то адресу Y+1, к примеру 08F4 (не важно)
CALL все ушли в soft_reset, но там еще куда-то переход (не важно)
И так soft_reset
Изображение
И так адрес из Y+1, к примеру 08F4 (не важно), попадает в Z
LD R24,Z В Z будет наше значение, грузим в R24
AND R20,R24 что будет в R20 сами догадаетесь

А далее интересно
CPSE R20,R1
RJMP $-0002 будем здесь крутиться пока WDT не отработает 8 секунд, ТС так что там в рилтайм хотите?

Хотя может я не верно собрал, и задумка программиста была совсем другая.

Re: Сложный вопрос AVR на С про volatile to const

Вс апр 21, 2019 10:51:00

так что там в рилтайм хотите?

Под реалтаймом ЧТЕНИЯ ПОРТА понимается именно чтение порта, а не передача его значения в функцию...

Re: Сложный вопрос AVR на С про volatile to const

Вс апр 21, 2019 15:48:56

точно! спасибо в чисто С нету. но в ардуино иде есть :) я компилю там так что подойдут и ссылки . только не понимаю как пройти компиляцию без ошибок испоьзуя ссылки?


В адурине необходимо хотя-бы на начальном этапе воздержаться от прямого управления портами (хотя данный функционал вполне возможен).
Это как крайний случай выполняется опционное примитив-управление, но не факт, что не войдет в конфликт при использовании иных базовых функций - того же analogWrite(), tone() и кой-чего иного, ориентированного на использовании портов.
В ассемблере/чистом Си/ используется чтение-модификация-запись и/или маски для "неиспользуемых" в прикладной подпрограмме линий.
Альтернатива - полное монопольное использование порта на ввод или на вывод единственной задачей, использование временных буферов данных с которыми работает программа обработки при последующем вводе/выводе в порт.
:roll:
И какой там soft_reset через ногодрыг??
Иное дело программный JMP на 0х0000, а попытка дернуть вывод reset в принципе есть весьма сомнительный садомазохизм.
Линия reset конфигурируется как вход только через фузы (теряя при том функционал линии сброса и получая шанс убить МК до статуса реанимации фузе-доктором). Какой смысл тогда в "ногодрыжном" сбросе?
Другое дело какой-нить внешний триггер т.к. при сбросе вывод, его вызвавший может досрочно "отвалиться" в Z-состояние...
:dont_know:
Передача параметра по указателю или как переменной в адурине допускается только для функций не касающихся обработки прерываний. Ежли функция обрабатывает прерывание - то ничего не принимает и ничего не возвращает.
Это АДУРИНА.
Там иной принцип обмена должен использоваться.
8)

Re: Сложный вопрос AVR на С про volatile to const

Вс апр 21, 2019 16:44:13

Скорее автор хочет отловить последовательность 101, короткий импульс. Все остальное WDT перезагрузит.

Re: Сложный вопрос AVR на С про volatile to const

Вс апр 21, 2019 20:28:04

На все вопросы смогу ответить позже, сейчас отвечу на главный возникший в последних постах
(плиз не надо язвить и передергивать.)
В soft reset мы через while проверяем состояние пина. Точнее ожидаем заданное состояние пина. Если оно не распознается за 8 с то МК правильно перезагрузиться (а не через JMP 0). И процесс инициализации начнется заного. Неспорю кто-то логику организует красивее правильнее проще. Я смог так. Поверка пина нам нужна рил тайм , т.е. состояние порта может измениться же в любую мс, поэтому я не могу проверять статичное значение некой переменной. Дефолтное значение нужно т.к. не всегда передается порт но при этом while должен отработать как задумано а не крешнуться.

Другими словами логика очень простая. Но вот орфаграфия Си с её ссылками законами наследсвеностью не принимает такой простой и логичный кмк код.

Re: Сложный вопрос AVR на С про volatile to const

Пн апр 22, 2019 01:30:22

Дефолтное значение нужно т.к. не всегда передается порт

Ерунда какая то....
А что еще может быть вместо порта?
Вы либо открывайте ВЕСЬ СПЕКТР своих задумок, либо не задавайте вопросов.

Re: Сложный вопрос AVR на С про volatile to const

Пн апр 22, 2019 08:48:36

Для такого варианта достаточно внешних прерываний - их у адуринки минимум два.
Зачем программный опрос ставить?
По старт - моменту активируем внешнее прерывание и работаем дальше. А уж по прерыванию творим чего хотим.
Или функцию pulseIn() используем.
Для анализа отдельной лапки (или бита в байте переменной) есть набор функций работы с битами, в частности bitRead()...
Хоть с референсом ознакомиться надо (минимум тем, что в составе IDE в папке установки находится).
8)

Re: Сложный вопрос AVR на С про volatile to const

Пн апр 22, 2019 10:45:31

@"А что еще может быть вместо порта?"
так 1 ,может быть, дефолтное значение :)

@"Для такого варианта достаточно внешних прерываний"
они и стоят на прервывание, но оно инициализируеться позже. прежде чем его инициализировать надо убедиться что на входе и 0 и 1 а не только 1 :) иначе можно не проснуться ожидая 0 например.

для анализа лапки я как раз и делаю bitread в while через pass-by-reference

друзья , так как же ошибку исправить в коде ?

Re: Сложный вопрос AVR на С про volatile to const

Пн апр 22, 2019 11:14:32

я не понимаю, нафига там ссылки?
Код:
void wait_reset(volatile uint8_t *port){
   if(port == NULL) {
      // обрабатываем "дефолтное" значение
   } else {
      // обрабатываем состояние порта
      while(*port == 0){
         // ждем, пока не установится какой-то там уровень
      } 
   }
}

Re: Сложный вопрос AVR на С про volatile to const

Пн апр 22, 2019 13:09:53

@"А что еще может быть вместо порта?"
так 1 ,может быть, дефолтное значение :)

Что за каша из регистров (адресов) и их значений?
Если Вы передаете указатель на порт и маску порта (номер пина подлежащего анализу), то функция будет ожидать в реальном времени активного состояния ноги. Если речь идет о передаче еще и значения пассивного уровня и его Вы называете дефолтным, то передавайте его прямо как константу, а не пытайтесь присвоить это значение порту.
Ответить