реклама на сайте
подробности

 
 
> Проблема с volatile переменной - помогите плиз.
Илья_
сообщение Aug 19 2008, 14:21
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 18-10-07
Пользователь №: 31 472



Добрый день господа форумчане.

У меня возникла проблема - очень надеюсь на вашу помощь.

Пишу программу под PIC16F876 на PICC от HT-PICC.

В программе захотел сделать функцию антидребезг.
unsigned char do_antiripple_pin(volatile struct data_unit * data , char time_conversion);
В эту функцию передаю время проверки на дребезг и
указатель на структуру в которой содержиться иформация о ножке процессора.

volatile struct data_unit
{
volatile unsigned char pin_addres; // Адрес пина на цоколевке процессора.
unsigned char time_to_end; // Показывает сколько времени до конца преобразования
unsigned char temp_pin_value; // Сохраняет временное значение на меняющимся пине проца.
unsigned char changing_data; // Переменная с которой прграмма работает как с ножкой проца
unsigned char diferences_counter; // Счетчик несовпадений пина и значения переменой за интервал
};

Проблема с полем pin_addres - это у меня просто имя пина ( допустим RA0), я объявил глобальный экземпляр структуры volatile struct data_unit button_data = {0,0,1,1,0};потом в main(); присвоил полю pin_addres значение RA0

button_data.pin_addres = RA0;

ниже вызываю функцию do_antiripple_pin(&button_data,100);
и надеюсь что у меня в функцию передасться значение с ножки порта, причем не просто значение
а мгновенное, так как я везде где можно поставил volatile.

Но этого не происходит. Программа как один раз зафиксировала в памяти значение

button_data.pin_addres = RA0;

так больше его не меняет, хотя значение на ножке меняется (это я вижу через IDC2).

Выкладываю программу , там в листинге более понятно, чем я тут объясняю.

Программма как следует не работает, но если закоментировать стр 31, и раскоментировать стр 92
тогда все работает нормально. Нормально так же все работает если передавать в функцию просто
назвние ножки порта.

Но вот почему не работает как мне надо??? (Т.е в том виде в котором выложил!)

Помогите пожалуйста разобраться.
Прикрепленные файлы
Прикрепленный файл  my_pic_prog.zip ( 2.54 килобайт ) Кол-во скачиваний: 68
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Илья_
сообщение Aug 20 2008, 06:46
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 18-10-07
Пользователь №: 31 472



Уважаемый rezident.

Я попробовал сделать как вы советовали. Результат тот же - ничего не получается. Поле pin_addres не обновляеися согласно со значением ножки RA0.

А вот насчет того что истользовать volatile где попало не следует, я с вами согласен.

Просто в программе пытался найти верный вариант методом проб и ошибок, по этому и
поставил volatile где только возможно.

И еще я передаю в функцию только указатель на структуру, что бы избежать лишнего копирования при передачи аргументов в функцию.

Но главный вопрос так и остался открытым :
"Почему переменная обьявлення как volatile и которой присвоено значение ножки процессора, на меняется согласно с изменением сигнала на этой ноге процессора ??? "

Прикладываю новую версию программв с изменениями которые советовал внести г-н rezident.
Прикрепленные файлы
Прикрепленный файл  my_pic_prog2.zip ( 2.57 килобайт ) Кол-во скачиваний: 33
 
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 20 2008, 18:36
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(Илья_ @ Aug 20 2008, 10:46) *
Уважаемый rezident.

Я попробовал сделать как вы советовали. Результат тот же - ничего не получается. Поле pin_addres не обновляеися согласно со значением ножки RA0.

А вот насчет того что истользовать volatile где попало не следует, я с вами согласен.

Просто в программе пытался найти верный вариант методом проб и ошибок, по этому и
поставил volatile где только возможно.

И еще я передаю в функцию только указатель на структуру, что бы избежать лишнего копирования при передачи аргументов в функцию.

Но главный вопрос так и остался открытым :
"Почему переменная обьявлення как volatile и которой присвоено значение ножки процессора, на меняется согласно с изменением сигнала на этой ноге процессора ??? "

Прикладываю новую версию программв с изменениями которые советовал внести г-н rezident.


Уважаемый Илья!

Поймите раз и навсегда. Переменная (или поле в структуре) - это значение, лежащее в некоторой ячейке памяти. Указатель на эту переменную - адрес этой ячейки памяти. Улавливаете, что никакими ножками порта тут не пахнет?

Значит надо обеспечить программно чтение значения этой ноги и ее сохранение в вашей переменной. Volatile к этому процессу ну никаким образом. Volatile лишь запрещает компилятору оптимизировать эту переменную.
Опрашивать состояние ножки можно либо в каком-либо программном цикле, либо по прерыванию, если можно организовать такое, по изменению значения на ноге (зависит от конкретного процессора)
Go to the top of the page
 
