Страница 1 из 2

Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Пн мар 08, 2021 20:32:49
beoro
Доброе время суток всем!

Сложилась такая ситуация с контроллером Atmega8, когда подключенный таймер 1 в качестве шим замедляет работу вектору прерывания по переполнению таймера 0. В чем может быть причина такого поведения? эмулировал в протеусе

настройки таймеров

Код: Выделить всё

       
	// пределитель на 1024, (1024*256)/8000000 = 0.032768 мкс
	// 1000ms/32,768 = 30тиков = за 1 сек
	TCCR0 = (1 << CS02) | (1 << CS00); 
	TIMSK = (1 << TOIE0); 
	TCNT0 = 256; 

	// пределитель на 1
        TCCR1A = (1 << COM1B1) | (1 << WGM11);
	TCCR1B = (1 << CS10) | 0x19;
        ICR1 = 256; // frequency = 8000000/256 = 31.129 kHz,


Re: Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Пн мар 08, 2021 20:56:00
Dimon456
А в чем это замедление проявляется?

Re: Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Пн мар 08, 2021 21:00:29
beoro
[uquote="Dimon456",url="/forum/viewtopic.php?p=3994013#p3994013"]А в чем это замедление проявляется?[/uquote]

увеличивается время срабатывания на нажатие кнопки с удержанием, без таймера 1 срабатывает все как надо

Re: Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Пн мар 08, 2021 21:03:13
Dimon456
А как это время измеряете?

Re: Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Пн мар 08, 2021 21:05:51
beoro
[uquote="Dimon456",url="/forum/viewtopic.php?p=3994018#p3994018"]А как это время измеряете?[/uquote]

визуально оно же видно 2 сек без таймера 1, с таймером1 10 сек, ну и юартом :))

Re: Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Пн мар 08, 2021 21:17:25
Dimon456
А как юартом измеряете?

Re: Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Пн мар 08, 2021 21:30:42
beoro
[uquote="Dimon456",url="/forum/viewtopic.php?p=3994029#p3994029"]А как юартом измеряете?[/uquote]

вы как здрасти, ей богу

Код: Выделить всё


ISR (TIMER0_OVF_vect) {
	
	static uint8_t conterTimer = 0;
    static uint8_t long_counter = 0;
    static uint8_t short_counter = 0;
    static uint8_t press_long = 0;
    static uint8_t press_short = 0;	
	
	static uint8_t c = 0;
	
	c++;

	if (button_pressed ()) {
		
	   if (conterTimer < 255) conterTimer++;
	   
	   if (conterTimer == 40) {
		   long_counter++;
		   if (press_long == 0) {
              press_long = 1;
		   }
		   		   
		   conterTimer = 0;
	   } 	      	   	   
	   		   			   
	} else {
		if ((conterTimer > 0) && (conterTimer < 22)) {
			short_counter++;
		    if (press_short == 0) {
                press_short = 1;
		    }		   					   				   
			conterTimer = 0;
			press_long = 0;        
		 }
		 
    }
	
	                 send_putc(13);
	                 send_str("ON: ");
	                 send_int(long_counter);					  
	                 send_putc(13);		
	
	if (short_counter == 5) short_counter = 0;
	if (long_counter == 3) long_counter = 0;
	
	TCNT0 = 256;
}

Re: Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Пн мар 08, 2021 21:36:48
Аlex
А причём тут ШИМ и прерывания ?

Re: Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Пн мар 08, 2021 21:40:04
beoro
[uquote="Аlex",url="/forum/viewtopic.php?p=3994046#p3994046"]А причём тут ШИМ и прерывания ?[/uquote]

в каком смысле?

Re: Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Пн мар 08, 2021 21:44:46
Аlex
[uquote="beoro",url="/forum/viewtopic.php?p=3994002#p3994002"]когда подключенный таймер 1 в качестве шим замедляет работу вектору прерывания[/uquote]
Ваши вроде слова ? :roll:

Re: Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Пн мар 08, 2021 21:49:46
beoro
[uquote="Аlex",url="/forum/viewtopic.php?p=3994051#p3994051"][uquote="beoro",url="/forum/viewtopic.php?p=3994002#p3994002"]когда подключенный таймер 1 в качестве шим замедляет работу вектору прерывания[/uquote]
Ваши вроде слова ? :roll:[/uquote]

а прочесть далее, не?

Re: Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Пн мар 08, 2021 21:50:42
Dimon456
А это что такое?

Код: Выделить всё

TCNT0 = 256; 

Re: Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Пн мар 08, 2021 21:59:46
Аlex
[uquote="beoro",url="/forum/viewtopic.php?p=3994056#p3994056"]а прочесть далее, не?[/uquote]А понять, о чём я спросил, не ? :facepalm:

Причём тут ШИМ и какие-то прерывания ? Как они связаны ?

Добавлено after 4 minutes 29 seconds:
И причём тут ещё какие-то кнопки ?

