Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не работает прибавление 1 к переменной при нажатии на кнопку
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
loghir
Доброго времени суток!
Всех с Днем Победы! Желаю чтобы агрессивные политики воевали только в парламентах по мордам друг друга!

биты конфигурации задаю вручную, 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;
}
}
V_G
А вы когда-нибудь программы для микроконтроллеров-то писали?
Где бесконечный цикл (у вас - ожидания нажатия кнопки)?
Где антидребезг?
Где отработка нажатия и отжатия кнопки?

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

Спасибо, добавил 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;
}
}
}
xemul
Цитата(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.
...
V_G
Отжатие совместно с антидребезгом надо отрабатывать для того, чтобы отработать последующие нажатия. В вашем варианте переменная проинкрементируется насколько тысяч (а не один) раз, пока будет нажата кнопка.
И как вы узнаёте состояние time1, у вас отладчик?
loghir
Цитата
Если не помешает правильно интерпретировать результаты экспериментов.

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

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

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

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

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


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

Чтобы абстрактно критиковать и отсылать в даташиты, достаточно найти на форуме вопрос. Для этого действительно ненадо много понимания.
xemul
Цитата(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".

';' в С - не просто закорючка. Сомневаюсь, что у кого-нить здесь хватит здоровья пересказывать Вам букварь по С.
sergeeff
Цитата(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];  // ГСЧ готов
         }
loghir
Цитата
';' в С - не просто закорючка. Сомневаюсь, что у кого-нить здесь хватит здоровья пересказывать Вам букварь по С.

Спасибо, чего-чего, а "букварей" у меня хватает:
Цитата
Пустой оператор это специальный случай, состоящий только из точки с запятой (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 разряда.
sergeeff
Цитата(loghir @ May 9 2011, 20:45) *
Спасибо, чего-чего, а "букварей" у меня хватает:


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

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

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

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

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


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

При ненажатой кнопке вы читаете "1", а при нажатой "0"? Вы можете адекватно это зафиксировать?
xemul
Цитата(loghir @ May 9 2011, 20:45) *
Спасибо, чего-чего, а "букварей" у меня хватает:

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

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

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

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

при выходе индекса массива за ... приводит к гораздо более чудесатым результатам.
V_G
Цитата(xemul @ May 10 2011, 06:09) *
Тогда угадайте, в чём разница между
Код
if();
{};
// и
if()
{};


Присоединяюсь к вопросу к ТС. Лучше самому догадаться, хотя бы с помощью букварей, чем мы вам тут все разжуем и в рот положим, а вы и не поймете, что съели, и съели ли.
loghir
Тут не гадать, а пробовать надо: в другом "букваре" нашел другое толкование для ";":
Цитата
Точка с запятой ";" - это ограничитель оператора. Любое допустимое в Си выражение (включая пустое) завершенное точкой с запятой интепретируется как оператор, называемый еще оператором выражения. Выражение вычисляется и его значение пропадает. Если выражение не имеет побочных эффектов, 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.
sergeeff
Цитата(loghir @ May 10 2011, 17:23) *
Тут не гадать, а пробовать надо: в другом "букваре" нашел другое толкование для ";":

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


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

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

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

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

О том, что ничего не работает, я ясно писал в #16. Насчет цитат: а чего ждать в ответ на вопросы о скобках и точках с запятыми?! Или тут всерьез кто-то рассчитывает, что я за пару дней пойму, как использовать намеки?
Есть закон: "Чтобы правильно задать вопрос, надо знать большую чать ответа." Я этого НЕ ЗНАЮ, если до кого-то еще не дошло. НЕТ у меня базовых знаний. Если жаба давит рабочим кодом поделится, просто ничего не пишите.
sergeeff
Цитата(loghir @ May 10 2011, 19:59) *
Прочитать не получается.


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

Кстати, что за компилятор пользуете?
loghir
Цитата
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

только толку - ноль. В прямом смысле: зажегся и не меняется!
sergeeff
Попробуйте простой тест:

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


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

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

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

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

По поводу "рабочего кода": добавьте к рыбе в посте #9 свою инициализацию из исходной программы (не счёл нужным её повторять или править несуразности, не влияющие на скорость полёта) и проверку индекса массива, предложенную sergeeff, и будет Вам рабочий код, но без антидребезга (поэтому и было оно поименовано ГСЧ).
loghir
Проверил код
Код
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;
}
sergeeff
Код
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];
}


Она должна работать в точности, как предыдущий тест.
xemul
Цитата(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 (в данном случае) и подставит число в нужное место.
loghir
Спасибо, уже убедился другим способом:
Код
if((RA0 == 0) && (DDF == 0))

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

нет.
Судя по всему, не включается таймер. А еще панелька на собачнике разболталась... Пока отложу работу и займусь строкой конфигурации.
Без панельки с защелкой не жизнь.
sergeeff
Цитата(loghir @ May 12 2011, 20:08) *
Судя по всему, не включается таймер


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

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

Вы не можете с опросом пинов разобраться, а уже лезете в таймер. ЧуднО все это.
RunneR2
Раз не работает с переобъявлением ноги, попробуйте напрямую
незнаю что у вас за компилятор, но на мплаб с30 выглядело бы както так


CODE
void main(void)
{

while(1)
{

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

}


}


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

CODE
void main(void)
{

while(1)
{

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

}


}

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

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... Было бы совсем просто.
sergeeff
Цитата(loghir @ May 17 2011, 12:49) *
Алгоритм давно готов, там ничего сложного.


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

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

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

На мой взляд, самое печальное, у автора так и не проклюнулся методически правильный подход к embedded программированию. Жаль (в основном собственного времени).
loghir
1. Со сборкой программатора (пардон, 3-х программаторов) и макетки у меня заняло 2 месяца. (А не 8 дней). Бывало хуже! Моих личных ошибок было немного, в отличие от кривых самоучителей и компиляторов.
2. Дребезг кнопок более не проблема. Правда, код слегка упростил. И таймеры работают как надо. Так что с моей точки зрения вы свое время не зря потратили.
3. Подход у каждого свой. Главное - результат. Оптимизация - дело опыта. Мне не впервые начинать чем-то заниматься с нуля.
Один нюанс: при включении не горит индикатор. Если посадить на массу любую линию порта А, зажигается. "0", как и надо.
sergeeff
Цитата(loghir @ May 17 2011, 18:51) *
Один нюанс: при включении не горит индикатор.


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


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

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


Тяга к халяве просто неискоренима. Не уж то самому не хочется одержать хоть маленькую, но собственноручно выстраданную победу? Тем более, что большая часть дороги пройдена?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.