Pavel » 24 июл 2011, 19:25
Здравствуйте Владимыч. Ваши вопросы растут и растут.
Итак, по порядку.
Кварц.
В программе стоит фьюз HC. То есть частота кварцевого резонатора может быть от 4 МГц до 20 МГц. И с каждым из них будет работать программа. Но длительность секунды будет разной. Она считается так (например, для кварца 8,192 МГц – так как в устройстве применен именно такой). 8192000/4 – так как каждая команда в PIC16F873A выполняется за 4 такта. Затем полученное число 2048000/32 – так как предделитель таймера 0 равен 32 (первые 3 бита регистра option_reg равны 100). И того мы получаем 64000. Затем ставим начальное число отсчета таймера 0 tmr0=192. То есть счет будет вестись до 64 и затем таймер будет переполнятся и вызывать процедуру прерывания (регистр intcon=0xa0), а та в свою очередь будет прибавлять миллисекунду на единицу каждое прерывание. То есть 64000/64 и получаем в идеале 1000. Но так как в процедуре прерывания также происходит вывод значений на индикатор, то происходит задержка примерно в 8 миллисекунд. Потому в программе и стоит значение ml 992. Исходя из этого, считайте сами значение ml для конкретной частоты кварцевого резонатора, учитывая потери от вывода информации на индикатор.
Резервное питание.
В схеме, ссылку на которую вы привели, используется что-то вроде спящего режима. То есть пока на определенный вывод МК подается напряжение 5 Вл, он выводит информацию на дисплей. Как только напряжение пропало (там для точности стоят полупроводниковые диоды Шотки – малая потеря напряжения, плюс через резистор, большего номинала, на порт подается минус, чтобы совсем питание не пропадало), то он просто перестает выводить информацию, отключая индикатор, и скорее всего так же отключает все порты, кроме того который считывает напряжение (так же для экономии энергии). Но при этом МК не переходит в настоящий спящий режим. 3 Вл подается на все питание контроллера, не только MCLR. Если хотите применить данный способ, задействуйте порт RC2 для считывания уровня напряжения, но только так чтобы 3 Вл не попадало на него. Можно сделать такую же развязку через диоды как в статье, на которую вы указали ссылку.
Минус на аноды.
if (a1==2) {portb=0xff; portc=0x7f; portb=d1;} // 1 цифра 0x7f – инверсия 0x80
if (a1==4) {portb=0xff; portc=0xbf; portb=d2;} // 2 цифра 0xbf – инверсия 0x40
if (a1==6) {portb=0xff; portc=0xdf; portb=d3;} // 3 цифра 0xdf – инверсия 0x20
if (a1==8) {portb=0xff; portc=0xef; portb=d4;} // 4 цифра 0xef– инверсия 0x10
if (a1==10) {portb=0xff; portc=0xfe; portb=d5; a1=0;} // 5 цифра 0xfe – инверсия 0x01
Общий катод.
Здесь кусочек из программы писать не буду, так как он большой. Нужно сделать следующие – инвертировать сигналы на сегменты, то есть посмотрите программу и инвертируйте все значения d1, d2, d3, d4, d5 (например, portb=~d1;), в том числе и в файле segment.c. Также сделайте в процедуре прерывания portb=0x00, а не portb=0xff.
Ну и все на этом. Всего хорошего.