== сравнение
Код: Выделить всё
if (porta.RA0==1) {В том, что Вы начали не с чтения документации и изучения камня.iliich писал(а):скажите поподробнее в чем моя ошибка
Код: Выделить всё
RC3 = T0IE;Код: Выделить всё
if (T0IF && T0IE) // ветка опроса флага прерывания по переполнению TMR0
{
T0IF = 0; // сброс флага прерывания по переполнению TMR0
TMR0+= 6; // предзагрузка TMR0
T0IE = 1; // 1/0 разрешение/запрет прерывания по переполнению TMR0
RC3 = T0IE;
if(cnt_pause) cnt_pause--;
} // конец ППОП TMR0Ghost in shell писал(а): Этот код гарантированно рабочий.
Код: Выделить всё
if (T0IF && T0IE) // ветка опроса флага прерывания по переполнению TMR0Код: Выделить всё
RC3 = T0IE;dosikus писал(а):Это какой компилятор позволяет сей бред ?
Или это очень плохой компилятор, либо Вы не понимаете что пишете...
Ghost in shell писал(а):а как правильнее?
Код: Выделить всё
#define F_MY 1000*2 // требуемая частота для выдачи 1000
#define F_IN 4000000 // частота на 0 таймер с учетом всех пределителей
#if F_IN/F_MY > 250
#error "увеличь чаcтоту на 0 таймер !!!"
#endif
#define CALC_TMR 256 - (F_IN/F_MY)
if (T0IF && T0IE) // ветка опроса флага прерывания по переполнению TMR0
{
T0IF=0;
RC3^=1;
TMR0+= CALC_TMR;
}urry писал(а):Код в студию.
Код: Выделить всё
//pic16f72
#include <pic.h>
__CONFIG (XT & WDTDIS & PWRTDIS & BOREN & UNPROTECT);
#define XTAL_FREQ 4000000 // задание частоты кварца для расчета частоты таймера
//Начало насторойки TMR1------------------------------------------------------------------
#define FTMR_IN XTAL_FREQ/4 // задание Fosc/4 (входная частота для таймера)
#define FTMR1_OUT 500 // частота после таймера (в данно случае, 500 Hz на индикаторы)
#define TMR1_ALL 65536 - (FTMR_IN/FTMR1_OUT) // получение значения предделителя
#if TMR1_ALL > 65635
#error "слишком низкая частота ! измените значения пределителя !"// генерится при компиляции
#endif
//----------
#define TMR1_H TMR1_ALL>>8 // определение значения старшего байта предделителя TMR1 для 500 Hz
// сдвиг на 8 байт вправо? для 500Гц - F8
#define TMR1_L (int)TMR1_ALL&0x00FF // определение значения младшего байта предделителя TMR1 для 500 Hz
// а как? 0x00FF в 16-рич = 255 в 10-тич - для 500Гц - 30
//Конец насторойки TMR1------------------------------------------------------------------
...
void interrupt isr(void) // обработчик прерываний
{
static char temp;
if (TMR1IF && TMR1IE) // опрос флага прерывания по переполнению TMR1.
// TMR1 работает на динамическую индикацию. Частота 500 Гц.
{
TMR1H = TMR1_H; //
///Важно !!!! ----------
TMR1L += TMR1_L; //
// Приплюсовывая к младшему регистру таймера, мы компенсируем задержки,
// вызванные сохранением контекста и пр - улучшаем точность счета
TMR1IF = 0; // сброс флага прерывания по переполнению TMR1
// начало блока вывода на индикатор----------------------------------------------
...
// настройка TMR1------------------------------------------------------------------------
// регистр T1CON
T1CKPS1 = 0; // выбор коэфф. деления предделителя
T1CKPS0 = 0; // выбор коэфф. деления предделителя
T1OSCEN = 0; // выключить внутренний тактовый генератор модуля TMR1
TMR1CS = 0; // 1 - выбран внешний (0 - внутренний, Fosk/4) источник тактового сигнала модуля TMR1
TMR1H = TMR1_H; // старший байт предзагрузки TMR1
TMR1L = TMR1_L; // младший байт предзагрузки TMR1 63536
TMR1IE = 1; // Разрешение прерывания по переполнению TMR1
TMR1IF = 0; // сброс флага прерывания по переполнению TMR1
TMR1ON = 1; // включить TMR1
// конец настройки TMR1----------------------------------------------------------------Код: Выделить всё
rom unsigned int calibrat;
TBLPTR = &calibrat;
TBLLAT = new_calibr_value;