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

 
 
> Не работает прибавление 1 к переменной при нажатии на кнопку
loghir
сообщение May 9 2011, 06:05
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Доброго времени суток!
Всех с Днем Победы! Желаю чтобы агрессивные политики воевали только в парламентах по мордам друг друга!

биты конфигурации задаю вручную, RA0 сидит на +5В через резистор 4к7, кнопка на "массу", МК - pic16f72.
Срабатывание кнопки гарантировано доходит до RA0 (мерял на выводе). При "ручной" записи в порт через переменную индикация работает нормально.

Код
#include <pic.h>

#define knopka_start RA0
#define all_1 RC4
unsigned char time1 = 0;

void podgot (void)
{
ADCON1 = 0x07;
TRISA = 0b111111;
TRISB = 0b00000000;
TRISC = 0b00000000;
RBPU = 0;
PORTA = 0;
PORTB = 0b11111111;
PORTC = 0b11111111;
}

const unsigned char arr_seg [10] =
{
/* начало массива
0bABCDEFGH <– расположение сегментов по битам */
0b00000011, // «0» !
0b10011111, // «1» !
0b00100101, // «2» !
0b00001101, // «3» !
0b10011001, // «4» !
0b01001001, // «5» !
0b01000001, // «6» !
0b00011111, // «7» !
0b00000001, // «8» !
0b11110111, // «9» !
};

void main (void)
{
podgot();
all_1 = 0;
PORTB = arr_seg [time1];
if (knopka_start == 0);
{
time1 = time1 + 1;
}
}


Сообщение отредактировал loghir - May 9 2011, 06:05
Go to the top of the page
 
+Quote Post
3 страниц V   1 2 3 >  
Start new topic
Ответов (1 - 34)
V_G
сообщение May 9 2011, 07:21
Сообщение #2


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

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



А вы когда-нибудь программы для микроконтроллеров-то писали?
Где бесконечный цикл (у вас - ожидания нажатия кнопки)?
Где антидребезг?
Где отработка нажатия и отжатия кнопки?

Ваша программа запускается, 1 раз опрашивает порт, после чего уходит в никуда. Если за те микросекунды, что пройдут до первого (и единственного) опроса порта, вы не успеете нажать кнопку, то переменная time не проинкрементируется

Сообщение отредактировал V_G - May 9 2011, 07:22
Go to the top of the page
 
+Quote Post
loghir
сообщение May 9 2011, 09:55
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Цитата
Где бесконечный цикл (у вас - ожидания нажатия кнопки)?

Спасибо, добавил while(1)
Цитата
Где антидребезг?

не все сразу - дребезг экспериментам не помеха.
Цитата
Где отработка нажатия и отжатия кнопки?

отработку нажатия попытался реализовать так:
Код
if (knopka_start == 0);

а отжатие зачем как-то отрабатывать?

Код
void main (void)
{
podgot();
while(1)
{
time1 = 1;
all_1 = 0;
PORTB = arr_seg [time1];
if (knopka_start = 0);
{
time1 = time1 + 1;
}
}
}
Go to the top of the page
 
+Quote Post
xemul
сообщение May 9 2011, 12:18
Сообщение #4



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(loghir @ May 9 2011, 13:55) *
не все сразу - дребезг экспериментам не помеха.

Если не помешает правильно интерпретировать результаты экспериментов.
Цитата
отработку нажатия попытался реализовать так:
Код
if (knopka_start == 0)

Вам нужно распознать не состояние кнопки, а изменение состояния. Вероятно, нужно сравнивать текущее состояние кнопки с предыдущим. А отсюда и до анти-дребезга совсем рядом.
Цитата
а отжатие зачем как-то отрабатывать?

Дык разные бывают задачи. Иногда интересует момент нажатия, иногда наоборот, иногда оба.
Цитата
Код
...
PORTB = arr_seg [time1]; // и что получится при time1 >= 10 ?
if (knopka_start = 0); // '=' - оператор присваивания, '==' - оператор сравнения, ';' после ')' ну очень лишний
// результат '(knopka_start = 0)' - всегда false, а '(knopka_start = 123)' - всегда true.
...
Go to the top of the page
 
