|
Не работает прибавление 1 к переменной при нажатии на кнопку |
|
|
|
May 9 2011, 06:05
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 34)
|
May 9 2011, 09:55
|
Участник

Группа: Участник
Сообщений: 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; } } }
|
|
|
|
|
May 9 2011, 12:18
|
    
Группа: Свой
Сообщений: 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. ...
|
|
|
|
|
May 9 2011, 14:08
|
Участник

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

|
Цитата Если не помешает правильно интерпретировать результаты экспериментов. Если будет не "0" - значит, реакция на кнопку есть. Цитата Вам нужно распознать не состояние кнопки, а изменение состояния. Вероятно, нужно сравнивать текущее состояние кнопки с предыдущим. А как? Так? Код if (!knopka_start) забавно: если убираю ";" после if, на индикаторе нет даже "1". Цитата Иногда интересует момент нажатия, иногда наоборот, иногда оба. да мне бай Боже добиться, чтобы МК реагировал на нажатие. Цитата И как вы узнаёте состояние time1, у вас отладчик? у меня к порту В подключен семисегментный индикатор.
|
|
|
|
|
May 9 2011, 15:10
|
Участник

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

|
Цитата Вся ваша программа - полное отсутствие понимания, чего вы хотите и что вы делаете. Может профессию поменять, пока не поздно? Чтобы абстрактно критиковать и отсылать в даташиты, достаточно найти на форуме вопрос. Для этого действительно ненадо много понимания.
|
|
|
|
|
May 9 2011, 15:30
|
    
Группа: Свой
Сообщений: 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". ';' в С - не просто закорючка. Сомневаюсь, что у кого-нить здесь хватит здоровья пересказывать Вам букварь по С.
|
|
|
|
|
May 9 2011, 16:02
|
Профессионал
    
Группа: Свой
Сообщений: 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]; // ГСЧ готов }
|
|
|
|
|
May 9 2011, 16:45
|
Участник

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

|
Цитата ';' в С - не просто закорючка. Сомневаюсь, что у кого-нить здесь хватит здоровья пересказывать Вам букварь по С. Спасибо, чего-чего, а "букварей" у меня хватает: Цитата Пустой оператор это специальный случай, состоящий только из точки с запятой (  . Пустой оператор ничего не делает, однако полезен в ситуациях, когда синтаксис 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
|
|
|
|
|
May 9 2011, 17:05
|
Профессионал
    
Группа: Свой
Сообщений: 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"? Вы можете адекватно это зафиксировать?
|
|
|
|
|
May 9 2011, 19:09
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(loghir @ May 9 2011, 20:45)  Спасибо, чего-чего, а "букварей" у меня хватает: Тогда угадайте, в чём разница между Код if(); {}; // и if() {}; Цитата Компилятор это, конечно, поправит, но смотрится некошерно. В (мелких) пиках в силу архитектурных особенностей комбинация Код const unsigned char arr_seg [10] ... // и foo = arr_seg [x3]; при выходе индекса массива за ... приводит к гораздо более чудесатым результатам.
|
|
|
|
|
May 10 2011, 13:23
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
May 10 2011, 14:10
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(loghir @ May 10 2011, 17:23)  Тут не гадать, а пробовать надо: в другом "букваре" нашел другое толкование для ";":
Ничего нового: зачем-то пишут книги с ошибками (или, в лучшем случае, с недосказанностями), народ за них платит неслабые деньги, и, эквигенитально, ничего не работает в программе. Вы у нас такой подкованный и начитанный! Любо-дорого смотреть. А чего же вы у нас тогда выпытываете? Ни хрена не работает видать? Я вам задаю совершенно простые и конкретные вопросы, чтобы вы смогли разобраться где накосячили. Реакции - ноль. Ну флаг в руки. Читайте дальше.
|
|
|
|
|
May 10 2011, 15:59
|
Участник

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

|
sergeeffЦитата Простой вопрос. Вы уверены, что можете заставить свой процессор прочитать значение на входе пина? При ненажатой кнопке вы читаете "1", а при нажатой "0"? Вы можете адекватно это зафиксировать? Прочитать не получается. Фиг с ним, с дребезгом! Хоть какое-то число на индикаторе получить бы, отличное от начального. Чтобы убедится, что МК реагирует на нажатие кнопки. Цитата А чего же вы у нас тогда выпытываете? Ни хрена не работает видать? Я вам задаю совершенно простые и конкретные вопросы, чтобы вы смогли разобраться где накосячили. Реакции - ноль. Ну флаг в руки. Читайте дальше. О том, что ничего не работает, я ясно писал в #16. Насчет цитат: а чего ждать в ответ на вопросы о скобках и точках с запятыми?! Или тут всерьез кто-то рассчитывает, что я за пару дней пойму, как использовать намеки? Есть закон: "Чтобы правильно задать вопрос, надо знать большую чать ответа." Я этого НЕ ЗНАЮ, если до кого-то еще не дошло. НЕТ у меня базовых знаний. Если жаба давит рабочим кодом поделится, просто ничего не пишите.
|
|
|
|
|
May 11 2011, 18:29
|
Участник

Группа: Участник
Сообщений: 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 только толку - ноль. В прямом смысле: зажегся и не меняется!
|
|
|
|
|
May 11 2011, 19:14
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Попробуйте простой тест: Код void main (void) { // начало main if (PORTA & 1) PORTB = arr_seg [0]; else PORTB = arr_seg [1]; } Первый раз запускаете при ненажатой кнопке, затем при нажатой.
|
|
|
|
|
May 11 2011, 20:22
|
    
Группа: Свой
Сообщений: 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, и будет Вам рабочий код, но без антидребезга (поэтому и было оно поименовано ГСЧ).
|
|
|
|
|
May 12 2011, 15:16
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
May 12 2011, 15:37
|
Профессионал
    
Группа: Свой
Сообщений: 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]; } Она должна работать в точности, как предыдущий тест.
|
|
|
|
|
May 12 2011, 16:04
|
    
