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

 
 
> Проблема с 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 22 2008, 07:32
Сообщение #2


Участник
*

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



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

Ваши советы, деийствительно дельные и очень помогают. Всем большое спасибо за это.

Отдельное спасибо форуму за то что, объединяет профессоналов и людей интересующихся электроникой и является местом где можно изложить свою проблему. А грамотно изложив проблему людям с сам уже на полпути продвиншься к решению. Ибо не даром сказано "Кто ясно мыслит - тот ясно излагает." И чего следует, что надо время от времени ясно излагать что ды достичь ясности в мыслях....

Извините, за лиричиское отступление wacko.gif (Остапа, как говориться, понесло....) smile.gif


Итак к делу:

1) Для большей ясности для начала отвечаю на вопрос г-на residenta:
"Кстати, вы так и не привели выдержку о том, что представляет из себя символьное обозначение RA0."

Вот ответ: static volatile bit RA0 @ (unsigned)&PORTA*8+0;
static volatile unsigned char PORTA @ 0x05;

и еще выдержка из описания к компилятору:
"2.9 Статические переменные
Глобальные или статические переменные могут располагаться по абсолютному адресу.
Для этого в описании переменной используется специальная конструкция “@ <адрес>”.
Например:
volatile unsigned char Portvar @ 0x06;
Такое описание дает возможность обращаться к абсолютному адресу 0х06 посредствам
переменной Portvar. Надо учитывать, что в этом случае компилятор не резервирует память
под размещение этой переменной. С точки зрения ассемблера это описание выглядит
следующим образом:
Portvar equ 06h"


2) Прав г-н Олег Хохлов написав:
""volatile unsigned char pin_addres " - Какой же это адрес ?!? Если адрес должен выглядеть как
"volatile unsigned char * pin_addres"."

Вводя в структуру поле pin_addres я имел ввиду что мне нужна переменная , входящая, которая
будет содержать тоже что и переменная RA0 в любой момент времени. А то что надо просто связать
мое поле структуры и ножку RA0 через адрес у меня в голове на тот момент четко не оформилось.

3) И вот тут я подошел к тому о чем писал г-н Сергей Борщ :
"И если компилятор позволяет делать указатели на такие типы (в чем я сомневаюсь, зная систему команд пика), то поле структуры должно быть объявлено как bit volatile * pin_address; или volatile bit * pin_address;, что одно и то же"
Да, компилятор не прозволяет делать указатели на переменные типа бит и следует, ввести структуру
поле - адрес номера порта, и поле - номер бита в порте, тогда проблема решается. Но об этом же
написал г-н ReAl a14.gif

И вот тут я пришел к тому, что нехочется мне в структру вводить дополнительное поле и я решил сделать по другому - см. прикрепленные файлы.

Все в таком работает отлично, только мне опять приходиться опять перед вызовом функции антидребезг обновлять значение ножки порта в структуре. Как бы мне от этого избавиться
, что бы один раз(при инициализаци) связать значение ножки порта и поле структуры?

Г-ну AHTOXе хочу сказать что его вариант конечно интересный, но писать одинаковые функции для каждой ножки порта я нахожу громоздким. А если ножек 80 как в PIC18f87j10? Я же хочу написать универсальную функцию.
Прикрепленные файлы
Прикрепленный файл  my_pic_prog3.zip ( 3.32 килобайт ) Кол-во скачиваний: 35
 
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 22 2008, 14:10
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Илья_ @ Aug 22 2008, 13:32) *
Г-ну AHTOXе хочу сказать что его вариант конечно интересный, но писать одинаковые функции для каждой ножки порта я нахожу громоздким. А если ножек 80 как в PIC18f87j10? Я же хочу написать универсальную функцию.


Неужели на все 80 ножек нужен антидребезг? wacko.gif И потом, зачем всё писать вручную? Есть же макросыsmile.gif

Код
typedef int (* ReadStateFunc)(void);

typedef struct
{
  ReadStateFunc ReadState;
  int ticks;
  int old_state;
}PinData;

#define PIN_DEBOUNCE_TIME    (10)

#define DECLARE_PIN(pin) \
int ReadPin##pin(void) \
{ \
  if (pin) return 1; \
  return 0; \
} \
\
PinData Pin##pin = {ReadPin##pin}\

DECLARE_PIN(B0);
DECLARE_PIN(B1);
DECLARE_PIN(B2);

int debounce(PinData * pin)
{
    int pstate = pin->ReadState();
    if (pstate != pin->old_state)
    {
        pin->ticks = PIN_DEBOUNCE_TIME;
        pin->old_state = pstate;
    }
    else if (pin->ticks)
        pin->ticks--;
    return pin->ticks;
}

void test(void)
{
    debounce(&PinB0);
    debounce(&PinB1);
}


--------------------
Если бы я знал, что такое электричество...
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, 06:46
|- - rezident   Цитата(Илья_ @ Aug 20 2008, 12:46) Но гла...   Aug 20 2008, 15:29
|- - sergeeff   Цитата(Илья_ @ Aug 20 2008, 10:46) Уважае...   Aug 20 2008, 18:36
|- - Илья_   Уважаемые господа, sergeeff и rezident. То что у...   Aug 20 2008, 20:15
|- - 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


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

 


RSS Текстовая версия Сейчас: 21st June 2025 - 14:18
Рейтинг@Mail.ru


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