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

Обсуждаем контроллеры компании Atmel.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение 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) != 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?
Реклама
alex68md
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб янв 03, 2015 21:03:24

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

Сообщение 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 . не понял почему это неправильно ?
ну согласен можно так написать

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

if (!port) while (1);
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

alex68md писал(а):почему? вроде оно у меня работает для обоих состояний
А level чему у вас равно?
Давайте конкретно на примере

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

while ((PIND & 0) ^ level); level-?

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

while ((PIND & 5) ^ level); level-?
alex68md писал(а):иногда у меня адрес будет NULL
Это как? Мне просто интересно, как можно вызвать функцию принимающую параметр без передачи самого параметра?
И, вы должны быть в курсе чему принадлежит адрес 0x0000 SRAM?
alex68md
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб янв 03, 2015 21:03:24

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

Сообщение 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 нужен. разве код не будет работать ?
Реклама
Эиком - электронные компоненты и радиодетали
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

alex68md писал(а):разве код не будет работать ?
А вы еще код в работе и не пробовали?
Объясните
Dimon456 писал(а):Мне просто интересно, как можно вызвать функцию принимающую параметр без передачи самого параметра?
Реклама
alex68md
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб янв 03, 2015 21:03:24

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

Сообщение alex68md »

Сори не заметил этот вопрос
Вот так soft_reset ();

На виртуалке код работает. Есть причины почему оно не будет работать в железе?
Например как ~port оказалось что в железе не будет работать хотя виртуалка ок. Но вроде исправит теперь все косяки. Так что там в 0x00 SRAM ?
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

alex68md писал(а):Сори не заметил этот вопрос
Вот так soft_reset ();
Почти поверил, однако asm говорит об обратном
СпойлерИзображение
Ваш

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

soft_reset ();
равносилен записи

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

soft_reset(WDTO_15MS,0,1,1);
alex68md
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб янв 03, 2015 21:03:24

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

Сообщение alex68md »

равносилен записи
---
да правильно. и далее if (!0) while (1); //тут должно остановиться. if должен сработать. ??

в железе не проверял. но виртуал вроде работает, arduino ide компилит. проблема что виртуал не показывает такие фокусы как изначально например у меня было ~port о чём Reflector указал. но в данной реализации вроде упростил до немогу и никаких rvalue/lvalue временных не создаётся. port должен быть real time обновляемый volatile при каждой проверке while/
если я ничего не упустил из виду?
alex68md
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб янв 03, 2015 21:03:24

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

Сообщение alex68md »

Dimon456,
так что с вызовом soft_reset(WDTO_15MS,0,1,1);
разве не будет работать в железе?
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

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

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

Сообщение alex68md »

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

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

Сообщение 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
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18556
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

alex68md писал(а):что за безобразие этот avr
поскольку вы завели уже не одну тему с проблемами, которые есть только у вас и ни разу не встречались всем остальным, дело явно не в AVR.

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

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

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

Сообщение alex68md »

эксперименты с функией приведенной выше показали следующее...

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

вообщем передача PINx как аргумент в конце концов решило проблему просто оно все как тормознуто работает внутри функции. когда просто в лупе рил тайм я сканирую лапку то четко видна единица от датчика. а передаю порт в функцию и проверяю там както неохотно while внутри функции видит единицу. поэтому решил там увеличить время (8с маловато) на отлов единицы и в конце концов наверно вообще закоментирую этот блок. както не smoothly протекает автопроверка роботоспособности датчика.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18556
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

alex68md писал(а):посмотрите код в соседней теме
я смотрел и не увидел катастрофы.
но тот факт, что тривиальный код не работает, как должен, говорит о том, что проблема где-то есть. но я утверждаю, что она не внутри микроконтроллера (с оговоркой, что микроконтроллер на самом деле соответствует даташиту Atmel).
в качестве оснований моего утверждения сошлюсь на миллионы конструкций, напрямую работающих с чтением PINx и не имеющих подобных проблем - даже ардуинщики наклепали тысячи поделок, не говоря про "хардкорщиков", обходящихся без наворотов ардуины.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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