Auratos

Members
  • Публикации

    5
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

О Auratos

  • Звание
    Новенький

Электроника

  • Стаж в электронике
    3-5 лет
  1. PIC18F25K22. Настройка прерываний таймера

    Спасибо большое. Теперь я со всем разобрался. Убрал лишнее из обработчика прерываний, назначил на все это дело TMR2, и все запело ))
  2. PIC18F25K22. Настройка прерываний таймера

    Объясните, пожалуйста, вашу точку зрения. Цифра, задуманная мною, не будет в принципе или не будет при данном синтаксисе? if(INTCONbits.TMR0IF & INTCONbits.TMR0IE) tmr0_int(); А если напишу if(INTCONbits.TMR0IF && INTCONbits.TMR0IE) tmr0_int();, то будет? Просто когда я поправил порядок инициализации (TMR0H и TMR0L поменял местами), как посоветовали, то результат улучшился. Теперь я на осциллографе увидел, что прерывания срабатывают каждую 1.045мс, вместо предыдущих 1.3мс. Хотя я подбирал предзагрузку для 1.0001мс, но результат уже определенно лучше
  3. PIC18F25K22. Настройка прерываний таймера

    Я читал этот раздел. Увидел, что внутренний генератор настраивается в регистре OSCCON. Я его настроил вот так (хотел запуститься от 4МГц): OSCCONbits.IRCF = 0b101; OSCCONbits.OSTS = 0; OSCCONbits.HFIOFS = 1; OSCCONbits.SCS = 0x10; А в итоге не увидел на осциллографе разницы. Я, видимо, упустил какую-то маленькую, но важную деталь )
  4. PIC18F25K22. Настройка прерываний таймера

    Я просто не указал место, где вызывается эта функция ) #pragma code high_vector=0x08 void interrupt_at_high_vector(void) // с высоким приоритетом { _asm GOTO high_isr _endasm } #pragma code #pragma interrupt high_isr // обработчик векторов прерываний высокого приоритета void high_isr (void) { if(INTCONbits.TMR0IF & INTCONbits.TMR0IE) tmr0_int(); // прерывание по таймеру if(PIR1bits.TMR1IF) tmr1_int(); // прерывание по таймеру }
  5. Добрый день. У меня контроллер PIC18F25K22. Пытался завести таймер TMR0 с частотой прерываний 1мс. Но на деле получаю 1,31мс. И не пойму, почему так. Настройки таймера рассчитал вручную, а затем с помощью программы PIC Timer Calculator. Данные сошлись, но по факту частота не та. У меня внешний тактовый генератор 4,9152МГц с включенной PLL. От этого и отталкивался. Считал, что на CLKOUT имею 4915200Гц. Значит в 16-битном режиме для 1мс мне понадобится 4916 приращений таймера. Сделал предзагрузку 0xECCC. И получил не то, что хотел. Вот такие у меня настройки источника тактирования: #pragma config WDTEN = SWON // сторожевой таймер #pragma config WDTPS = 512 // скорость работы сторожевого таймера #pragma config FOSC = HSMP // частота тактового генератора #pragma config PLLCFG = ON #pragma config PRICLKEN = ON #pragma config FCMEN = OFF #pragma config IESO = OFF #pragma config PWRTEN = ON //#pragma config BORV = 285 #pragma config BOREN = OFF #pragma config PBADEN = OFF #pragma config XINST = OFF И вот настройки таймера: // обработка прерывания таймера TMR0 void tmr0_int(void) { INTCONbits.TMR0IF = 0; // сброс переполнения таймера T0CONbits.TMR0ON = 0; TMR0L = 0xСС; TMR0H = 0xEC; T0CONbits.TMR0ON = 1; LED_SW; } // инициализация таймера TMR0 void tmr0_init(void) { T0CONbits.T08BIT = 0; // 16-ти разрядный таймер T0CONbits.T0CS = 0; // тактирование от осцилятора 4*Fosc/4 T0CONbits.T0SE = 0; // приращение по переднему фронту импульса T0CONbits.PSA = 1; // предделитель не используется T0CONbits.T0PS = 0; // коэф. предделителя не используется TMR0L = 0xСС; // регистр таймера в ноль TMR0H = 0xEC; INTCON2bits.TMR0IP = 1; // приоритет прерывания TMR0 - высокий INTCONbits.TMR0IE = 1; // разрешить прерывание по переполнению TMR0 T0CONbits.TMR0ON = 1; } Частоту смотрю на осциллографе по светодиоду, состояние которого меняю каждое прерывание. Схема подключения внешнего тактового генератора на фотографии. Подскажите, пожалуйста, в чем может быть загвоздка? В Fosc выбрал не тот режим? Завел еще таймер TMR1. В регистре T1CONbits в бите TMR1CS ставил и 00 и 01. После соответствующего пересчета получал все то же значение частоты. TMRxCS<1:0>: Timer1/3/5 Clock Source Select bits 11 =Reserved. Do not use. 10 =Timer1/3/5 clock source is pin or oscillator: If TxSOSCEN = 0: External clock from TxCKI pin (on the rising edge) If TxSOSCEN = 1: Crystal oscillator on SOSCI/SOSCO pins 01 =Timer1/3/5 clock source is system clock (FOSC) 00 =Timer1/3/5 clock source is instruction clock (FOSC/4) Еще подскажите, пожалуйста, как начать тактироваться от внутреннего тактового генератора. Где это настраивается? В регистре OSCCON?