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

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

Пн мар 08, 2021 20:32:49

Доброе время суток всем!

Сложилась такая ситуация с контроллером 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

А в чем это замедление проявляется?

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

Пн мар 08, 2021 21:00:29

А в чем это замедление проявляется?


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

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

Пн мар 08, 2021 21:03:13

А как это время измеряете?

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

Пн мар 08, 2021 21:05:51

А как это время измеряете?


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

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

Пн мар 08, 2021 21:17:25

А как юартом измеряете?

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

Пн мар 08, 2021 21:30:42

А как юартом измеряете?


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

Код:

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

А причём тут ШИМ и прерывания ?

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

Пн мар 08, 2021 21:40:04

А причём тут ШИМ и прерывания ?


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

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

Пн мар 08, 2021 21:44:46

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

Ваши вроде слова ? :roll:

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

Пн мар 08, 2021 21:49:46

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

Ваши вроде слова ? :roll:


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

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

Пн мар 08, 2021 21:50:42

А это что такое?
Код:
TCNT0 = 256;

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

Пн мар 08, 2021 21:59:46

а прочесть далее, не?
А понять, о чём я спросил, не ? :facepalm:

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

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

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

Пн мар 08, 2021 22:38:36

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

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

Пн мар 08, 2021 22:49:04

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

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

Пн мар 08, 2021 23:13:25

а прочесть далее, не?
А понять, о чём я спросил, не ? :facepalm:

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

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


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

прикрепил файлы проекта. При длинном нажатии кнопку с удержаниеем более 2 сек должно вкл, еще раз нажать с удержанием должно выкл. Две прошивки, без таймера с ШИМ и с таймером ШИМ
Вложения
AVRGCC7.rar
(45.2 KiB) Скачиваний: 197

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

Вт мар 09, 2021 06:33:52

Архив поврежден, нет информации для восстановления архива.

Провел эксперементик
Спойлер
Код:
#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

Dimon456 писал(а): что с ШИМ что без ШИМ
Что и требовалось доказать.
Только хотелось, чтобы автор сам это понял.

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

Вт мар 09, 2021 20:00:28

Dimon456 писал(а): что с ШИМ что без ШИМ
Что и требовалось доказать.
Только хотелось, чтобы автор сам это понял.


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

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

Вт мар 09, 2021 20:04:09

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