Re: Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Пн мар 08, 2021 22:38:36
ARV
боюсь, что когда из обработчика прерывания выполняется передача по USART, говорить что-либо о быстродействии не стоит в принципе. при таком подходе чудес расчудесных не избежать...

Re: Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Пн мар 08, 2021 22:49:04
Starichok51
beoro писал(а):TCNT0 = 256;
поместить двухбайтное число в один байт - это примерно, как в литровую банку налить 2 литра воды.

Re: Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Пн мар 08, 2021 23:13:25
beoro
[uquote="Аlex",url="/forum/viewtopic.php?p=3994061#p3994061"][uquote="beoro",url="/forum/viewtopic.php?p=3994056#p3994056"]а прочесть далее, не?[/uquote]А понять, о чём я спросил, не ? :facepalm:

Причём тут ШИМ и какие-то прерывания ? Как они связаны ?

Добавлено after 4 minutes 29 seconds:
И причём тут ещё какие-то кнопки ?[/uquote]

мы так друг друга не поймем.

прикрепил файлы проекта. При длинном нажатии кнопку с удержаниеем более 2 сек должно вкл, еще раз нажать с удержанием должно выкл. Две прошивки, без таймера с ШИМ и с таймером ШИМ

Re: Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Вт мар 09, 2021 06:33:52
Dimon456
Архив поврежден, нет информации для восстановления архива.

Провел эксперементик
Спойлер

Код: Выделить всё

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>

#include "com_io.h"
#include "button_lib.h"

ISR (TIMER0_OVF_vect) {
   
   static uint8_t conterTimer = 0;
    static uint8_t long_counter = 0;
    static uint8_t short_counter = 0;
    static uint8_t press_long = 0;
    static uint8_t press_short = 0;   
   
   static uint8_t c = 0;

	BtnExe();
   
   c++;

 //  if (button_pressed ()) {
   if (BtnGet() == BTN_LONG1) {  
    
      if (conterTimer < 255) conterTimer++;
      
      if (conterTimer == 40) {
         long_counter++;
         if (press_long == 0) {
              press_long = 1;
         }
                  
         conterTimer = 0;
      }                      
                           
   } else {
      if ((conterTimer > 0) && (conterTimer < 22)) {
         short_counter++;
          if (press_short == 0) {
                press_short = 1;
          }                                          
         conterTimer = 0;
         press_long = 0;       
       }
      
    }
   
                    putchar(13);
                    printf("ON: ");
                    printf("long_counter=%d", long_counter);                
                    putchar(13);      
   
   if (short_counter == 5) short_counter = 0;
   if (long_counter == 3) long_counter = 0;
   
   TCNT0 = 256;
}

int main()
 { 
   // Write your code here

	BtnInit();

   // пределитель на 1024, (1024*256)/8000000 = 0.032768 мкс
   // 1000ms/32,768 = 30тиков = за 1 сек

   TCCR0 = (1 << CS02) | (1 << CS00);
   TIMSK = (1 << TOIE0);
   TCNT0 = 256;
	
DDRB |= (1<<PINB2);
   // пределитель на 1
        TCCR1A = (1 << COM1B1) | (1 << WGM11);
		TCCR1B = (1 << CS10) | 0x19;
        ICR1 = 256; // frequency = 8000000/256 = 31.129 kHz,
		OCR1B = 125;

	sei();

	printf("\nHello, world!\n\r");

   while (1)
      ;
   return 0;
 }
Настройка библиотеки BtnExe

Код: Выделить всё

	#define BTN_LONG_TIME   1000					/* время фиксации длинного нажатия в милисекундах (1000 - 2500) */ 
Ваше прерывание ISR (TIMER0_OVF_vect) срабатывает со скоростью 37мс, время реакции на длительное нажатие составляет 3,7 сек, что с ШИМ что без ШИМ, как по заказу.
В терминал постоянно валится

Код: Выделить всё

ON: long_counter=0
Размер получившегося моего кода

Код: Выделить всё

Program:    2058 bytes
(.text + .data + .bootloader)

Data:         69 bytes
(.data + .bss + .noinit)

Re: Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Вт мар 09, 2021 10:20:22
Аlex
Dimon456 писал(а): что с ШИМ что без ШИМ
Что и требовалось доказать.
Только хотелось, чтобы автор сам это понял.

Re: Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Вт мар 09, 2021 20:00:28
beoro
[uquote="Аlex",url="/forum/viewtopic.php?p=3994194#p3994194"]
Dimon456 писал(а): что с ШИМ что без ШИМ
Что и требовалось доказать.
Только хотелось, чтобы автор сам это понял.[/uquote]

какая то странная ситуация после уменьшение частоты шим таймеру, все начало корректно эмулироваться в протеусе. Получается виновник Протеус! :o

Re: Замедление работы вектора внутреннего прерывания Atmega8

Добавлено: Вт мар 09, 2021 20:04:09
Dimon456
При чем тут шим, архив свой выложите.