Например TDA7294

Форум РадиоКот • Просмотр темы - Сложный вопрос AVR на С про volatile to const
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 23, 2024 20:28:36

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 75 ]    , , , 4
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Сложный вопрос AVR на С про volatile to const
СообщениеДобавлено: Чт май 09, 2019 16:57:24 
Мудрый кот

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
alex68md писал(а):
ну так это по сути тоже самое к чему я пришел выше. просто передаю значения в функцию а вы через макрос.
Нет, не одно и то же.
В случае ARV макрос привязан к конкретному значению порта или const, оно неизменно на протяжении всей выполнения программы.
К примеру так
Код:
#define SENSOR_PORT    PIND
#define SENSOR_MASK (1<<5)

while((SENSOR_PORT & SENSOR_MASK) != SENSOR_VAL)
И это выражение справедливо только при одном значении SENSOR_VAL.
Либо так
Код:
while((SENSOR_PORT & SENSOR_MASK) != 0)
либо эдак
Код:
while((SENSOR_PORT & SENSOR_MASK) == 0)
Целесообразнее было бы использовать такую запись
Код:
while((SENSOR_PORT & SENSOR_MASK) != SENSOR_MASK)
while((SENSOR_PORT & SENSOR_MASK) == SENSOR_MASK)
либо так
Код:
while((SENSOR_PORT & SENSOR_MASK))
while(!(SENSOR_PORT & SENSOR_MASK))

Вы используете
Код:
void soft_reset(const uint8_t wdt_prescale, const volatile uint8_t *port, const uint8_t pin, const uint8_t level)
, то есть хотите контролировать более одного порта, может два может три, и кучу пинов.
Если это так, то это
Код:
while ((*port & pin) ^ level);
выражение справедливо только при pin = 0, сколько можно об этом писать.

Перепишите так
Код:
void soft_reset(const uint8_t wdt_prescale, volatile uint8_t *port, const uint8_t pin, const uint8_t level){
 
   wdt_enable(wdt_prescale);
   if (port == NULL) while (1);
   if (level) {
   while(!(*port&(1 << pin)));   //
   } else {
   while((*port&(1 << pin)));   //
   }
   wdt_disable();
}
И да,
Код:
if (port == NULL) while (1);
вы за чем адрес порта сравниваете с NULL? Чему по вашему мнению будет равен NULL?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Сложный вопрос AVR на С про volatile to const
СообщениеДобавлено: Чт май 09, 2019 17:28:42 
Грызет канифоль

Зарегистрирован: Сб янв 03, 2015 21:03:24
Сообщений: 266
Рейтинг сообщения: 0
В случае ARV макрос привязан к конкретному значению порта или const, оно неизменно на протяжении всей выполнения программы.

ну так и у меня вызов происходит через макросы. ARV запихнул их в while я в call :) вроде на мой непрофессиональный взгляд одно и тоже (ну почти)

Цитата:
while ((*port & pin) ^ level);
выражение справедливо только при pin = 0, сколько можно об этом писать.

почему? вроде оно у меня работает для обоих состояний

Добавлено after 3 minutes 36 seconds:
Цитата:
вы за чем адрес порта сравниваете с NULL? Чему по вашему мнению будет равен NULL?

иногда у меня адрес будет NULL . не понял почему это неправильно ?
ну согласен можно так написать
Код:
if (!port) while (1);


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Сложный вопрос AVR на С про volatile to const
СообщениеДобавлено: Чт май 09, 2019 18:12:40 
Мудрый кот

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
alex68md писал(а):
почему? вроде оно у меня работает для обоих состояний
А level чему у вас равно?
Давайте конкретно на примере
Код:
while ((PIND & 0) ^ level); level-?
Код:
while ((PIND & 5) ^ level); level-?
alex68md писал(а):
иногда у меня адрес будет NULL
Это как? Мне просто интересно, как можно вызвать функцию принимающую параметр без передачи самого параметра?
И, вы должны быть в курсе чему принадлежит адрес 0x0000 SRAM?


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Сложный вопрос AVR на С про volatile to const
СообщениеДобавлено: Чт май 09, 2019 18:40:02 
Грызет канифоль