Группа: Свой
Сообщений: 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 (в данном случае) и подставит число в нужное место.
|
|
|
|
|
May 12 2011, 16:08
|
Участник

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

|
Спасибо, уже убедился другим способом: Код if((RA0 == 0) && (DDF == 0)) работает хоть как ГСЧ, а Код if((knopka_prev == 0) && (DDF == 0)) нет. Судя по всему, не включается таймер. А еще панелька на собачнике разболталась... Пока отложу работу и займусь строкой конфигурации. Без панельки с защелкой не жизнь.
Сообщение отредактировал loghir - May 12 2011, 16:08
|
|
|
|
|
May 12 2011, 16:39
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(loghir @ May 12 2011, 20:08)  Судя по всему, не включается таймер Нет, вы удивительный человек! У вас knopka_prev в программе один раз получает значение равное RA0 (а это по умолчанию "1" при ненажатой кнопке) и дальше в бесконечном цикле вы это самое "1" упорно сравниваете с нулем. Вы можете с помощью своей собственной головы придумать алгоритм работы вашего устройства, изобразить на бумаге, и потом уже его (алгоритм) перевести на конструкции такого несложного языка как С? Или будете ждать, когда кто-нибудь из нас вам напишет готовую программу, которую вы не сможете запустить из-за плохой панельки? Вы не можете с опросом пинов разобраться, а уже лезете в таймер. ЧуднО все это.
|
|
|
|
|
May 12 2011, 17:36
|

Группа: Новичок
Сообщений: 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
|
|
|
|
|
May 17 2011, 09:49
|
Участник

Группа: Участник
Сообщений: 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... Было бы совсем просто.
|
|
|
|
|
May 17 2011, 10:13
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(loghir @ May 17 2011, 12:49)  Алгоритм давно готов, там ничего сложного. Приятно читать сообщения грамотного специалиста. Оказывается, ничего сложного нет и он все сам знал с самого начала (кто бы сомневался). Однако, несмотря на мелкие гнусности компиляторов, собственно микропроцессора, и иже с ними, подведем итоги: 1. Восемь дней (с 09.05 по 17.05) тю-тю. 2. Проблема удаления дребезга кнопок - осталась. 3. Работа над собственными ошибками - на "3-". И все это в программе <20 строк. На мой взляд, самое печальное, у автора так и не проклюнулся методически правильный подход к embedded программированию. Жаль (в основном собственного времени).
|
|
|
|
|
May 17 2011, 15:51
|
Участник

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

|
1. Со сборкой программатора (пардон, 3-х программаторов) и макетки у меня заняло 2 месяца. (А не 8 дней). Бывало хуже! Моих личных ошибок было немного, в отличие от кривых самоучителей и компиляторов. 2. Дребезг кнопок более не проблема. Правда, код слегка упростил. И таймеры работают как надо. Так что с моей точки зрения вы свое время не зря потратили. 3. Подход у каждого свой. Главное - результат. Оптимизация - дело опыта. Мне не впервые начинать чем-то заниматься с нуля. Один нюанс: при включении не горит индикатор. Если посадить на массу любую линию порта А, зажигается. "0", как и надо.
|
|
|
|
|
May 22 2011, 16:05
|
Участник

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

|
Если бы нюансы! Неправильные схемы включения индикаторов. Плюс плохой тип конденсаторов на кварце. Но самое интересное не это: перестал включаться таймер. Ну и антидребезг накрылся. P.S. Если бы сразу правильный код, я бы сосредоточился на поиске неисправностей в элентронике.
|
|
|
|
|
May 22 2011, 18:08
|
Участник

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

|
Цитата Вы предлагаете вам схемку на форуме спаять? Я скромнее: хватило бы правильного кода.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|