Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
А так же любителям асма будет интересно знать ,что инлайн асм у IAR никакой...scorpi_0n писал(а):Тем более что у иаровцев еще есть над чем работать в плане оптимизации.
Она работает так же, как и любая другая кнопка. Меняет логический уровень на пине - высокий (лог.1) или низкий (лог.0). Нужно просто считать уровень на пине микроконтроллера.aerokostia писал(а):И тут я застрял. Она сенсорная и никак не могу понять, как она общается с МК.
Код: Выделить всё
//Настройка таймера 1
//настройка порта
PC_DDR=MASK_PC_DDR_DDR4; //Pc4 выход
PC_CR1=MASK_PC_CR1_C14; //пушпул
PC_CR2=MASK_PC_CR2_C24; //10MHz
//PC_ODR^=MASK_PC_ODR_ODR4;
CLK_PCKENR1|=1<<7; //включение тактирования таймера 1
//TIM1_PSCRL=(160-1)&0x00FF; //предделитель так что таймер досчитает до 1000 за 10мс
//TIM1_PSCRH=(160-1)>>8;
//TIM1_ARRL=(255)&0x00FF; //считать будем максимум до тысячи
//TIM1_ARRH=(255)>>8;
//TIM1_CCR4L=(128)&0x00FF; //Регистр сравнения
//TIM1_CCR4H=(128)>>8;
TIM1_CCER2=MASK_TIM1_CCER2_CC4E | MASK_TIM1_CCER2_CC4P;// CH4 таймера 1 как выход и полярность
TIM1_CCMR4=( 0x6<<4) | MASK_TIM1_CCMR4_OC4PE;//PWM моде и буферное обновление регистра сравнения.
//TIM1_CR1=//MASK_TIM1_CR1_ARPE;// | MASK_TIM1_CR1_DIR;// | MASK_TIM1_CR1_OPM; //буферное обновление максимума счета и однократный счет
TIM1_CR2=1;//Bit 0CCPC: Capture/compare preloaded control
//TIM1_BKR =0x80; // OC and OCN outputs are enabled if their respective enable bits are set (CC/E in Tim1_CCERi)
//TIM1_RCR=0xFF;
TIM1_IER=1;
TIM1_CR1|=MASK_TIM1_CR1_CEN; //запускаем таймерРегистры вроде 8-мибитные?//TIM1_ARRL=(255)&0x00FF; //считать будем максимум до тысячи
//TIM1_ARRH=(255)>>8;
....
Код: Выделить всё
void TIM1_init(void) // Настройка таймера 1
{
//PWM output signal frequency = TIM1 counter clock/(TIM1_ARR + 1)
//Channel x duty cycle = [TIM1_CCRxx/(TIM1_ARR + 1)] * 100
TIM1->PSCRH = 0x00;
TIM1->PSCRL = 0x00;
TIM1->ARRH = 0x0F;
TIM1->ARRL = 0x9F;
TIM1->CCMR1 |= (uint8_t)0x60; //110: PWM mode 1 - In up-counting, channel 1 is active as long as TIM1_CNT < TIM1_CCR1,
TIM1->CCER1 |= TIM1_CCER1_CC1E; //CH1 compare Enable
TIM1->CCR1H = 0x07;
TIM1->CCR1L = 0xD0;
TIM1->CR1 |= TIM1_CR1_CEN;
TIM1->BKR |= TIM1_BKR_MOE; // OC and OCN outputs are enabled if their respective enable bits are set (CC/E in Tim1_CCERi)
}Да там раньше другие числа стояли, значительно больше 255, расчетные. Это сейчас всякие пробыне варианты, не думал что застряну в лыжах на асфальте на таком вопросе.oleg110592 писал(а):Регистры вроде 8-мибитные?
Код: Выделить всё
...
/* Set the Prescaler value */
TIM2->PSCR = (uint8_t)(0);
/* Set the Autoreload value */
TIM2->ARRH = (uint8_t)(0);
TIM2->ARRL = (uint8_t)(0xFF);
/* Reset the Output Compare Bits & Set the Ouput Compare Mode */
TIM2->CCMR1 = (uint8_t)((uint8_t)(TIM2->CCMR1 & (uint8_t)(~TIM2_CCMR_OCM)) |
(uint8_t)TIM2_OCMODE_PWM1);
...The interrupt mask is reset, allowing interrupts to be fetched. Then the
oscillator is stopped thus stopping the CPU and all internal peripherals,
reducing the microcontroller to its lowest possible power consumption. The
microcontroller resumes program execution after an external interrupt or
reset, by restarting the oscillator,and then, fetching the corresponding
external interrupt, which is generally an I/O interrupt, or the reset vector.
Кроме этого еще есть специальный регистр для внешних прерываний.Ser-B писал(а):Я так понимаю для начала надо настроить прерывание: PA_CR2_bit.C23 =1;?
Буду рад, если кому-нить пригодится.//------------------------------------------------------------------------------
// Начальная инициализация бибикалки - без калибровки
// Нагрузка бибикалки высокоомная - вход операционника через RC цепь
// Поэтому на работу сигнала SWIM бибикалка не влияет
//------------------------------------------------------------------------------
void beeper_init(void)
{
/*
// На работу бипера не влияет
PA_DDR_bit.DDR0 = 1; // 0-й пин порта A на выход
PA_CR1_bit.C10 = 1; // режим push-pull on
CPU_CFG_GCR_SWD = 1; // Отключаем SWIM
*/
// Включаем тактирование BEEP
CLK_PCKENR1_bit.PCKEN16 = 1;
// Выключаем LSI 38кгц
CLK_ICKCR_LSION = 0;
// Сброс предделителя beeper'a
BEEP_CSR2_bit.BEEPDIV = 0x1F;
// Выключить калибровочный таймер
BEEP_CSR1_bit.MSR = 0;
// Калибровочная константа
BEEP_CSR2_bit.BEEPDIV = 0x0F;
// Частота 1 кгц +-1км
BEEP_CSR2_bit.BEEPSEL = 0x00;
// Источник тактирования BEEP - LSI
CLK_CBEEPR_bit.CLKBEEPSEL0 = 1;
CLK_CBEEPR_bit.CLKBEEPSEL1 = 0;
// Включаем LSI 38кгц
CLK_ICKCR_LSION = 1;
SomeDelay(1000);
}
//------------------------------------------------------------------------------
// Звуковой сигнал
//------------------------------------------------------------------------------
void beep(long delay, unsigned char tone)
{
// Сохраняем значение по умолчанию
unsigned char st = BEEP_CSR2_bit.BEEPDIV;
// Изменяем тон звучания
BEEP_CSR2_bit.BEEPDIV = tone;
// Включаем сигнал
BEEP_CSR2_bit.BEEPEN = 1;
// Гудим-с
SomeDelay(delay);
// Выключаем сигнал
BEEP_CSR2_bit.BEEPEN = 0;
// Возвращаем тон по умолчанию
BEEP_CSR2_bit.BEEPDIV = st;
}