Страница 4 из 4
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Чт май 09, 2019 16:57:24
Dimon456
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) != 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)
, то есть хотите контролировать более одного порта, может два может три, и кучу пинов.
Если это так, то это
выражение справедливо только при 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();
}
И да,
вы за чем адрес порта сравниваете с NULL? Чему по вашему мнению будет равен NULL?
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Чт май 09, 2019 17:28:42
alex68md
[uquote="Dimon456",url="/forum/viewtopic.php?p=3630767#p3630767"]В случае ARV макрос привязан к конкретному значению порта или const, оно неизменно на протяжении всей выполнения программы.[/uquote]
ну так и у меня вызов происходит через макросы. ARV запихнул их в while я в call

вроде на мой непрофессиональный взгляд одно и тоже (ну почти)
while ((*port & pin) ^ level);
выражение справедливо только при pin = 0, сколько можно об этом писать.
почему? вроде оно у меня работает для обоих состояний
Добавлено after 3 minutes 36 seconds:
вы за чем адрес порта сравниваете с NULL? Чему по вашему мнению будет равен NULL?
иногда у меня адрес будет NULL . не понял почему это неправильно ?
ну согласен можно так написать
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Чт май 09, 2019 18:12:40
Dimon456
alex68md писал(а):почему? вроде оно у меня работает для обоих состояний
А level чему у вас равно?
Давайте конкретно на примере
alex68md писал(а):иногда у меня адрес будет NULL
Это как? Мне просто интересно, как можно вызвать функцию принимающую параметр без передачи самого параметра?
И, вы должны быть в курсе чему принадлежит адрес 0x0000 SRAM?
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Чт май 09, 2019 18:40:02
alex68md
Код: Выделить всё
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 нужен. разве код не будет работать ?
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Чт май 09, 2019 19:06:04
Dimon456
alex68md писал(а):разве код не будет работать ?
А вы еще код в работе и не пробовали?
Объясните
Dimon456 писал(а):Мне просто интересно, как можно вызвать функцию принимающую параметр без передачи самого параметра?
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Чт май 09, 2019 21:52:09
alex68md
Сори не заметил этот вопрос
Вот так soft_reset ();
На виртуалке код работает. Есть причины почему оно не будет работать в железе?
Например как ~port оказалось что в железе не будет работать хотя виртуалка ок. Но вроде исправит теперь все косяки. Так что там в 0x00 SRAM ?
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Пт май 10, 2019 09:01:20
Dimon456
alex68md писал(а):Сори не заметил этот вопрос
Вот так soft_reset ();
Почти поверил, однако asm говорит об обратном
Спойлер

Ваш
равносилен записи
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Пт май 10, 2019 12:55:44
alex68md
равносилен записи
---
да правильно. и далее 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
alex68md
Dimon456,
так что с вызовом soft_reset(WDTO_15MS,0,1,1);
разве не будет работать в железе?
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Пн май 13, 2019 18:37:35
Dimon456
Эта то точно будет работать, другого ей не дано, а вот все остальное ... большой вопрос.
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Вт май 14, 2019 23:05:37
alex68md
Ну просто вы напугали с 0 адресом. Я уж подумал на avr особенный нулевой адрес

Тогда почему у вас не получался вызов без параметров?
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Чт май 23, 2019 10:13:27
alex68md
[uquote="Dimon456",url="/forum/viewtopic.php?p=3630845#p3630845"]А вы еще код в работе и не пробовали?[/uquote]
вот пробую и какаято лажа
Код: Выделить всё
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
ARV
alex68md писал(а):что за безобразие этот avr
поскольку вы завели уже не одну тему с проблемами, которые есть только у вас и ни разу не встречались всем остальным, дело явно не в AVR.
и смею вас заверить, что в моих играх с AVR (а веду я их уже лет 10, не меньше) и все пины читаются, и все if-ы срабатывают, и циклы крутятся, сколько надо, и указатели разыменовываются и все прочее функционирует, как должно.
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Пт май 24, 2019 11:54:26
alex68md
эксперименты с функией приведенной выше показали следующее...
после того как ПИН у меня не читал значения я понял функцию на прием ПОРТ, однако
ПОРТ у меня как выяснилось вообще не читает изменения на ноге инпут на которой висит датчик для прерывания.
чтоб вы не говорили что это не ПОРТ а мой код. посмотрите код в соседней теме где нет ни кого кода кроме записи нулей во все порты и порт и пин разные результаты даёт. ПИН больше видит единиц на ногах. но при этом более медленный чем ПОРТ
вообщем передача PINx как аргумент в конце концов решило проблему просто оно все как тормознуто работает внутри функции. когда просто в лупе рил тайм я сканирую лапку то четко видна единица от датчика. а передаю порт в функцию и проверяю там както неохотно while внутри функции видит единицу. поэтому решил там увеличить время (8с маловато) на отлов единицы и в конце концов наверно вообще закоментирую этот блок. както не smoothly протекает автопроверка роботоспособности датчика.
Re: Сложный вопрос AVR на С про volatile to const
Добавлено: Пт май 24, 2019 12:02:00
ARV
alex68md писал(а):посмотрите код в соседней теме
я смотрел и не увидел катастрофы.
но тот факт, что тривиальный код не работает, как должен, говорит о том, что проблема где-то есть. но я утверждаю, что она не внутри микроконтроллера (с оговоркой, что микроконтроллер на самом деле соответствует даташиту Atmel).
в качестве оснований моего утверждения сошлюсь на миллионы конструкций, напрямую работающих с чтением PINx и не имеющих подобных проблем - даже ардуинщики наклепали тысячи поделок, не говоря про "хардкорщиков", обходящихся без наворотов ардуины.