Зарегистрирован: Сб янв 03, 2015 21:03:24
Сообщений: 266
Рейтинг сообщения: 0
Код:
void soft_reset(const uint8_t wdt_prescale = WDTO_15MS, const volatile uint8_t *port = NULL, const uint8_t pin = 1, const uint8_t level = 1){
   wdt_enable(wdt_prescale);
   if (!port) while (1);
   while ((*port & pin) ^ level);
   wdt_disable();
}

void isPIRHigh(){
   soft_reset(WDTO_8S, &PIND, PIN_INT0, PIN_INT0);               //break when PD0 high
}

void isPIRLow(){
   soft_reset(WDTO_8S, &PIND, PIN_INT0, !PIN_INT0);            //break when PD0 low
}



вы должны быть в курсе чему принадлежит адрес 0x0000 SRAM?
---
нет. чему? но думаю 0. но вроде оно мне и не надо. мне сам адрес 0 для if нужен. разве код не будет работать ?


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Сложный вопрос AVR на С про volatile to const
СообщениеДобавлено: Чт май 09, 2019 19:06:04 
Мудрый кот

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
alex68md писал(а):
разве код не будет работать ?
А вы еще код в работе и не пробовали?
Объясните
Dimon456 писал(а):
Мне просто интересно, как можно вызвать функцию принимающую параметр без передачи самого параметра?


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Сложный вопрос AVR на С про volatile to const
СообщениеДобавлено: Чт май 09, 2019 21:52:09 
Грызет канифоль

Зарегистрирован: Сб янв 03, 2015 21:03:24
Сообщений: 266
Рейтинг сообщения: 0
Сори не заметил этот вопрос
Вот так soft_reset ();

На виртуалке код работает. Есть причины почему оно не будет работать в железе?
Например как ~port оказалось что в железе не будет работать хотя виртуалка ок. Но вроде исправит теперь все косяки. Так что там в 0x00 SRAM ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Сложный вопрос AVR на С про volatile to const
СообщениеДобавлено: Пт май 10, 2019 09:01:20 
Мудрый кот

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
alex68md писал(а):
Сори не заметил этот вопрос
Вот так soft_reset ();
Почти поверил, однако asm говорит об обратном
СпойлерИзображение
Ваш
Код:
soft_reset ();
равносилен записи
Код:
soft_reset(WDTO_15MS,0,1,1);


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Сложный вопрос AVR на С про volatile to const
СообщениеДобавлено: Пт май 10, 2019 12:55:44 
Грызет канифоль

Зарегистрирован: Сб янв 03, 2015 21:03:24
Сообщений: 266
Рейтинг сообщения: 0
равносилен записи
---
да правильно. и далее if (!0) while (1); //тут должно остановиться. if должен сработать. ??

в железе не проверял. но виртуал вроде работает, arduino ide компилит. проблема что виртуал не показывает такие фокусы как изначально например у меня было ~port о чём Reflector указал. но в данной реализации вроде упростил до немогу и никаких rvalue/lvalue временных не создаётся. port должен быть real time обновляемый volatile при каждой проверке while/
если я ничего не упустил из виду?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Сложный вопрос AVR на С про volatile to const
СообщениеДобавлено: Пн май 13, 2019 14:46:25 
Грызет канифоль

Зарегистрирован: Сб янв 03, 2015 21:03:24
Сообщений: 266
Рейтинг сообщения: 0
Dimon456,
так что с вызовом soft_reset(WDTO_15MS,0,1,1);
разве не будет работать в железе?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Сложный вопрос AVR на С про volatile to const
СообщениеДобавлено: Пн май 13, 2019 18:37:35 
Мудрый кот

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
Эта то точно будет работать, другого ей не дано, а вот все остальное ... большой вопрос.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Сложный вопрос AVR на С про volatile to const
СообщениеДобавлено: Вт май 14, 2019 23:05:37 
Грызет канифоль