+Quote Post
V_G
сообщение May 9 2011, 12:19
Сообщение #5


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

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Отжатие совместно с антидребезгом надо отрабатывать для того, чтобы отработать последующие нажатия. В вашем варианте переменная проинкрементируется насколько тысяч (а не один) раз, пока будет нажата кнопка.
И как вы узнаёте состояние time1, у вас отладчик?
Go to the top of the page
 
+Quote Post
loghir
сообщение May 9 2011, 14:08
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Цитата
Если не помешает правильно интерпретировать результаты экспериментов.

Если будет не "0" - значит, реакция на кнопку есть.
Цитата
Вам нужно распознать не состояние кнопки, а изменение состояния. Вероятно, нужно сравнивать текущее состояние кнопки с предыдущим.

А как? Так?
Код
if (!knopka_start)

забавно: если убираю ";" после if, на индикаторе нет даже "1".
Цитата
Иногда интересует момент нажатия, иногда наоборот, иногда оба.

да мне бай Боже добиться, чтобы МК реагировал на нажатие.
Цитата
И как вы узнаёте состояние time1, у вас отладчик?

у меня к порту В подключен семисегментный индикатор.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 9 2011, 14:25
Сообщение #7


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

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



Цитата(loghir @ May 9 2011, 18:08) *
забавно: если убираю ";" после if, на индикаторе нет даже "1".


Вся ваша программа - полное отсутствие понимания, чего вы хотите и что вы делаете. Может профессию поменять, пока не поздно?
Go to the top of the page
 
+Quote Post
loghir
сообщение May 9 2011, 15:10
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Цитата
Вся ваша программа - полное отсутствие понимания, чего вы хотите и что вы делаете. Может профессию поменять, пока не поздно?

Чтобы абстрактно критиковать и отсылать в даташиты, достаточно найти на форуме вопрос. Для этого действительно ненадо много понимания.
Go to the top of the page
 
+Quote Post
xemul
сообщение May 9 2011, 15:30
Сообщение #9



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(loghir @ May 9 2011, 18:08) *
Если будет не "0" - значит, реакция на кнопку есть.

Я думал, Вам нужен осмысленный результат, а не генератор случайных чисел.
Цитата
А как? Так?
Код
if (!knopka_start)

Не помню, поддерживает ли писс8.05 тип bit, но как-то так:
Код
bit knopka_prev; // переменная для запоминания состояния кнопки
// переменная, объявленная здесь, является глобальной
// поэтому здесь "unsigned char time1 = 0;" == "unsigned char time1;"

void main(void)
{
...
   time1 = 1;
   PORTB = arr_seg [time1];
   knopka_prev = knopka_start; // присваиваем текущее значение

   for(;;) // или while(1), если оно Вам симпатичнее
   {
      if(knopka_prev != knopka_start) // если сохранённое состояние кнопки отличается от текущего
      {
         knopka_prev ^= 1; // изменим сохранённое состояние (так будет короче и корректнее, чем knopka_prev = knopka_start;)
         if(!knopka_prev) // в Вашей схеме 0 == кнопка нажата; при таком условии будет отрабатываться нажатие
//         if(knopka_prev) // а при таком - отпускание
         {
            time1++;
            PORTB = arr_seg [time1];  // ГСЧ готов
         }
      }
   }
}

Цитата
забавно: если убираю ";" после if, на индикаторе нет даже "1".

';' в С - не просто закорючка. Сомневаюсь, что у кого-нить здесь хватит здоровья пересказывать Вам букварь по С.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 9 2011, 16:02
Сообщение #10


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

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



Цитата(loghir @ May 9 2011, 19:10) *
Чтобы абстрактно критиковать и отсылать в даташиты, достаточно найти на форуме вопрос. Для этого действительно ненадо много понимания.


