Таймеры/счётчики в AVR

Обсуждаем контроллеры компании Atmel.
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Таймеры/счётчики в AVR

Сообщение NStorm »

ChipCard, у него там atmega16 и возможно другая версия. Просто поставьте точку останова на cnt++ внутри ISR и начните дебаг без остановки и без изменения битов в TCNT. Неужели не сработает прерывание? cnt как volatile обязательно только.
Реклама
Аватара пользователя
ChipCard
Открыл глаза
Сообщения: 42
Зарегистрирован: Чт июл 23, 2020 20:59:01
Откуда: СевКавТВ

Re: Таймеры/счётчики в AVR

Сообщение ChipCard »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3871743#p3871743"]Ггг, сам второй день плююсь.

Добрался до компьютера. AVR-Studio 4.19. AVR Toolchain. ...[/uquote]

Demiurg, а у вас avr toolchain отдельно устанавливался, и какой версии?

Добавлено after 11 minutes 51 second:
[uquote="NStorm",url="/forum/viewtopic.php?p=3872456#p3872456"]ChipCard, у него там atmega16 и возможно другая версия.[/uquote]
А у atmega16 как-то по другому таймер0 и прерывания работают? Версия студии там 6 - это 100%
Реклама
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Таймеры/счётчики в AVR

Сообщение NStorm »

ChipCard, симулятор по-другому может работать для атмега16. А версия там 6.0 вроде, а у вас может 6.2, к примеру. Я же не знаю какая у вас версия. Не доверяйте вы так симулятору. Сказано и показано же - глючит. Всё что угодно может влиять. Симулятор - он как бы не железо настоящее, что-то не симулируется, что-то работает не так.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Demiurg »

ChipCard - AVR Toolchain устанавливается поверх студии. Ищите самую последнюю версию. Студию 4.19 можете отдельно поставить. Главное, чтобы не было конфликтов драйверов. Jungo, кажется, если установлены, значит не ставьте.
Мнение других вы слышали, мое мнение такое - боязнь сложностей. Считаю, что не нужно бояться сложностей (считайте это частью самовоспитания, характера, тренировки преодоления сложностей (но это не равно "в гамаке и стоя" ни в коей мере!)). Создание проектов и отладка в студии просто чуточку сложнее. Но когда привыкнешь, это перестанет быть сложным. Симуляция схем в протеусе на ваше усмотрение. Я всегда новый проект начинаю с макетирования. Это самая ненавистная часть работы. Но, все это окупается сторицей, потому что вот оно, в железе.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ChipCard
Открыл глаза
Сообщения: 42
Зарегистрирован: Чт июл 23, 2020 20:59:01
Откуда: СевКавТВ

Re: Таймеры/счётчики в AVR

Сообщение ChipCard »

Дальнейшее обсуждение в этой теме не вижу смысла. Единственное, не замечаю, как устанавливается флаг TOV0. По идее он устанавливается перед переходом по вектору.
Вложения
timer_rk_020011.jpg
(179.3 КБ) 377 скачиваний
Реклама
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Demiurg »

Это вы должны прочитать в книжках. Даташитах. А не в симуляторе, который как вы, наверное, уже поняли, не всегда корректно отображает работу периферии. Теперь вы поняли, почему нужно штудировать, как работает архитектура мк? Чтобы отталкиваться в дальнейшем от ЗНАНИЯ.
Реклама
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Таймеры/счётчики в AVR

Сообщение NStorm »

По идее он устанавливается перед переходом по вектору.
Он там очищается )
Устанавливается железно периферией ДО перехода по вектору. Ставится он именно когда периферия детектирует событие. А уже потом проц видя взведенный флаг прерывания и разрешения на его выполнение, после завершения текущей инструкции, подменяет PC делая переход по вектору прерывания.
А вот очищается флаг прологом ISR, генерируемый компилятором. Если бы шагали по ASMовским инструкциям, то увидели бы это. В коде C вы этого не видите, потому что ни одной строчки C нет между этапами "флаг установлен", "флаг очищен".

Добавлено after 41 second:
Demiurg, даташит (равно как и "знание архитектуры") кстати вообще нихрена на этот вопрос не отвечает. Тут надо знать как компилятор avr-gcc работает, а это совсем отдельная история.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение ARV »

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

Мой уютный бложик... заходите!
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Demiurg »

NStorm, ARV - вы сейчас оба вводите в заблуждение всех, кто читает последние ваши сообщения. Встаньте оба в угол и подумайте над своим поведением. Намёк, вы симуляторы ставите наперёд знания архитектуры мк.

Я с 2007 года делаю отладку всех своих проектов в студии. Асм, си. Так как знаю архитектуру мк, ни единый глюк студии мне не мешает.

Берем толковую книжку или открываем даташит. В нем структурные схемы всех узлов периферии. И по этим схемам смотрим что и как. Справа вы увидите выходы таймера, которые дергают прерывания. Условия, по которым на этих выходах появляется активный уровень, четко прописаны в книжках и даташитах, притом вплоть до такта, что и когда будет происходить. Не в симуляторы нужно смотреть, а вдумчиво читать соответствующие разделы по архитектуре.

