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

Обсуждаем контроллеры компании Atmel.
beoro
Родился
Сообщения: 14
Зарегистрирован: Ср дек 12, 2018 21:53:38

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

Сообщение 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,

Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

А в чем это замедление проявляется?
Реклама
beoro
Родился
Сообщения: 14
Зарегистрирован: Ср дек 12, 2018 21:53:38

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

Сообщение beoro »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3994013#p3994013"]А в чем это замедление проявляется?[/uquote]

увеличивается время срабатывания на нажатие кнопки с удержанием, без таймера 1 срабатывает все как надо
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

А как это время измеряете?
Реклама
Эиком - электронные компоненты и радиодетали
beoro
Родился
Сообщения: 14
Зарегистрирован: Ср дек 12, 2018 21:53:38

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

Сообщение beoro »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3994018#p3994018"]А как это время измеряете?[/uquote]

визуально оно же видно 2 сек без таймера 1, с таймером1 10 сек, ну и юартом :))
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

А как юартом измеряете?
Реклама
beoro
Родился
Сообщения: 14
Зарегистрирован: Ср дек 12, 2018 21:53:38

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

Сообщение 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;
}
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

А причём тут ШИМ и прерывания ?
beoro
Родился
Сообщения: 14
Зарегистрирован: Ср дек 12, 2018 21:53:38

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

Сообщение beoro »

[uquote="Аlex",url="/forum/viewtopic.php?p=3994046#p3994046"]А причём тут ШИМ и прерывания ?[/uquote]

в каком смысле?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

[uquote="beoro",url="/forum/viewtopic.php?p=3994002#p3994002"]когда подключенный таймер 1 в качестве шим замедляет работу вектору прерывания[/uquote]
Ваши вроде слова ? :roll:
beoro
Родился
Сообщения: 14
Зарегистрирован: Ср дек 12, 2018 21:53:38

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

Сообщение beoro »

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

а прочесть далее, не?
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

А это что такое?

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

TCNT0 = 256; 
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

[uquote="beoro",url="/forum/viewtopic.php?p=3994056#p3994056"]а прочесть далее, не?[/uquote]А понять, о чём я спросил, не ? :facepalm:

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

Добавлено after 4 minutes 29 seconds:
И причём тут ещё какие-то кнопки ?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
Starichok51
Модератор
Сообщения: 19048
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

beoro писал(а):TCNT0 = 256;
поместить двухбайтное число в один байт - это примерно, как в литровую банку налить 2 литра воды.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
beoro
Родился
Сообщения: 14
Зарегистрирован: Ср дек 12, 2018 21:53:38

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

Сообщение 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 сек должно вкл, еще раз нажать с удержанием должно выкл. Две прошивки, без таймера с ШИМ и с таймером ШИМ
Вложения
AVRGCC7.rar
(45.2 КБ) 211 скачиваний
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение 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)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Dimon456 писал(а): что с ШИМ что без ШИМ
Что и требовалось доказать.
Только хотелось, чтобы автор сам это понял.
beoro
Родился
Сообщения: 14
Зарегистрирован: Ср дек 12, 2018 21:53:38

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

Сообщение beoro »

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

какая то странная ситуация после уменьшение частоты шим таймеру, все начало корректно эмулироваться в протеусе. Получается виновник Протеус! :o
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

При чем тут шим, архив свой выложите.
Ответить

Вернуться в «AVR»