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

Alex1

Новичок
  • Постов

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

  • Посещение

Репутация

0 Обычный
  1. :help: Всем привет, форумчане. Помогите пожалуйста начинающему нубасу. Надо сделать декодер для RC5 протокола, в руках оказался камень stm8s105c6...Столкнулся вот с такой проблемой, по алгоритму выполнения надо считывать временные интервалы между внешними прерываниями на выводе PB7, решил использовать таймер TIM3, судя по документации на камень, у таймера есть регистры TIM3_CNTRH и TIM3_CNTRL они помечены как R/W и служат для хранения текущего значения счетчика. Для получения значения использую вот такую строчку unsigned short Timer_value |= ((TIM3_CNTRH << 8)|TIM3_CNTRL); Но получаю только нулевое значение :crying: Подскажите пожалуйста, в чем может быть причина такого поведения. Код ниже. #include "iostm8s105c6.h" void InitialiseInternalSystemClock() { CLK_ECKR = 0; // очистка регистра внешнего тактирования CLK_ICKR = 0; // очистка регистра внетреннего тактирования(сбрасывание делителя частоты) CLK_ICKR_HSIEN = 1; // подключаем внутренний высокоскоростной генератор while (CLK_ICKR_HSIRDY == 0) {} // ожидание устойчивой работы внетреннего высокоскоростного генератора CLK_CKDIVR = 0; // максимальная частота работы генератора CLK_PCKENR1 = 0xff; // хз как включить TIM4 => врубаем все CLK_PCKENR2 = 0xff; // тут нет TIM4 => прост врубаем все CLK_CCOR = 0; // отключения подачи на ножку тактового сигнала CLK_HSITRIMR = 0; // выключить калибровку генератора CLK_SWR = 0xe1; // HSI выбран как источник тактирования CLK_SWCR = 0; // сброс флага переключения CLK_SWCR_SWEN = 1; // переключиться на HSI while (CLK_SWCR_SWBSY != 0) {} // ожидание переключения } unsigned char MIN_THRESHOLD_SHORT_PULSE = 889; unsigned char MAX_THRESHOLD_SHORT_PULSE = 1333; unsigned char MIN_THRESHOLD_LONG_PULSE =1334; unsigned char MAX_THRESHOLD_LONG_PULSE = 2220; unsigned short RC5_buffer = 0; unsigned char bit_counter = 0; unsigned char not_korr = 0; unsigned char centre = 0; unsigned short Timer_value = 0; #pragma vector=0x06 __interrupt void EXTI_PB7(void) //Обработчик прерывания { //TIM3_CR1_CEN = 1; not_korr = 1; Timer_value = ((TIM3_CNTRH << 8) | TIM3_CNTRL); // ВОТ ЗДЕСЬ НИЧЕГО НЕ ПРОИСХОДИТ. TIM3_CNTRL = 0; TIM3_CNTRH = 0; if(bit_counter == 0) { TIM3_CR1_CEN = 1; RC5_buffer |= (PB_IDR_bit.IDR7 << bit_counter); bit_counter++; centre = 1; } else { // ОБРАБОТКА КОРОТКОГО ИМПУЛЬСА if((Timer_value > MIN_THRESHOLD_SHORT_PULSE) && (Timer_value < MAX_THRESHOLD_SHORT_PULSE)) { if(centre == 1) { centre = 0; not_korr = 0; } else { centre = 1; RC5_buffer |= (~PB_IDR_bit.IDR7 << bit_counter); bit_counter++; not_korr = 0; } } // ОБРАБОТКА ДЛИННОГО ИМПУЛЬСА if((Timer_value > MIN_THRESHOLD_LONG_PULSE) && (Timer_value < MAX_THRESHOLD_LONG_PULSE)) { RC5_buffer |= (~PB_IDR_bit.IDR7 << bit_counter); bit_counter++; not_korr = 0; } if( not_korr == 1) { TIM4_CR1_CEN = 0; RC5_buffer = 0; bit_counter = 0; // Ошибка чтения } if(bit_counter == 14) { TIM4_CR1_CEN = 0; RC5_buffer = 0; } TIM4_CR1_CEN = 1; } } void PB7_Interrupt_init() { PB_DDR_bit.DDR7=0; //0-вход PB_CR1_bit.C17=1; //1-подтяжка PB_CR2_bit.C27=1; //1-прерывания разрешены EXTI_CR1_bit.PBIS = 3; // 11: Rising and falling edge } void TIM3_init() { TIM3_PSCR = 4; // Делитель 2^4 = 16 => 1 МГц TIM3_ARRH = 0; TIM3_ARRL = 0; //TIM3_IER_UIE = 1; // Включаем флаг обновления таймера (разрешить прерывания) TIM3_CR1_CEN = 1; // включаем таймер } int main( void ) { asm("sim"); InitialiseInternalSystemClock(); PB7_Interrupt_init(); TIM3_init(); asm("rim"); while (1) { } return 0; } :smile3046:
×
×
  • Создать...