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

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

Вт июл 28, 2020 22:50:54

ChipCard, у него там atmega16 и возможно другая версия. Просто поставьте точку останова на cnt++ внутри ISR и начните дебаг без остановки и без изменения битов в TCNT. Неужели не сработает прерывание? cnt как volatile обязательно только.

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

Ср июл 29, 2020 11:23:14

Ггг, сам второй день плююсь.

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


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

Добавлено after 11 minutes 51 second:
ChipCard, у него там atmega16 и возможно другая версия.

А у atmega16 как-то по другому таймер0 и прерывания работают? Версия студии там 6 - это 100%

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

Ср июл 29, 2020 11:42:23

ChipCard, симулятор по-другому может работать для атмега16. А версия там 6.0 вроде, а у вас может 6.2, к примеру. Я же не знаю какая у вас версия. Не доверяйте вы так симулятору. Сказано и показано же - глючит. Всё что угодно может влиять. Симулятор - он как бы не железо настоящее, что-то не симулируется, что-то работает не так.

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

Ср июл 29, 2020 12:04:29

ChipCard - AVR Toolchain устанавливается поверх студии. Ищите самую последнюю версию. Студию 4.19 можете отдельно поставить. Главное, чтобы не было конфликтов драйверов. Jungo, кажется, если установлены, значит не ставьте.
Мнение других вы слышали, мое мнение такое - боязнь сложностей. Считаю, что не нужно бояться сложностей (считайте это частью самовоспитания, характера, тренировки преодоления сложностей (но это не равно "в гамаке и стоя" ни в коей мере!)). Создание проектов и отладка в студии просто чуточку сложнее. Но когда привыкнешь, это перестанет быть сложным. Симуляция схем в протеусе на ваше усмотрение. Я всегда новый проект начинаю с макетирования. Это самая ненавистная часть работы. Но, все это окупается сторицей, потому что вот оно, в железе.

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

Ср июл 29, 2020 23:20:15

Дальнейшее обсуждение в этой теме не вижу смысла. Единственное, не замечаю, как устанавливается флаг TOV0. По идее он устанавливается перед переходом по вектору.
Вложения
timer_rk_020011.jpg
(179.3 KiB) Скачиваний: 332

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

Ср июл 29, 2020 23:45:50

Это вы должны прочитать в книжках. Даташитах. А не в симуляторе, который как вы, наверное, уже поняли, не всегда корректно отображает работу периферии. Теперь вы поняли, почему нужно штудировать, как работает архитектура мк? Чтобы отталкиваться в дальнейшем от ЗНАНИЯ.

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

Чт июл 30, 2020 00:02:43

По идее он устанавливается перед переходом по вектору.

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

Добавлено after 41 second:
Demiurg, даташит (равно как и "знание архитектуры") кстати вообще нихрена на этот вопрос не отвечает. Тут надо знать как компилятор avr-gcc работает, а это совсем отдельная история.

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

Чт июл 30, 2020 07:48:53

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

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

Чт июл 30, 2020 08:20:26

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

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

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

Стыдобище, господа!....

timer_rk_03.jpg
(40.06 KiB) Скачиваний: 306

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

Чт июл 30, 2020 10:29:00

Demiurg, вы сейчас вообще не в тему несете. Вам видимо настолько в голову засела мысль про "знание архитектуры", что ветвь дискуссии вы уже не видите и проблем. Глаза откройте и перечитайте о чем речь шла. А то хамить уже начали вообще не к месту. Стыдобище вам, потому что не видите в чем вопрос даже был, только за симулятор зацепились.

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

Чт июл 30, 2020 10:35:33

...

Дальнейшее обсуждение в этой теме не вижу смысла. Единственное, не замечаю, как устанавливается флаг TOV0. По идее он устанавливается перед переходом по вектору.

Никто из вас не показал, куда действительно нужно смотреть. А смотреть нужно в книжки, даташиты, структурные схемы. Вот про что я говорю, прежде чем советовать симуляторы, прочитайте внимательно вопрос вопрошающего. Мы закончили?

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

Чт июл 30, 2020 10:40:59

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

А это что:
Устанавливается железно периферией ДО перехода по вектору. Ставится он именно когда периферия детектирует событие.

?

Но вы не потрудились вникнуть в вопрос ChipCard. А был он не в этом даже. А в том, почему он флага в симуляторе не видит. Вы можете сколько угодно далдонить про "архитектуру", но тема про студию, а вопрос про симулятор. И вопрос был в том, почему именно в симуляторе не виден флаг прерывания. И я на него дал ответ. Потому что да, архитектура + особенности симулятора.

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

Чт июл 30, 2020 10:53:46

И я на него дал ответ. Потому что да, архитектура + особенности симулятора.

Да. Да! Я рад, что мы наконец-то пришли к консенсусу. Когда ты знаешь четко, что и как происходит в кишках мк, ты смело можешь плевать на то, что вытворяет любой симулятор. Лично мне по барабану глюки студии. Мне в ней комфортно работается. :))))

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

Пт дек 25, 2020 19:16:54

Если задать 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; , расположенную выше цикла, то все работае
Кто подскажет в чем ошибка?

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

Пт дек 25, 2020 20:07:32

дело в лишней ";"

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

Пт дек 25, 2020 20:31:11

дело в лишней ";"

Точно :shock: , огромнейшее Вам спасибо!

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

Чт янв 14, 2021 11:23:00

Всем привет! Появиласть задачаь заряжать акб автомобиля, "модулированым током 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;                             
      }
}

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

Чт янв 14, 2021 11:41:38

Помогите пожалуйста настроить таймер в 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:
Помогите пожалуйста разобраться.

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

Чт янв 14, 2021 11:43:41

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; //(перезапуск программного счетчика.)

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

Чт янв 14, 2021 11:47:12

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