Обсуждаем контроллеры компании Atmel.
Ответить

Помогите найти причину лага.

Вс июн 04, 2023 22:07:04

Здравствуйте, написал программу, точнее набыдлокодил. И столкнулся с проблемой.
Использую софтовый юарт, аппаратный юарт с прерываниями по приему, таймер2 и внешнее прерывания для реализации трехканального димера на 220 вольт - и это все прекрасно работает(ну или я не вижу лагов), но как только я добавляю двухканальный шим на таймере1, без предделителя в режиме Fast PWM top=00FFh. Начинаются лаги выраженные в мерцании ламп, причем чем я ставлю ниже частоту шима тем меньше лагов.
в чем может быть приблема????

atmega8, 8мгц
куски кода
Спойлерint main( void ){
PortInit();
ExInterruptInit();
Timer_1_init();
Timer_2_init();
USART_Init();
SUART_Init();
Read_eeprom_all();
sei();

UART_PutStr("AT+NAMEZeSteam"); UART_PutStr("\r\n");

while(1){
...
тут логика основной программы, неспешная бработка кнопок

// OCR1AL = isp_power[fire_level-1];
// OCR1BL = fan_speed[fire_level-1];
и не важно закоментированны эти две строки или нет тупит уже после инициализации таймера
...


// обработка прерывания с с периодом 180мкс
ISR (TIMER2_COMP_vect){
if ((timer_pwm+1)== lamp[0]) {HIGH(LAMP1_OUT_PORT, LAMP1_OUT);}
if ((timer_pwm+1)== lamp[1]) {HIGH(LAMP2_OUT_PORT, LAMP2_OUT);}
if ((timer_pwm+1)== lamp[2]) {HIGH(LAMP3_OUT_PORT, LAMP3_OUT);}

if ((timer_pwm == 90) || (!timer_pwm)) {
LOW(LAMP1_OUT_PORT, LAMP1_OUT);
LOW(LAMP2_OUT_PORT, LAMP2_OUT);
LOW(LAMP3_OUT_PORT, LAMP3_OUT);
}
if (timer_pwm){timer_pwm--;}
}

//обработка внешнего прерывания INT0
ISR( INT0_vect ){
fl_timer_100ms = true;
timer_pwm = 90;
}

void Timer_1_init(void){
TCCR1A=0x21;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
}

void Timer_2_init(void){
ASSR=0x00;
TCCR2=0x0B;
TCNT2=0x00;
OCR2=0x15;
TIMSK=0x80;
}

void ExInterruptInit(void){
GICR|=0x40;
MCUCR=0x03;
GIFR=0x40;
}
void USART_Init(void){
UBRRH = 0;
UBRRL = 51; //скорость обмена 9600 бод
//разр. прерыв при приеме и передачи, разр приема, разр передачи.
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); // |(1<<TXCIE)
//размер слова 8 разрядов
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}



ISR(USART_RXC_vect) { // прерывание при получении данных по UART (bluetooth)
comand_bt_str[1] = comand_bt_str[0];
comand_bt_str[0] = UDR;
if ((comand_bt_str[1] == 'i') || (comand_bt_str[1] == 'v') || (comand_bt_str[1] == 'a')){fl_bluetooth_receiv = true;}

}

Re: Помогите найти причину лага.

Вс июн 04, 2023 22:54:25

sedix писал(а):Использую софтовый юарт

А он какой таймер использует??

Re: Помогите найти причину лага.

Пн июн 05, 2023 00:19:14

таймер 0
Спойлерvoid SUART_Init(void)
{
/*инициализация флагов*/
flag_tx_busy = FALSE;
flag_rx_ready = FALSE;
flag_rx_waiting_for_stop_bit = FALSE;
flag_rx_off = FALSE;

/*настройка выводв*/
RX_DDRX &= ~(1<<RX_PIN);
RX_PORTX |= (1<<RX_PIN);
TX_DDRX |= (1<<TX_PIN);
TX_PORTX |= (1<<TX_PIN);

/*настройка таймера Т0*/
TCCR0 = CSXX;
TCNT0 = TIMER_TCNT_VALUE;
TIMSK |= (1<<TOIE0);
}

Re: Помогите найти причину лага.

Пн июн 05, 2023 16:32:37

Если используете библиотеки нет ли там использования таймеров.. может кнопки висят на прерываниях чтоб гасить дребезг..

Re: Помогите найти причину лага.

Пн июн 05, 2023 22:39:22

Библиотека только для софт юарта.
Кнопки в мейне опрашиваю по флагам с прерывания.

Добавлено after 5 hours 40 minutes 11 seconds:
Думаю что разобрался.
Нагрузка на одном из каналов шим при работе давала помеху, что вызывало внешнее прывание чаще положеного. Поставил емкость 0,1 паралельно нагрузке и все стало работать как надо.
Всем спасибо)
Ответить