Страница 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]
Ваши вроде слова ?

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]
Ваши вроде слова ?

[/uquote]
а прочесть далее, не?
Re: Замедление работы вектора внутреннего прерывания Atmega8
Добавлено: Пн мар 08, 2021 21:50:42
Dimon456
Re: Замедление работы вектора внутреннего прерывания Atmega8
Добавлено: Пн мар 08, 2021 21:59:46
Аlex
[uquote="beoro",url="/forum/viewtopic.php?p=3994056#p3994056"]а прочесть далее, не?[/uquote]А понять, о чём я спросил, не ?
Причём тут ШИМ и какие-то прерывания ? Как они связаны ?
Добавлено 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]А понять, о чём я спросил, не ?
Причём тут ШИМ и какие-то прерывания ? Как они связаны ?
Добавлено 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 сек, что с ШИМ что без ШИМ, как по заказу.
В терминал постоянно валится
Размер получившегося моего кодаКод: Выделить всё
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]
какая то странная ситуация после уменьшение частоты шим таймеру, все начало корректно эмулироваться в протеусе. Получается виновник Протеус!

Re: Замедление работы вектора внутреннего прерывания Atmega8
Добавлено: Вт мар 09, 2021 20:04:09
Dimon456
При чем тут шим, архив свой выложите.