Перейти к содержанию
    

yliya

Участник*
  • Постов

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

  • Посещение

Репутация

0 Обычный

Информация

  • Город
    Array
  1. вопросы по pic24

    Спасибо огромное за ценные замечания) Обязательно учту. volodya, вы поняли меня правильно и я хотела так и делать, но сложность моей задачи состоит в том, что где появится первый сигнал неизвестно (либо на INT0, либо на INT1)... сделала бы так (если бы точно знала что сигнал появится на первом входе INT0) и пользовалась бы одним таймером: /* Обработчик прерывания 1 (INT0) (пошел в магаз) */ void __attribute__ ((__interrupt__, no_auto_psv)) _INT0Interrupt(void) { _RB8=1; // засветили светодиод 1 (ушел) _RB9=0; // погасили светодиод 2 IFS0bits.INT0IF =0; // обнуляем флаг INT0IF в регистре IFS0 IEC0bits.INT0IE=0; // запрещаем прерывания INT0 TMR1=0; // обнуляем таймер 1 tmr1Res = 0; // обнуляем переменную, в кот. накапливается кол-во времени от таймера T1CONbits.TON=1; // старт таймера 1 } /* Обработчик прерывания 2 (INT1) (вернулся домой) */ void __attribute__ ((__interrupt__, no_auto_psv)) _INT1Interrupt(void) { _RB8=0; // погасили светодиод 1 _RB9=1; // засветили светодиод 2 (вернулся домой) IEC0bits.INT0IE=1; // разрешаем прерывания INT0 IFS1bits.INT1IF =0; // обнуляем флаг INT1IF в регистре IFS1 T1CONbits.TON=0; // cтоп таймера 1 tmrRes=TMR1; } но ... если сигнал появится на INT1? что делать в этом случае? поэтому чуть изменила мысль... я получаю из таймера двоичное значение, мне нужно перевести в десятичное... Примерно так : tmrRes=tmr1h T=T+tmr1l tmrRes=((tmr1H<<8)+tmr1L) ??? tmr1h, tmr1l - можно unsigned char? Мало пока понимаю, но все же... Спасибо огромное за помощь!
  2. вопросы по pic24

    )))) Сделала так, чуть по другому. Мне надо знать в ту ли он сторону пошел вообще) /*********************************** Обработчик прерывания 1 (INT0)(идет налево) ****************************/ void __attribute__ ((__interrupt__, no_auto_psv)) _INT0Interrupt(void) { _RB2=0; // засветили зеленый светодиод _RB3=1; // погасили красный светодиод IFS0bits.INT0IF =0; // обнуляем флаг INT0IF в регистре IFS0 IEC0bits.INT0IE=0; // запрещаем прерывания INT0, чтобы если произойдет второе событие на входе INT0, // до завершении цикла INT1, оно не сбило счет времени if (i==0) { T1CONbits.TON=1; // старт таймера 1 i=1; } else T1CONbits.TON=0; // cтоп таймера 1 tmr1Res = TMR1; TMR1=0; // обнуляем таймер 2 i=0; } /***************************************** Обработчик прерывания 2 (INT1) (идет вправо) **************************/ void __attribute__ ((__interrupt__, no_auto_psv)) _INT1Interrupt(void) { _RB2=1; // погасили зеленый светодиод _RB3=0; // засветили красный светодиод IFS1bits.INT1IF =0; // обнуляем флаг INT1IF в регистре IFS1 IEC1bits.INT1IE=0; // запрещаем прерывания INT1 if (j==0) { T2CONbits.TON=1; // старт таймера 2 j=1; } else T2CONbits.TON=0; // cтоп таймера 2 tmr2Res = TMR2; TMR2=0; // обнуляем таймер 2 j=0; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// /************************************** Основная программа ***************************************************/ void main (void) { InitTimerAndInterrupts (); _RB2=1; // погасили светодиод 1 _RB3=1; // погасили светодиод 2 // Счет времени if (IFS0bits.INT0IF =1) { time = tmr1Res/256 /*предделитель таймера*/ / 1000/*для результата в милисекундах*/; // Результат, "молодец" } else time = tmr2Res/256 /*предделитель таймера*/ / 1000/*для результата в милисекундах*/; // Результат, "сходил налево" // *************************************** Инициализация ******************************************************// // инициализация void InitTimerAndInterrupts (void) { // Настройка прерываний IEC0bits.INT0IE=1; // в регистре IEC0 прерывание INT0 - выставить бит 0, а также в регистре IEC1 прерывание INT1 - выставить бит 4 IEC1bits.INT1IE=1; // разрешаем прерывания на INT0 и INT1 // Настройка таймеров IFS0bits.T1IF = 0; // Clear Output Compare interrupt flag IEC0bits.T1IE = 1; // разрешаем прерывания таймеров IFS0bits.T2IF = 0; IEC0bits.T2IE = 1; // работа от внешнего источника тактового сигнала _TCS=1; _TSYNC = 1; // выполняется синхронизация внешнего сигнала _TCKPS=0011; // Настройки выводов TRISBbits.TRISB7 = 1; // выводы прерываний сконфигурированы на вход (RB7 и RB14) TRISBbits.TRISB14 = 1; TRISBbits.TRISB2 = 0; // выводы светодиодов сконфигурированы на выход (RB7 и RB14) TRISBbits.TRISB3 = 0; } // Счет времени там... если... тыры пыры не обращайте внимания) там неправильно...посчитаю правильно в самих обработчиках и там же пошлю на индикацию
  3. вопросы по pic24

    Я хочу научиться, а не просто "передрать и сдать"...) Ничего себе, интересно и понятно! спасибо большое!))))))
  4. вопросы по pic24

    Спасибо большое!!!) Буду дальше продвигаться! /***************************************** Обработчик прерывания 1 ******************************************/ Написала для себя алгоритмик, а как реализовать не знаю...Хоть в правильном направлении иду? // сохранение контекста ( регистр STATUS и аккумулятор W) // проверка источника запроса прерывания (опрашиваем флаг) // сброс флага источника прерывания // восстановление контекста void __attribute__ ((__interrupt__, no_auto_psv)) _INT0Interrupt(void) { INTCON2=0; _INT0EP=0; // что-то.... } /***************************************** Обработчик прерывания 2 ******************************************/ void __attribute__ ((__interrupt__, no_auto_psv)) _INT1Interrupt(void) { INTCON2=0; _INT1EP=0; // что-то } Как найти источник прерываний (опросить флаги)? В программе необходимо определить источник прерывания (с какой стороны пришел сигнал), зажеч светодиод (INT0 - первый светодиод, на RB2, INT1 - второй светодиод, на RB3). Посчитать интервал в секундах. + есть кнопка которая разрешает выполнение программы и запрещает (кнопка нажата - пошла прога, еще раз нажали- остановилась (наверное запретили прерывания)) Обработку кнопки я поместила в main: /* Для запрещения/разрешения прерываний используются две ассемблерные вставки. Группа команд push SR mov #0xE0, w0 ior SR выполняет сохранение в стеке содержимого регистра состояния (push SR), устанавливает уровень приоритета 7 для процессора, запрещая тем самым пользовательские прерывания (mov #0xE0, w0 и ior SR). // Для разрешения прерываний нужно просто извлечь из стека старое содержимое регистра.Это произойдет при нажатии на кнопку */ asm ("push SR" "\n mov #0xE0, w0" "\n ior SR"); while (_RA6 != 1); asm("pop SR"); while(1); } Как найти источник прерываний (опросить флаги)? В программе необходимо определить источник прерывания (с какой стороны пришел сигнал), зажеч светодиод (INT0 - первый светодиод, на RB2, INT1 - второй светодиод, на RB3). Посчитать интервал в секундах. + есть кнопка которая разрешает выполнение программы и запрещает (кнопка нажата - пошла прога, еще раз нажали- остановилась (наверное запретили прерывания)) Обработку кнопки я поместила в main: /* Для запрещения/разрешения прерываний используются две ассемблерные вставки. Группа команд push SR mov #0xE0, w0 ior SR выполняет сохранение в стеке содержимого регистра состояния (push SR), устанавливает уровень приоритета 7 для процессора, запрещая тем самым пользовательские прерывания (mov #0xE0, w0 и ior SR). // Для разрешения прерываний нужно просто извлечь из стека старое содержимое регистра.Это произойдет при нажатии на кнопку */ asm ("push SR" "\n mov #0xE0, w0" "\n ior SR"); while (_RA6 != 1); asm("pop SR"); while(1); }
  5. вопросы по pic24

    Индикацию так реализовала: // Таблица изображения чисел и символов (0,1,2,3,4,5,6,7,8,9) для индикатора const unsigned char digit[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; #define f 5 // Частота обновления результата измерения в предварительном программном буфере, гц. #define nsum (200/f) // Количество слогаемых при усреднении результата измерения nsum=Fпрер/f. int data, rez, n, temp, SYM[5]; void __attribute__ ((__interrupt__, no_auto_psv)) _T1Interrupt(void) { _T1IF = 0; if (rez==T1) { // перевод 5-ти значного числа в десятично-символьное число data=data+rez; //data - преобразуемое число, n++; if (n==nsum) { data=data/n; if (data > 99999) data=99999; data=data*10; // умножим число на 10, чтобы вывести один знак после запятой temp=data/10000; SYM[4]=digit[temp]; data=data-temp*10000; temp=data/1000; SYM[0]=digit[temp]; data=data-temp*1000; temp=data/100; SYM[1]=digit[temp]; data=data-temp*100; temp=data/10; SYM[2]=digit[temp]; data=data-temp*10; temp=data; SYM[3]=digit[temp]; data=0; n=0; } } } Потом передаю через SPI void SPI1MasterInit(void) { SPI1STATbits.SPIEN = 0; SPI1CON1 = 0; SPI1STATbits.SPIEN = 0; // отключить интерфейс SPI путем сброса бита SPIEN регистра состояния SPI1STAT SPI1CON1 = 0; // очистить регистр управления интерфейса SPI1 // Используем две сигнальные линии (синхронизации передачи SCK1 и выходных данных SDO1), управляются микроконтроллером SPI1CON1bits.DISSCK = 0; // бит DISSCK регистра управления SPI1CON сброшены SPI1CON1bits.DISSDO = 0; // бит DISSDO регистра управления SPI1CON сброшены SPI1CON1bits.MODE16 = 0; // для 8-битной посылки данных бит MODE16 регистра управления сброшен SPI1CON1bits.MSTEN = 1; // микроконтроллер в режиме «ведущего», устанавливаем бит MSTEN SPI1STATbits.SPIEN = 1; // включаем SPI - интерфейс } ///// Передача данных на управляемый регистр void peredacha (void) { // передается строка (массив) символов char *pSYM = SYM[5]; _SPI1IF = 0; SPI1MasterInit(); while (*pSYM!= 0) { // Для передачи одного байта записываем его в регистр SPI1BUF, микроконтроллер выполняет все циклы синхронизации передачи каждого бита SPI1BUF = *pSYM++; while (_SPI1IF == 0); _SPI1IF = 0; } SPI1STATbits.SPIEN = 0; // выключаем SPI - интерфейс while(1); } Как измерить интервал в секундах от начала первого сигнала до начала второго? Сделаю два обработчика прерываний (сигнал 1 появляется на INT0, сигнал 2 появляется на INT1 ), появляются один за другим.Запуталась...как это реализовать.
  6. вопросы по pic24

    Здраствуйте!!! помогите, пожалуйста... Измерить временной интервал. Входные сигналы являются сигналами логического уровня ТТЛ. 2 входных сигнала (от двух фотодатчиков). Использую микроконтроллер PIC24F16KA102 (28 ножек), семисегментную индикацию (5 индикаторов), интерфейс SPI. по-быстрячку накидала алгоритм (прикрепила), начала писатьт прогу, застряла...
×
×
  • Создать...