Стыдобище, господа!....
timer_rk_03.jpg
(40.06 КБ) 338 скачиваний
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Таймеры/счётчики в AVR

Сообщение NStorm »

Demiurg, вы сейчас вообще не в тему несете. Вам видимо настолько в голову засела мысль про "знание архитектуры", что ветвь дискуссии вы уже не видите и проблем. Глаза откройте и перечитайте о чем речь шла. А то хамить уже начали вообще не к месту. Стыдобище вам, потому что не видите в чем вопрос даже был, только за симулятор зацепились.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Demiurg »

[uquote="NStorm",url="/forum/viewtopic.php?p=3872898#p3872898"]...[/uquote]
[uquote="ChipCard",url="/forum/viewtopic.php?p=3872793#p3872793"]Дальнейшее обсуждение в этой теме не вижу смысла. Единственное, не замечаю, как устанавливается флаг TOV0. По идее он устанавливается перед переходом по вектору.[/uquote]
Никто из вас не показал, куда действительно нужно смотреть. А смотреть нужно в книжки, даташиты, структурные схемы. Вот про что я говорю, прежде чем советовать симуляторы, прочитайте внимательно вопрос вопрошающего. Мы закончили?
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Таймеры/счётчики в AVR

Сообщение NStorm »

Demiurg,
Изображение

А это что:
[uquote="NStorm",url="/forum/viewtopic.php?p=3872806#p3872806"]Устанавливается железно периферией ДО перехода по вектору. Ставится он именно когда периферия детектирует событие.[/uquote]
?

Но вы не потрудились вникнуть в вопрос ChipCard. А был он не в этом даже. А в том, почему он флага в симуляторе не видит. Вы можете сколько угодно далдонить про "архитектуру", но тема про студию, а вопрос про симулятор. И вопрос был в том, почему именно в симуляторе не виден флаг прерывания. И я на него дал ответ. Потому что да, архитектура + особенности симулятора.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Demiurg »

[uquote="NStorm",url="/forum/viewtopic.php?p=3872902#p3872902"]И я на него дал ответ. Потому что да, архитектура + особенности симулятора.[/uquote]
Да. Да! Я рад, что мы наконец-то пришли к консенсусу. Когда ты знаешь четко, что и как происходит в кишках мк, ты смело можешь плевать на то, что вытворяет любой симулятор. Лично мне по барабану глюки студии. Мне в ней комфортно работается. :))))
VladN
Родился
Сообщения: 8
Зарегистрирован: Пн июн 01, 2020 16:29:23

Re: Таймеры/счётчики в AVR

Сообщение VladN »

Если задать OCR0A в цикле, на выходе PD6 тишина

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

// atmega328p 
#define F_CPU 2000000UL 
#include <avr/io.h> 
    
int main(void)
{
    DDRD |= 1<<PD6;             

    TCCR0A |= 1<<(COM0A1) | 1<<(WGM00) | 1<<(COM0B1); 
    TCCR0B |= 1<<(CS00);   
        //OCR0A = 10; 

     while (1);
    {
				OCR0A = 100;
     
	}
	   return 0;

}
Если раскоментирова //OCR0A = 10; , расположенную выше цикла, то все работае
Кто подскажет в чем ошибка?
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Таймеры/счётчики в AVR

Сообщение Ivanoff-iv »

дело в лишней ";"
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
VladN
Родился
Сообщения: 8
Зарегистрирован: Пн июн 01, 2020 16:29:23

Re: Таймеры/счётчики в AVR

Сообщение VladN »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3948285#p3948285"]дело в лишней ";"[/uquote]
Точно :shock: , огромнейшее Вам спасибо!
neid
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Re: Таймеры/счётчики в AVR

Сообщение neid »

Всем привет! Появиласть задачаь заряжать акб автомобиля, "модулированым током 35Гц", т.е. пачки 1кГц промодулированы 35Гц, вроде так)))) Истории всей затеи такова, что вроде как лучше заряжается современный акб по технологии Са/Са, и в тоже время идет десульфатация пластин акб, плюс не кипит. Я новичок в программирование, учусь потихоньку. Накидал код, посмотрел что получилось в Протусе. Вопрос - правильно ли настроил таймеры, особенно таймер1 на 1кГц, с ним у меня вышло больше всего плясок с бубном, и правильное я выбрал направления реализации кода для данных задач? К критике адекватно восприимчив, приминаются все мысли, буду рад поучиться у людей более разбирающихся в этих темах и их примерах на практике. Спасибо всем!
Изображение

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

/*****************************************************
Chip type               : ATmega8
AVR Core Clock frequency: 8,000000 MHz
*****************************************************/

#include <mega8.h>

/*блок дефайнов***************************************************************************************************/
#define PWR1  PORTB.0 
#define PWR2  PORTB.1
/*****************************************************************************************************************/
 
