Страница 1 из 4
Сложный вопрос AVR на С про volatile to const
Добавлено: Пт апр 19, 2019 18:19:05
alex68md
Код: Выделить всё
#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
uk8amk
volatile uint8_t &portd
const uint8_t &port
Как это понимать?
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Пт апр 19, 2019 19:29:12
ARV
вы, наверное, хотели указатель на порт объявить... так это делается не так:
volatile uint8_t *portd = &PORTD;
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Пт апр 19, 2019 21:48:43
alex68md
uk8amk, без const не присваивает дефолтное значение.
ARV, нет, я хотел референс на порт.pass-by-reference
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Пт апр 19, 2019 22:29:00
ARV
Но в Си нет ссылок!
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Сб апр 20, 2019 06:17:35
alex68md
точно! спасибо в чисто С нету. но в ардуино иде есть

я компилю там так что подойдут и ссылки . только не понимаю как пройти компиляцию без ошибок испоьзуя ссылки?
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Сб апр 20, 2019 06:32:58
Аlex
Вы лучше скажите, что хотите сделать. А то одни догадки только...
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Сб апр 20, 2019 09:19:52
Мурик
alex68md писал(а):точно! спасибо в чисто С нету. но в ардуино иде есть
В ней C++.
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Сб апр 20, 2019 22:51:22
alex68md
Хочу передать значение порта в функцию soft _ reset. И там сравнить его рилтайм так сказать
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Вс апр 21, 2019 05:12:23
КРАМ
[uquote="alex68md",url="/forum/viewtopic.php?p=3619877#p3619877"]без const не присваивает дефолтное значение.[/uquote]
Смешные они, программисты...
Как можно присвоить дефолтное значение переменной, которая имеет смысл входного сигнала и при этом является оригиналом, а не копией?

Вы бы хотя бы иногда задумались о том, какой код может сгенерировать компилятор на планируемый Вами в исходнике анекдот....
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Вс апр 21, 2019 08:28:32
Dimon456
Если объявили в 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
КРАМ
[uquote="Dimon456",url="/forum/viewtopic.php?p=3620468#p3620468"]так что там в рилтайм хотите?[/uquote]
Под реалтаймом ЧТЕНИЯ ПОРТА понимается именно чтение порта, а не передача его значения в функцию...
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Вс апр 21, 2019 15:48:56
BOB51
[uquote="alex68md",url="/forum/viewtopic.php?p=3619965#p3619965"]точно! спасибо в чисто С нету. но в ардуино иде есть

я компилю там так что подойдут и ссылки . только не понимаю как пройти компиляцию без ошибок испоьзуя ссылки?[/uquote]
В адурине необходимо хотя-бы на начальном этапе воздержаться от прямого управления портами (хотя данный функционал вполне возможен).
Это как крайний случай выполняется опционное примитив-управление, но не факт, что не войдет в конфликт при использовании иных базовых функций - того же analogWrite(), tone() и кой-чего иного, ориентированного на использовании портов.
В ассемблере/чистом Си/ используется чтение-модификация-запись и/или маски для "неиспользуемых" в прикладной подпрограмме линий.
Альтернатива - полное монопольное использование порта на ввод или на вывод единственной задачей, использование временных буферов данных с которыми работает программа обработки при последующем вводе/выводе в порт.

И какой там soft_reset через ногодрыг??
Иное дело программный JMP на 0х0000, а попытка дернуть вывод reset в принципе есть весьма сомнительный садомазохизм.
Линия reset конфигурируется как вход только через фузы (теряя при том функционал линии сброса и получая шанс убить МК до статуса реанимации фузе-доктором). Какой смысл тогда в "ногодрыжном" сбросе?
Другое дело какой-нить внешний триггер т.к. при сбросе вывод, его вызвавший может досрочно "отвалиться" в Z-состояние...

Передача параметра по указателю или как переменной
в адурине допускается только для функций не касающихся обработки прерываний. Ежли функция обрабатывает прерывание - то ничего не принимает и ничего не возвращает.
Это АДУРИНА.
Там иной принцип обмена должен использоваться.

Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Вс апр 21, 2019 16:44:13
Dimon456
Скорее автор хочет отловить последовательность 101, короткий импульс. Все остальное WDT перезагрузит.
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Вс апр 21, 2019 20:28:04
alex68md
На все вопросы смогу ответить позже, сейчас отвечу на главный возникший в последних постах
(плиз не надо язвить и передергивать.)
В soft reset мы через while проверяем состояние пина. Точнее ожидаем заданное состояние пина. Если оно не распознается за 8 с то МК правильно перезагрузиться (а не через JMP 0). И процесс инициализации начнется заного. Неспорю кто-то логику организует красивее правильнее проще. Я смог так. Поверка пина нам нужна рил тайм , т.е. состояние порта может измениться же в любую мс, поэтому я не могу проверять статичное значение некой переменной. Дефолтное значение нужно т.к. не всегда передается порт но при этом while должен отработать как задумано а не крешнуться.
Другими словами логика очень простая. Но вот орфаграфия Си с её ссылками законами наследсвеностью не принимает такой простой и логичный кмк код.
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Пн апр 22, 2019 01:30:22
КРАМ
[uquote="alex68md",url="/forum/viewtopic.php?p=3620812#p3620812"]Дефолтное значение нужно т.к. не всегда передается порт[/uquote]
Ерунда какая то....
А что еще может быть вместо порта?
Вы либо открывайте ВЕСЬ СПЕКТР своих задумок, либо не задавайте вопросов.
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Пн апр 22, 2019 08:48:36
BOB51
Для такого варианта достаточно внешних прерываний - их у адуринки минимум два.
Зачем программный опрос ставить?
По старт - моменту активируем внешнее прерывание и работаем дальше. А уж по прерыванию творим чего хотим.
Или функцию
pulseIn() используем.
Для анализа отдельной лапки (или бита в байте переменной) есть набор функций работы с битами, в частности
bitRead()...
Хоть с референсом ознакомиться надо (минимум тем, что в составе IDE в папке установки находится).

Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Пн апр 22, 2019 10:45:31
alex68md
@"А что еще может быть вместо порта?"
так 1 ,может быть, дефолтное значение
@"Для такого варианта достаточно внешних прерываний"
они и стоят на прервывание, но оно инициализируеться позже. прежде чем его инициализировать надо убедиться что на входе и 0 и 1 а не только 1

иначе можно не проснуться ожидая 0 например.
для анализа лапки я как раз и делаю bitread в while через pass-by-reference
друзья , так как же ошибку исправить в коде ?
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Пн апр 22, 2019 11:14:32
ARV
я не понимаю, нафига там ссылки?
Код: Выделить всё
void wait_reset(volatile uint8_t *port){
if(port == NULL) {
// обрабатываем "дефолтное" значение
} else {
// обрабатываем состояние порта
while(*port == 0){
// ждем, пока не установится какой-то там уровень
}
}
}
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Пн апр 22, 2019 13:09:53
КРАМ
[uquote="alex68md",url="/forum/viewtopic.php?p=3621051#p3621051"]@"А что еще может быть вместо порта?"
так 1 ,может быть, дефолтное значение

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