Свежие обсуждения
Микроконтроллеры

Начинающим pic16f Си HiTech 9.50 pl 2

1 10 11

ОК!

 

urry растолкуй пожалуйста назначение этих строк:
1. #define perehod() {NOP();NOP();NOP();NOP();}
особенно скобок и тех и тех.
2. PORTB=arr1[temp]+start;
массив, а как temp, и +start - это флаг?
он обьявлен в начале как бит.
3. min=eeprom_read(1);
seku=eeprom_read(2);
вроди никто никуда не писал.
Извини за такие вопрсы, но учусь.

 

1. NOP() - В Си применяются некоторые ассемблерные команды, например - команда сброса сторожевого таймера , задержка на пустой цикл и пр...
Чтобы не писать каждый раз
#asm
nop
#endasm
эти команды в самом компиляторе "забиты" как специальные операторы например, в данном случае NOP() - так и пишется, CLRWDT(); - сброс собаки.
Прочитать регистр в аккумулятор (для сброса флага) например, для регистра RCREG - RCREG();
Через дефайн мы определили макрос задержки - пару микросекунд. Она (задержка) нужна для того, чтобы после импульса выдачи (если кнопка нажата) входной конденсатор на ножке мк успел зарядиться .
2 Да , бит, младший бит идет на включение нагрузки - если признак старта есть, то в младший разряд порта В запишется 1, иначе 0.
3. при каждом нажатии кнопки старт значение записывается в епром, досчитал счетчик до 0, читается ранее записанное в епром значение снова (удобно, если нужно повтор той же задержки, что была перед этим).

 

ОК. Благодарю.Но не успокоюсь.
arr1[temp], а как здесь?
Массив, как здесь мы получим образ именно нужного числа?
И опять не буду молчать.
А зачем писать четыре раза подряд NOP()?

 

они идут подряд - образ нуля - нулевой адрес массива, единицы - первый и так далее.
А чтобы задержка больше была. Может, и мало - железо покажет.

 

А компилятор поставляет сразу 4? Тфу.
Ну как АСМе:
NOP
NOP
NOP
NOP
ОНО?
То, что образы цифир идут подрят я понимаю, меня сбило, что вместо [16] стоит [temp].

 

оно. существуют так называемые inline - функции, которые не оптимизируются компилятором - и он не может вырезать их код, как ничего не делающий.
чуть подробнее здесь - о инлайновых функциях и макросах
http://www.remexpert.com/ipb/index.php?automodule=blog&blogid=14&showent...

 

urry, огромное спасибо, очень ценная информация.

 

urry, приветствую.
Возникли еще пару вопросов:
Не могу допетрить, а зачем нужен caunt_m и его флаг - m_mc, если я правильно понял,
если в прерывании выставляются флаги кнопок vpravo и vlevo?
И второй, а как закрутить чтобы получить эти кнопки вправо и влево многофункциональными?
Вводить какие-то счетчики? Первое нажатие левой чтобы дало прерывистую индикацию
минут, а потом ими-же двумя делать установку. Первое нажатие правой - моргачку секунд
и тоже потом установки двумя кнопками. потому как не удобно долго ждать установок
минут через секунды, даже в ускоренном режиме.
Да, отсюда выплывает, что прийдется наверное кнопкой старт делать запись в ЕЕПРОМ,
во накручивается.
Направь пожалуйста на путь истинный.

 

1.m_mc - флаг 100 - милисекундной метки, "тормоз", чтобы при нажатии кнопки информация не менялась очень быстро. Кнопки вправо и влево анализируются на короткое и длинное нажатие - если переполняется счетчик скорости counter_speed_l, например, (долго держали кнопку), то задержка на изменение значения одна, не переполнилась - другая. При отпускании кнопки этот счетчик обнуляется.
2. С помощью 4 кнопок можно сделать многоуровневое меню - влево, вправо, выбор, отмена. Это не сложно, но изначально так задача не ставилась - лучше всего в таком случае забыть все, что ранее написано - и начать по-новой. Вклеивание в готовый текст изменений может привести к тому, что программа "начнет жить своей жизнью" - и она то ли работает, то ли нет ...
По свободе напишу меню и попробуем разобраться вместе, естественно, алгоритм должен быть "перепахан".