/*объявляем прерменные********************************************************************************************/
unsigned char PWR_1;       //переменные, для изменения скважности ШИМ в программе
unsigned char PWR_1_b;     //переменные, для буферизации значений скважности ШИМ
unsigned char timer1;      //переменная-счетчик вызовов обработчика прерываний
unsigned char PWR_2;       //переменные, для изменения скважности ШИМ в программе
unsigned char PWR_2_b;     //переменные, для буферизации значений скважности ШИМ
unsigned char timer2;      //переменная-счетчик вызовов обработчика прерываний
/*****************************************************************************************************************/

// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
timer2++;
if (PWR1==1){                                 //Синхронизируем с 35Hz
if (timer2 == 0){                             //если счетчик переполнился и принял значение 0
        PWR_2_b   = PWR_2;                    //сохранием значения в буфер 
        PWR2=1;                               //выставляем ноги, отвечающие за ШИМ в логическую 1 
        }
if (PWR_2_b == timer2) { PWR2=0;}             //по достижении заданной скважности выводим логический 0 в ножку МК
        }
if(PWR1==0) {PWR2=0;}                              //не проскакивало иголок в паузе 35Hz       
}

// Timer2 output compare interrupt service routine
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
timer1++;
if (timer1 == 0){                              //если счетчик переполнился и принял значение 0
        PWR_1_b   = PWR_1;                     //сохранием значения в буфер 
        PWR1=1;                                //выставляем ноги, отвечающие за ШИМ в логическую 1 
        }
if (PWR_1_b == timer1) { PWR1 = 0;}            //по достижении заданной скважности выводим логический 0 в ножку МК
}

// Declare your global variables here

void main(void)
{
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out 
// State7=T State6=T State5=T State4=T State3=T State2=0 State1=0 State0=0 
PORTB=0x00;
DDRB=0x07;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x0F; //0F(15) при 8MHz чуть более 1080Hz получилось
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 250,000 kHz
// Mode: CTC top=OCR2
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x0B;
TCNT2=0x00;
OCR2=0x1B; //1F(31) - 35Hz при 250kHz, 6F(111)-35Hz при 1MHz

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x90;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")

while (1)
      {
      PWR_1=126; // зеполнение 50%
      PWR_2=10;                             
      }
}
Lilia
Родился
Сообщения: 19
Зарегистрирован: Чт янв 14, 2021 10:25:57

Re: Таймеры/счётчики в AVR

Сообщение Lilia »

Помогите пожалуйста настроить таймер в Attiny1607, новое поколение выпущенное Microchip.

Я хочу настроить таймер TCA 16bit на период 0.2мс(5КГц) в режиме частоты(frequency mode).
Я расчитываю CMP0 по формуле из даташита.

N = 16
CMP0 = 20000KHz/(2*N * 5KHz)-1 = 124 = 0x7C
Но при таких настройках таймер работает не правильно. Я подбирала по осциллограме с ножки PB0(WO0), получилось, что для настройки периода 0.2мс CMP0 = 0x14
Таймер настраивала так:

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

TCA0.SINGLE.CTRLA = 0x00;
TCA0.SINGLE.CMP0 = 0x14;
TCA0.SINGLE.CTRLB = 0x10|TCA_SINGLE_WGMODE_FRQ_gc;
TCA0.SINGLE.CTRLD = 0x00;
TCA0.SINGLE.CTRLECLR = 0x00;
TCA0.SINGLE.EVCTRL = 0x00;
TCA0.SINGLE.INTCTRL= TCA_SINGLE_OVF_bm |TCA_SINGLE_CMP0_bm;
TCA0.SINGLE.CNT = 0;
TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV16_gc;
TCA0.SINGLE.CTRLA |= TCA_SINGLE_ENABLE_bm;
В чем может быть проблема, как вы думаете?

А еще есть вторая проблема, с перываниями.
Я хочу настроить прерывание с частотой 2мс. Но в действительности ISR (TCA0_CMP0_vect) не срабатывает. Зато срабатывает ISR (TCA0_OVF_vect) с периодом ~0,05м :shock:
Помогите пожалуйста разобраться.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Таймеры/счётчики в AVR

Сообщение Ivanoff-iv »

2й таймер настроен неправильно...
да и не нужен 2й таймер для этой задачи...
______
1) настрой любой (пусть будет Т1) на 1кГц с режимом PWM и с генерацией прерывания
выход PWM (ШИМ) будет управлять зарядкой, а самим этим режимом будет управлять соответствующий ему регистр OCR. Т.е. режимом зарядки теперь можно управлять, изменяя OCR.
2) т.к. прерывание вызывается с частотой 1кГц, то этим можно воспользоваться - в прерывании инкрементировать переменную i (счетчик) и сравнивать её с 2мя константами С1=заполнение, С2=1000.
если i<C1 OCR=x иначе OCR=0; //(включение-отключение импульсов, х-ширина "иголок" заряда)
если i>C2 i=0; //(перезапуск программного счетчика.)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Таймеры/счётчики в AVR

Сообщение NStorm »

Как говорит Ivanoff-iv, только включить еще аппаратный шим (т.е. режим + канал OC1A или B), а не ногодрыг, как сейчас.
Ответить

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