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

Обсуждаем контроллеры компании Atmel.
alex68md
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб янв 03, 2015 21:03:24

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

Сообщение 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}'

есть идеи?
Реклама
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

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

Сообщение uk8amk »

volatile uint8_t &portd
const uint8_t &port

Как это понимать?
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
alex68md
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб янв 03, 2015 21:03:24

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

Сообщение alex68md »

uk8amk, без const не присваивает дефолтное значение.
ARV, нет, я хотел референс на порт.pass-by-reference
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Но в Си нет ссылок!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
alex68md
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб янв 03, 2015 21:03:24

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

Сообщение alex68md »

точно! спасибо в чисто С нету. но в ардуино иде есть :) я компилю там так что подойдут и ссылки . только не понимаю как пройти компиляцию без ошибок испоьзуя ссылки?
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Вы лучше скажите, что хотите сделать. А то одни догадки только...
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Сообщение Мурик »

alex68md писал(а):точно! спасибо в чисто С нету. но в ардуино иде есть :)
В ней C++.
alex68md
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб янв 03, 2015 21:03:24

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

Сообщение alex68md »

Хочу передать значение порта в функцию soft _ reset. И там сравнить его рилтайм так сказать
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25219
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

[uquote="alex68md",url="/forum/viewtopic.php?p=3619877#p3619877"]без const не присваивает дефолтное значение.[/uquote]
Смешные они, программисты... :)))
Как можно присвоить дефолтное значение переменной, которая имеет смысл входного сигнала и при этом является оригиналом, а не копией?
:dont_know:
Вы бы хотя бы иногда задумались о том, какой код может сгенерировать компилятор на планируемый Вами в исходнике анекдот....
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение 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 секунд, ТС так что там в рилтайм хотите?

Хотя может я не верно собрал, и задумка программиста была совсем другая.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25219
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3620468#p3620468"]так что там в рилтайм хотите?[/uquote]
Под реалтаймом ЧТЕНИЯ ПОРТА понимается именно чтение порта, а не передача его значения в функцию...
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

[uquote="alex68md",url="/forum/viewtopic.php?p=3619965#p3619965"]точно! спасибо в чисто С нету. но в ардуино иде есть :) я компилю там так что подойдут и ссылки . только не понимаю как пройти компиляцию без ошибок испоьзуя ссылки?[/uquote]

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

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

Сообщение Dimon456 »

Скорее автор хочет отловить последовательность 101, короткий импульс. Все остальное WDT перезагрузит.
alex68md
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб янв 03, 2015 21:03:24

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

Сообщение alex68md »

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

Другими словами логика очень простая. Но вот орфаграфия Си с её ссылками законами наследсвеностью не принимает такой простой и логичный кмк код.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25219
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

[uquote="alex68md",url="/forum/viewtopic.php?p=3620812#p3620812"]Дефолтное значение нужно т.к. не всегда передается порт[/uquote]
Ерунда какая то....
А что еще может быть вместо порта?
Вы либо открывайте ВЕСЬ СПЕКТР своих задумок, либо не задавайте вопросов.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

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

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

Сообщение alex68md »

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

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

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

друзья , так как же ошибку исправить в коде ?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

я не понимаю, нафига там ссылки?

Код: Выделить всё

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

Мой уютный бложик... заходите!
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25219
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

[uquote="alex68md",url="/forum/viewtopic.php?p=3621051#p3621051"]@"А что еще может быть вместо порта?"
так 1 ,может быть, дефолтное значение :)[/uquote]
Что за каша из регистров (адресов) и их значений?
Если Вы передаете указатель на порт и маску порта (номер пина подлежащего анализу), то функция будет ожидать в реальном времени активного состояния ноги. Если речь идет о передаче еще и значения пассивного уровня и его Вы называете дефолтным, то передавайте его прямо как константу, а не пытайтесь присвоить это значение порту.
Ответить

Вернуться в «AVR»