+Quote Post
Илья_
сообщение Aug 20 2008, 20:15
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 18-10-07
Пользователь №: 31 472



Уважаемые господа, sergeeff и rezident.

То что указатель содержит адрес ячейки памяти, в которой храниться значение переменной
на которую этот указатель указывае - это азы Си. И они мне уверяю вас известны.

А то что модификатор voltile в обьявлениии указателя может указывать что указатель, так сказать волатильный( т.е. может измениться не только из программы, как регистры переферии ), и может
модификатор voltile указывать что указатель указывае на волатильную перменную.

Вот цитата из прервода документации по компилятору HT-PICC:


"Чтобы четче определить поведение и особенности указателя и объекта на который он
указывает можно комбинировать различные квалификаторы. К наиболее часто употребимым
квалификаторам относятся const, volatile, persistent. Применяя комбинации этих
квалификаторов необходимо следить за соответствием (отсутствием противоречий)
квалификаторов, оказывающих воздействие на свойства собственно указателя и объекта на
котрый он указывает. Правила, которые помогут сделать все правильно, просты: если
квалификатор находится слева от “*” в описании указателя, то он воздействует на объект,
адресуемый указателем. Если квалификатор находится справа, то он воздействует на
собственно указатель. Проиллюстрируем это примерами:
volatile char * nptr;
объявляет указатель на volatile символ. Другими словами в этом примере квалификатор
воздействует на объект, адресуемый указателем nptr.
char * volatile ptr;
так как квалификатор располагается справа от “*”, то он будет воздействовать на
собственно указатель ptr, а не на объект. И заключительный пример по этому поводу:
volatile char * volatile nnptr;
теперь будет описан volatile указатель на volatile переменную.
Рассмотрим некоторые аспекты применения константных указателей. Они применяются
для косвенного обращения к переменным описанным как const. В общем их поведение
(константных указателей) не отличается от поведения обычных указателей, но компилятор
препятствует выполнению операций записи с использованием этих указателей. Вот
несколько примеров:
const char * cptr;
при этом выражение:
char ch = *cptr;
абсолютно легально, в то время как выражение:
*cptr = ch;
недопустимо и вызовет ошибку"


Судя по тому что написано в описании, я совершенно правильно использовал квалификатор volatile,
а то что сам указатель не меняется так это тоже верно.

А я написал функцию которая выполняет антидребезг. И передаю в нее время , в течении которого проводить проверку на дребезг, и так же передаю в функцию структуру которая содержит информацию о пине. Так как антидребезг мы можем производить для любой из ножек контроллера к которой подклюен датчик или кнопка.

Так вот я мог бы пердавать в функцию явно номер пина RA0 или RC5 и это бы работало.
А если передавать структуру, в которой одним из полей будет номер пина (RA0 или RC5)
то функция работает некоретно. И вот вопрос ПОЧЕМУ???

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

Хотя быть может вы меня переубедите, если предложите другие аргументы. smile.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Илья_   Проблема с volatile переменной - помогите плиз.   Aug 19 2008, 14:21
- - rezident   При вызове функции do_antiripple_pin квалификатор ...   Aug 19 2008, 15:25
|- - rezident   Цитата(Илья_ @ Aug 20 2008, 12:46) Но гла...   Aug 20 2008, 15:29
|- - rezident   Цитата(Илья_ @ Aug 21 2008, 02:15) Хотя б...   Aug 20 2008, 20:51
|- - Сергей Борщ   Цитата(rezident @ Aug 20 2008, 23:51) Кст...   Aug 20 2008, 21:26
|- - rezident   Цитата(Сергей Борщ @ Aug 21 2008, 03:26) ...   Aug 20 2008, 22:06
|- - ReAl   Цитата(rezident @ Aug 21 2008, 01:06) А э...   Aug 21 2008, 10:12
- - Олег Хохлов   Цитата(Илья_ @ Aug 19 2008, 17:21) В эту ...   Aug 20 2008, 20:29
- - AHTOXA   Можно ещё вот так: Кодtypedef int (* ReadStat...   Aug 21 2008, 10:56
|- - ReAl   Цитата(AHTOXA @ Aug 21 2008, 13:56) Можно...   Aug 21 2008, 12:01
|- - AHTOXA   Цитата(ReAl @ Aug 21 2008, 18:01) Можно и...   Aug 21 2008, 12:21
- - Илья_   Добрый день господа форумчане. Ваши советы, деийс...   Aug 22 2008, 07:32
- - AHTOXA   Цитата(Илья_ @ Aug 22 2008, 13:32) Г-ну A...   Aug 22 2008, 14:10


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 03:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.0208 секунд с 7
ELECTRONIX ©2004-2016