Зарегистрирован: Сб янв 03, 2015 21:03:24
Сообщений: 266
Рейтинг сообщения: 0
Ну просто вы напугали с 0 адресом. Я уж подумал на avr особенный нулевой адрес :)
Тогда почему у вас не получался вызов без параметров?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Сложный вопрос AVR на С про volatile to const
СообщениеДобавлено: Чт май 23, 2019 10:13:27 
Грызет канифоль

Зарегистрирован: Сб янв 03, 2015 21:03:24
Сообщений: 266
Рейтинг сообщения: 0
А вы еще код в работе и не пробовали?


вот пробую и какаято лажа
Код:
        wdt_enable(wdt_prescale);
Serial.print("wdt =");
Serial.println(wdt_prescale);
Serial.print("port =");
Serial.println(*port);
Serial.print("pin =");
Serial.println(pin);
Serial.print("level =");
Serial.println(level);
        if (!port) do {Serial.println("while 1");} while (1);
        while ((*port & pin) ^ level);
Serial.println("wdt disable");
        wdt_disable();


выводит
Код:
wdt =0
port =160
pin =1
level =1
while 1
while 1
while 1


т.е. передаем но if почему то не срабатывает и уходит в while(1);
как сделать чтоб if(!port) сработал?

Добавлено after 39 minutes 58 seconds:
я заметил когда port =160 if не срабатывает.
а иногда на тот же самый вызов передает port =32
и тогда if срабатывает

т.е.
if (! 160) true //но тут тоже должно быть false
if (! 32) false

что за безобразие этот avr


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Сложный вопрос AVR на С про volatile to const
СообщениеДобавлено: Чт май 23, 2019 10:26:59 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
alex68md писал(а):
что за безобразие этот avr
поскольку вы завели уже не одну тему с проблемами, которые есть только у вас и ни разу не встречались всем остальным, дело явно не в AVR.

и смею вас заверить, что в моих играх с AVR (а веду я их уже лет 10, не меньше) и все пины читаются, и все if-ы срабатывают, и циклы крутятся, сколько надо, и указатели разыменовываются и все прочее функционирует, как должно.

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Сложный вопрос AVR на С про volatile to const
СообщениеДобавлено: Пт май 24, 2019 11:54:26 
Грызет канифоль

Зарегистрирован: Сб янв 03, 2015 21:03:24
Сообщений: 266
Рейтинг сообщения: 0
эксперименты с функией приведенной выше показали следующее...

после того как ПИН у меня не читал значения я понял функцию на прием ПОРТ, однако
ПОРТ у меня как выяснилось вообще не читает изменения на ноге инпут на которой висит датчик для прерывания.
чтоб вы не говорили что это не ПОРТ а мой код. посмотрите код в соседней теме где нет ни кого кода кроме записи нулей во все порты и порт и пин разные результаты даёт. ПИН больше видит единиц на ногах. но при этом более медленный чем ПОРТ

вообщем передача PINx как аргумент в конце концов решило проблему просто оно все как тормознуто работает внутри функции. когда просто в лупе рил тайм я сканирую лапку то четко видна единица от датчика. а передаю порт в функцию и проверяю там както неохотно while внутри функции видит единицу. поэтому решил там увеличить время (8с маловато) на отлов единицы и в конце концов наверно вообще закоментирую этот блок. както не smoothly протекает автопроверка роботоспособности датчика.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Сложный вопрос AVR на С про volatile to const
СообщениеДобавлено: Пт май 24, 2019 12:02:00 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
alex68md писал(а):
посмотрите код в соседней теме
я смотрел и не увидел катастрофы.
но тот факт, что тривиальный код не работает, как должен, говорит о том, что проблема где-то есть. но я утверждаю, что она не внутри микроконтроллера (с оговоркой, что микроконтроллер на самом деле соответствует даташиту Atmel).
в качестве оснований моего утверждения сошлюсь на миллионы конструкций, напрямую работающих с чтением PINx и не имеющих подобных проблем - даже ардуинщики наклепали тысячи поделок, не говоря про "хардкорщиков", обходящихся без наворотов ардуины.

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 75 ]    , , , 4

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 47


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y