Я вас куда подальше (в даташиты) не посылал. Хотите конкретную критику, пожалуйста. Парочку, на вскидку.
Индекс массива в С начинается с 0. Посему начальное значение time1 = 0;

Чтобы из массива arr_seg по индексу читать что-то осмысленное, надо проверять, не вышел ли индекс за границы массива. Например:

Код
        {
            time1++;
            if (time >= sizeof(arr_seg)/sizeof(arr_seg[0]))
                time1 = 0;
            PORTB = arr_seg [time1];  // ГСЧ готов
         }
Go to the top of the page
 
+Quote Post
loghir
сообщение May 9 2011, 16:45
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Цитата
';' в С - не просто закорючка. Сомневаюсь, что у кого-нить здесь хватит здоровья пересказывать Вам букварь по С.

Спасибо, чего-чего, а "букварей" у меня хватает:
Цитата
Пустой оператор это специальный случай, состоящий только из точки с запятой (wink.gif. Пустой оператор ничего не делает, однако полезен в ситуациях, когда синтаксис mikroC требует наличия оператора, а программе в этом месте ничего делать не требуется. Например, пустой оператор обычно используется в ”холостых” циклах:

Цитата
Не помню, поддерживает ли писс8.05 тип bit

по мануалу, вроде да. Но я нарывался на несоответствующий версии проги мануал.
Цитата
HI-TECH PICCsupports bit integral types which can hold the values 0 or 1. Single bit variables
may be declared using the keyword bit. bit objects declared within a function, for example:
static bit init_flag;
will be allocated in the bit-addressable psect rbit, and will be visible only in that function. When
the following declaration is used outside any function:
bit init_flag;
init_flag will be globally visible, but located within the same psect.

Попробовал - компилятор не подавился кодом
Код
bit knopka_prev;

Спасибо, буду пробовать остальное.
Цитата
Чтобы из массива arr_seg по индексу читать что-то осмысленное, надо проверять, не вышел ли индекс за границы массива.

Да мне бы заставить МК реагировать на нажатие кнопки! (о чем в названии топика и говорилось)
А в пределах массива удержать просто:
Код
if (time1 > 9)
{
time1 = 0;
time2 = time2++;
}

ну и так далее на все 4 разряда.

Сообщение отредактировал loghir - May 9 2011, 16:53
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 9 2011, 17:05
Сообщение #12


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

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



Цитата(loghir @ May 9 2011, 20:45) *
Спасибо, чего-чего, а "букварей" у меня хватает:


по мануалу, вроде да. Но я нарывался на несоответствующий версии проги мануал.

Попробовал - компилятор не подавился кодом
Код
bit knopka_prev;

Спасибо, буду пробовать остальное.

Да мне бы заставить МК реагировать на нажатие кнопки! (о чем в названии топика и говорилось)
А в пределах массива удержать просто:
Код
if (time1 > 9)
{
time1 = 0;
time2 = time2++;
}

ну и так далее на все 4 разряда.


Простой вопрос. Вы уверены, что можете заставить свой процессор прочитать значение на входе пина?

При ненажатой кнопке вы читаете "1", а при нажатой "0"? Вы можете адекватно это зафиксировать?
Go to the top of the page
 
+Quote Post
xemul
сообщение May 9 2011, 19:09
Сообщение #13



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(loghir @ May 9 2011, 20:45) *
Спасибо, чего-чего, а "букварей" у меня хватает:

Тогда угадайте, в чём разница между
Код
if();
{};
// и
if()
{};

Цитата
Код
time2 = time2++;

Компилятор это, конечно, поправит, но смотрится некошерно.

В (мелких) пиках в силу архитектурных особенностей комбинация
Код
const unsigned char arr_seg [10] ...
// и
foo = arr_seg [x3];

при выходе индекса массива за ... приводит к гораздо более чудесатым результатам.
Go to the top of the page
 
+Quote Post
V_G
сообщение May 9 2011, 23:19
Сообщение #14


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

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(xemul @ May 10 2011, 06:09) *
Тогда угадайте, в чём разница между
Код
if();
{};
// и
if()
{};


Присоединяюсь к вопросу к ТС. Лучше самому догадаться, хотя бы с помощью букварей, чем мы вам тут все разжуем и в рот положим, а вы и не поймете, что съели, и съели ли.
Go to the top of the page
 
+Quote Post
loghir
сообщение May 10 2011, 13:23
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Тут не гадать, а пробовать надо: в другом "букваре" нашел другое толкование для ";":
Цитата
Точка с запятой ";" - это ограничитель оператора. Любое допустимое в Си выражение (включая пустое) завершенное точкой с запятой интепретируется как оператор, называемый еще оператором выражения. Выражение вычисляется и его значение пропадает. Если выражение не имеет побочных эффектов, mikroC может игнорировать его.

Ничего нового: зачем-то пишут книги с ошибками (или, в лучшем случае, с недосказанностями), народ за них платит
неслабые деньги, и, эквигенитально, ничего не работает в программе.
if(); - в примерах кода ";" после "if()" не встречается.
А про
Код
if()
{};

прямо написано, что так писать код нельзя.

Теперь о практике:
Код
time2 = time2++;

Ну, я на знание кашрута не претендую. Рано! Обычно пишу
Код
time2 = time2 + 1;

мне так понятнее.

И строку
Код
knopka_prev ^= 1; // изменим сохранённое состояние
               // (так будет короче и корректнее, чем knopka_prev = knopka_start;)

мне понятнее написать как
Код
knopka_prev = knopka_prev ^ 1; // если knopka_prev = 1, возвращает 0; если knopka_prev = 0, возвращает 1.


Сообщение отредактировал loghir - May 10 2011, 13:24
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 10 2011, 14:10
Сообщение #16


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

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



Цитата(loghir @ May 10 2011, 17:23) *
Тут не гадать, а пробовать надо: в другом "букваре" нашел другое толкование для ";":

Ничего нового: зачем-то пишут книги с ошибками (или, в лучшем случае, с недосказанностями), народ за них платит
неслабые деньги, и, эквигенитально, ничего не работает в программе.


Вы у нас такой подкованный и начитанный! Любо-дорого смотреть.

А чего же вы у нас тогда выпытываете? Ни хрена не работает видать? Я вам задаю совершенно простые и конкретные вопросы, чтобы вы смогли разобраться где накосячили. Реакции - ноль. Ну флаг в руки. Читайте дальше.
Go to the top of the page
 
+Quote Post
loghir
сообщение May 10 2011, 15:59
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



sergeeff
Цитата
Простой вопрос. Вы уверены, что можете заставить свой процессор прочитать значение на входе пина?
При ненажатой кнопке вы читаете "1", а при нажатой "0"? Вы можете адекватно это зафиксировать?

Прочитать не получается. Фиг с ним, с дребезгом! Хоть какое-то число на индикаторе получить бы, отличное от начального.
Чтобы убедится, что МК реагирует на нажатие кнопки.

Цитата
А чего же вы у нас тогда выпытываете? Ни хрена не работает видать? Я вам задаю совершенно простые и конкретные вопросы, чтобы вы смогли разобраться где накосячили. Реакции - ноль. Ну флаг в руки. Читайте дальше.

О том, что ничего не работает, я ясно писал в #16. Насчет цитат: а чего ждать в ответ на вопросы о скобках и точках с запятыми?! Или тут всерьез кто-то рассчитывает, что я за пару дней пойму, как использовать намеки?
Есть закон: "Чтобы правильно задать вопрос, надо знать большую чать ответа." Я этого НЕ ЗНАЮ, если до кого-то еще не дошло. НЕТ у меня базовых знаний. Если жаба давит рабочим кодом поделится, просто ничего не пишите.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 10 2011, 17:10
Сообщение #18


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

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



Цитата(loghir @ May 10 2011, 19:59) *
Прочитать не получается.


Вот видите, вы получили внятный ответ на свои проблемы - нет чтения входного пина. Осталось понять почему. Ответ, скорее всего (я PIC'ами никогда не занимался и не хочу) в том, что где-то надо установить соответствующий режим для пина. Tак как у PIC'ов ног мало, а функций и переферии относительно много, каждая нога может быть по разному переопределена. Ясно где дальше копать?

Кстати, что за компилятор пользуете?
Go to the top of the page
 
+Quote Post
loghir
сообщение May 11 2011, 18:29
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Цитата
Tак как у PIC'ов ног мало, а функций и переферии относительно много, каждая нога может быть по разному переопределена. Ясно где дальше копать?

Спасибо за подмказку, но этим уже озаботился: http://electronix.ru/forum/index.php?showtopic=89769
команда
Код
ADCON1 = 0x07;

отключает АЦП. Вывод работает как линия порта, я проверял.
Цитата
Кстати, что за компилятор пользуете?

PICC 8.05pl2 из MPLAB IDE 8.30

Я тут наваял код:
Код
...
bit DDF = 0;             // переменная "защелка", чтобы на счетчик прошел только один "0".
bit knopka_prev = 0;     // переменная для запоминания состояния кнопки
...
void init (void) // настройка TMR1 для 0.3 сек
{
// Prescaler=1:2; TMR1 Preset=0; Freq=30,51758Hz; Period=32 768 000 ns
GIE = 1;         // разрешены все немаскированные прерывания
// регистр T1CON
T1CKPS1 = 0;    // выбор коэфф. деления предделителя
T1CKPS0 = 1;    // выбор коэфф. деления предделителя
T1OSCEN = 1;    // выключить внутренний тактовый генератор модуля TMR1
TMR1CS  = 1;    // 1 - выбран внешний (0 - внутренний, Fosk/4) источник тактового сигнала модуля TMR1
TMR1H = 0x0;     // preset for timer1 MSB register
TMR1L = 0x0;     // preset for timer1 LSB register
}

void main (void)
{ // начало main
podgot();
all_1 = 0;
PORTB = arr_seg [time1];
knopka_prev = knopka_start; // значения "knopka_start" присваиваются "knopka_prev".
for(;;)
{ // начало бесконечного цикла
if((knopka_prev == 0) && (DDF == 0))  
    {
    DDF = 1; // активируем "защелку", чтобы на счетчик прошел только один "0".
    time1 = time1 + 1;
    PORTB = arr_seg [time1];
        while (DDF = 1) // выполняется пока величина () не станет ложной.
        {
        TMR1ON  = 1; // включить TMR1
        if (TMR2IF == 1) // ожидание появления флага прерывания по переполнению TMR1
            {
            TMR1ON  = 0; // выключить TMR1
            TMR2IF = 0;  // сброс флага прерывания по переполнению TMR1
            DDF = 0;     // условие для следующего срабатывания кнопки
            time1 = time1 + 1;
            PORTB = arr_seg [time1];
            }
        }
    }
} // конец бесконечного цикла
} // конец main

только толку - ноль. В прямом смысле: зажегся и не меняется!
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 11 2011, 19:14
Сообщение #20


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

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



Попробуйте простой тест:

Код
void main (void)
{ // начало main
if (PORTA & 1)
   PORTB = arr_seg [0];
else
   PORTB = arr_seg [1];
}


Первый раз запускаете при ненажатой кнопке, затем при нажатой.
Go to the top of the page
 
+Quote Post
xemul
сообщение May 11 2011, 20:22
Сообщение #21



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(loghir @ May 11 2011, 22:29) *
Я тут наваял код:
...
только толку - ноль. В прямом смысле: зажегся и не меняется!

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

Объясните, плз:
- с какой целью Вы задействовали TMR1?
- почему проверяете TMR2IF?
- где, по Вашему мнению, в цикле выполняется проверка кнопки?
- (ышо раз) чем отличается "while (DDF = 1)" от "while (DDF == 1)", и к каким последствиям приводит "while (DDF = 1)" в Вашей программе?

Пока Вы не ответите (хотя бы самому себе) на эти вопросы, двинуться дальше, имхо, не получится.

По поводу "рабочего кода": добавьте к рыбе в посте #9 свою инициализацию из исходной программы (не счёл нужным её повторять или править несуразности, не влияющие на скорость полёта) и проверку индекса массива, предложенную sergeeff, и будет Вам рабочий код, но без антидребезга (поэтому и было оно поименовано ГСЧ).
Go to the top of the page
 
+Quote Post
loghir
сообщение May 12 2011, 15:16
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Проверил код
Код
void main (void)
{
podgot();
RC4 = 0;
if (PORTA & 1)
PORTB = arr_seg [0];
else
PORTB = arr_seg [1];
}

при отпущенной кнопке на индикаторе 0, при нажатой - 1.
т.е.
Код
ADCON1 = 0x07;

работает как ожидалось.
Цитата
- с какой целью Вы задействовали TMR1?

после прохождения единственного "0" при нажатии, на отпускание кнопки я выделил 0.3 с.
Именно это время отсчитывает TMR1.
Цитата
- почему проверяете TMR2IF?

да, это не флаг по переполнению TMR1. Спасибо за подсказку!
Цитата
- где, по Вашему мнению, в цикле выполняется проверка кнопки?

командой
Код
if((knopka_prev == 0) && (DDF == 0))

Цитата
чем отличается "while (DDF = 1)" от "while (DDF == 1)", и к каким последствиям приводит "while (DDF = 1)"

"=" - используется в операции присваивания
"==" - операция отношения используются для проверки равенства и неравенства выражений. По логике, надо "while (DDF == 1)"

Цитата
добавьте к рыбе в посте #9 свою инициализацию из исходной программы (не счёл нужным её повторять или править несуразности, не влияющие на скорость полёта) и проверку индекса массива, предложенную sergeeff, и будет Вам рабочий код,

а менее универсально, но проще можно?
Код
if (time1 > 9)
{
time1 = 0;
}


Сообщение отредактировал loghir - May 12 2011, 15:28
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 12 2011, 15:37
Сообщение #23


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

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



Код
if((knopka_prev == 0) && (DDF == 0))


ни хрена не проверяет состояние кнопки в цикле. Так как knopka_prev с портом PORTA никаким боком не связана.

У вас через define объявлена knopka_start как RA0. Чтобы убедиться, что эта конструкция в вашем компилятора функционирует, пишем еще один короткий тест:

Код
void main (void)
{
podgot();
RC4 = 0;
if (knopka_start)
   PORTB = arr_seg [0];
else
    PORTB = arr_seg [1];
}


Она должна работать в точности, как предыдущий тест.
Go to the top of the page
 
+Quote Post
xemul
сообщение May 12 2011, 16:04
Сообщение #24



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(loghir @ May 12 2011, 19:16) *
после прохождения единственного "0" при нажатии, на отпускание кнопки я выделил 0.3 с.
Именно это время отсчитывает TMR1.

Борьба с дребезгом? В конфе на эту тему понаписато...
Цитата
"=" - используется в операции присваивания
"==" - операция отношения используются для проверки равенства и неравенства выражений. По логике, надо "while (DDF == 1)"

"==" - для проверки равенства, для неравенства "!=".
А посредством "while (DDF = 1)" Вы организовали ещё один бесконечный цикл. Симулятор МПЛаба Вам легко это показал бы (уж коль Вы ассемблер не любите).
Цитата
а менее универсально, но проще можно?
Код
if (time1 > 9)
{
time1 = 0;
}

Можно. Но вдруг Вам потом захочется 0..F отображать, или, наоборот, 0..3?
В "sizeof(arr_seg)/sizeof(arr_seg[0])" две константы, известные при компиляции, препроцессор С сосчитает до 10 (в данном случае) и подставит число в нужное место.
Go to the top of the page
 
+Quote Post
loghir
сообщение May 12 2011, 16:08
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Спасибо, уже убедился другим способом:
Код
if((RA0 == 0) && (DDF == 0))

работает хоть как ГСЧ, а
Код
if((knopka_prev == 0) && (DDF == 0))

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

Сообщение отредактировал loghir - May 12 2011, 16:08
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 12 2011, 16:39
Сообщение #26


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

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



Цитата(loghir @ May 12 2011, 20:08) *
Судя по всему, не включается таймер


Нет, вы удивительный человек! У вас knopka_prev в программе один раз получает значение равное RA0 (а это по умолчанию "1" при ненажатой кнопке) и дальше в бесконечном цикле вы это самое "1" упорно сравниваете с нулем.

Вы можете с помощью своей собственной головы придумать алгоритм работы вашего устройства, изобразить на бумаге, и потом уже его (алгоритм) перевести на конструкции такого несложного языка как С? Или будете ждать, когда кто-нибудь из нас вам напишет готовую программу, которую вы не сможете запустить из-за плохой панельки?

Вы не можете с опросом пинов разобраться, а уже лезете в таймер. ЧуднО все это.
Go to the top of the page
 
+Quote Post
RunneR2
сообщение May 12 2011, 17:36
Сообщение #27





Группа: Новичок
Сообщений: 6
Регистрация: 6-11-10
Из: Рязань
Пользователь №: 60 691



Раз не работает с переобъявлением ноги, попробуйте напрямую
незнаю что у вас за компилятор, но на мплаб с30 выглядело бы както так


CODE
void main(void)
{

while(1)
{

if (PORTAbits.RA0 == 0)
{
time1++;
}

}


}


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

CODE
void main(void)
{

while(1)
{

if (_RA0 == 0)
{
time1++;
}

}


}

И я в вашем коде чето не вижу подключения заголовочного файла вашего пика, или не требуется?

Сообщение отредактировал RunneR2 - May 12 2011, 17:37
Go to the top of the page
 
+Quote Post
loghir
сообщение May 17 2011, 09:49
Сообщение #28


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Цитата
незнаю что у вас за компилятор,

PICC 8.05pl2
Цитата
И я в вашем коде чето не вижу подключения заголовочного файла вашего пика, или не требуется?

в #1. (Не повторять же весь код.)
RunneR2, спасибо, но ваш код не спасает от дребезга контактов.

Цитата
У вас knopka_prev в программе один раз получает значение равное RA0 (а это по умолчанию "1" при ненажатой кнопке) и дальше в бесконечном цикле вы это самое "1" упорно сравниваете с нулем.

Теперь я напрямую обращаюсь к линиям портов. (Глюки компилятора с именами потом разгребу.)
В #19 у меня было лишнее увеличение time1. Конечно сравниваю с нулем, ведь при нажатой кнопке у меня ноль.
Код
for(;;)
{

if((RA0 == 0) && (DDF == 0))  
    {
    DDF = 1; // активируем "защелку", чтобы на счетчик прошел только один "0".
    time1 = time1 + 1;
    if (time1 > 9) // чтобы "time1" не вышла за пределы массива
        {
        time1 = 0;
        }
    PORTB = arr_seg [time1];
    TMR1ON  = 1; // включить TMR1
        while (DDF == 1) // выполняется пока величина () не станет ложной (не переполнится TMR1)
        {
            if (TMR1IF == 1) // ожидание появления флага прерывания по переполнению TMR1
            {
            TMR1ON  = 0; // выключить TMR1
            TMR1IF = 0;  // сброс флага прерывания по переполнению TMR1
            DDF = 0;     // условие для следующего срабатывания кнопки
            }
        }
    }
}
}

Цитата
Вы можете с помощью своей собственной головы придумать алгоритм работы вашего устройства, изобразить на бумаге, и потом уже его (алгоритм) перевести на конструкции такого несложного языка как С? Или будете ждать, когда кто-нибудь из нас вам напишет готовую программу, которую вы не сможете запустить из-за плохой панельки?

Алгоритм давно готов, там ничего сложного. А панельку с нулевым усилием я 2 недели искал, еле нашел. Сами знаете - временный неконтакт - хуже нет неисправности. Отловил только тогда, когда он совсем пропал. Программу я не прошу писать, только подсказать некоторые моменты.
Цитата
Вы не можете с опросом пинов разобраться, а уже лезете в таймер. ЧуднО все это.

Уже разобрался. Если бы не глюк компилятора с именами, давно бы разобрался. А что такого сложного в таймере? Если бы в даташите для примера написали бы, что при 1:8 будет частота 1.90735... Было бы совсем просто.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 17 2011, 10:13
Сообщение #29


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

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



Цитата(loghir @ May 17 2011, 12:49) *
Алгоритм давно готов, там ничего сложного.


Приятно читать сообщения грамотного специалиста. Оказывается, ничего сложного нет и он все сам знал с самого начала (кто бы сомневался). Однако, несмотря на мелкие гнусности компиляторов, собственно микропроцессора, и иже с ними, подведем итоги:

1. Восемь дней (с 09.05 по 17.05) тю-тю.
2. Проблема удаления дребезга кнопок - осталась.
3. Работа над собственными ошибками - на "3-".

И все это в программе <20 строк.

На мой взляд, самое печальное, у автора так и не проклюнулся методически правильный подход к embedded программированию. Жаль (в основном собственного времени).
Go to the top of the page
 
+Quote Post
loghir
сообщение May 17 2011, 15:51
Сообщение #30


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



1. Со сборкой программатора (пардон, 3-х программаторов) и макетки у меня заняло 2 месяца. (А не 8 дней). Бывало хуже! Моих личных ошибок было немного, в отличие от кривых самоучителей и компиляторов.
2. Дребезг кнопок более не проблема. Правда, код слегка упростил. И таймеры работают как надо. Так что с моей точки зрения вы свое время не зря потратили.
3. Подход у каждого свой. Главное - результат. Оптимизация - дело опыта. Мне не впервые начинать чем-то заниматься с нуля.
Один нюанс: при включении не горит индикатор. Если посадить на массу любую линию порта А, зажигается. "0", как и надо.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 17 2011, 16:42
Сообщение #31


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

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



Цитата(loghir @ May 17 2011, 18:51) *
Один нюанс: при включении не горит индикатор.


Вся жизнь состоит из нюансов.... Вот еще один вылез. Теперь уж сам давай результат на гора!
Go to the top of the page
 
+Quote Post
loghir
сообщение May 22 2011, 16:05
Сообщение #32


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Если бы нюансы! Неправильные схемы включения индикаторов. Плюс плохой тип конденсаторов на кварце.
Но самое интересное не это: перестал включаться таймер. Ну и антидребезг накрылся.
P.S. Если бы сразу правильный код, я бы сосредоточился на поиске неисправностей в элентронике.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 22 2011, 16:08
Сообщение #33


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

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



Цитата(loghir @ May 22 2011, 20:05) *
Если бы нюансы! Неправильные схемы включения индикаторов. Плюс плохой тип конденсаторов на кварце.
Но самое интересное не это: перестал включаться таймер. Ну и антидребезг накрылся.
P.S. Если бы сразу правильный код, я бы сосредоточился на поиске неисправностей в элентронике.


Вы предлагаете вам схемку на форуме спаять?
Go to the top of the page
 
+Quote Post
loghir
сообщение May 22 2011, 18:08
Сообщение #34


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Цитата
Вы предлагаете вам схемку на форуме спаять?

Я скромнее: хватило бы правильного кода.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 22 2011, 19:39
Сообщение #35


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

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



Цитата(loghir @ May 22 2011, 22:08) *
Я скромнее: хватило бы правильного кода.


Тяга к халяве просто неискоренима. Не уж то самому не хочется одержать хоть маленькую, но собственноручно выстраданную победу? Тем более, что большая часть дороги пройдена?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 15:05
Рейтинг@Mail.ru


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