Таймеры/счётчики в AVR
Re: Таймеры/счётчики в AVR
ChipCard, у него там atmega16 и возможно другая версия. Просто поставьте точку останова на cnt++ внутри ISR и начните дебаг без остановки и без изменения битов в TCNT. Неужели не сработает прерывание? cnt как volatile обязательно только.
- Реклама
Re: Таймеры/счётчики в AVR
[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%
Добрался до компьютера. 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%
Re: Таймеры/счётчики в AVR
ChipCard, симулятор по-другому может работать для атмега16. А версия там 6.0 вроде, а у вас может 6.2, к примеру. Я же не знаю какая у вас версия. Не доверяйте вы так симулятору. Сказано и показано же - глючит. Всё что угодно может влиять. Симулятор - он как бы не железо настоящее, что-то не симулируется, что-то работает не так.
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Таймеры/счётчики в AVR
ChipCard - AVR Toolchain устанавливается поверх студии. Ищите самую последнюю версию. Студию 4.19 можете отдельно поставить. Главное, чтобы не было конфликтов драйверов. Jungo, кажется, если установлены, значит не ставьте.
Мнение других вы слышали, мое мнение такое - боязнь сложностей. Считаю, что не нужно бояться сложностей (считайте это частью самовоспитания, характера, тренировки преодоления сложностей (но это не равно "в гамаке и стоя" ни в коей мере!)). Создание проектов и отладка в студии просто чуточку сложнее. Но когда привыкнешь, это перестанет быть сложным. Симуляция схем в протеусе на ваше усмотрение. Я всегда новый проект начинаю с макетирования. Это самая ненавистная часть работы. Но, все это окупается сторицей, потому что вот оно, в железе.
Мнение других вы слышали, мое мнение такое - боязнь сложностей. Считаю, что не нужно бояться сложностей (считайте это частью самовоспитания, характера, тренировки преодоления сложностей (но это не равно "в гамаке и стоя" ни в коей мере!)). Создание проектов и отладка в студии просто чуточку сложнее. Но когда привыкнешь, это перестанет быть сложным. Симуляция схем в протеусе на ваше усмотрение. Я всегда новый проект начинаю с макетирования. Это самая ненавистная часть работы. Но, все это окупается сторицей, потому что вот оно, в железе.
Re: Таймеры/счётчики в AVR
Дальнейшее обсуждение в этой теме не вижу смысла. Единственное, не замечаю, как устанавливается флаг TOV0. По идее он устанавливается перед переходом по вектору.
- Вложения
-
- timer_rk_020011.jpg
- (179.3 КБ) 377 скачиваний
- Реклама
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Таймеры/счётчики в AVR
Это вы должны прочитать в книжках. Даташитах. А не в симуляторе, который как вы, наверное, уже поняли, не всегда корректно отображает работу периферии. Теперь вы поняли, почему нужно штудировать, как работает архитектура мк? Чтобы отталкиваться в дальнейшем от ЗНАНИЯ.
Re: Таймеры/счётчики в AVR
Он там очищается )По идее он устанавливается перед переходом по вектору.
Устанавливается железно периферией ДО перехода по вектору. Ставится он именно когда периферия детектирует событие. А уже потом проц видя взведенный флаг прерывания и разрешения на его выполнение, после завершения текущей инструкции, подменяет PC делая переход по вектору прерывания.
А вот очищается флаг прологом ISR, генерируемый компилятором. Если бы шагали по ASMовским инструкциям, то увидели бы это. В коде C вы этого не видите, потому что ни одной строчки C нет между этапами "флаг установлен", "флаг очищен".
Добавлено after 41 second:
Demiurg, даташит (равно как и "знание архитектуры") кстати вообще нихрена на этот вопрос не отвечает. Тут надо знать как компилятор avr-gcc работает, а это совсем отдельная история.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Таймеры/счётчики в AVR
знание архитектуры при неработающем инструменте отладки никак не помогает при отладке, поскольку отладка - это отработка программы, а не аппаратуры. если создать ситуацию, когда программный участок получает управление, нельзя по причине неработоспособности симулятора, то никакое знание о железе не поможет этот участок программы отладить.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Таймеры/счётчики в AVR
NStorm, ARV - вы сейчас оба вводите в заблуждение всех, кто читает последние ваши сообщения. Встаньте оба в угол и подумайте над своим поведением. Намёк, вы симуляторы ставите наперёд знания архитектуры мк.
Я с 2007 года делаю отладку всех своих проектов в студии. Асм, си. Так как знаю архитектуру мк, ни единый глюк студии мне не мешает.
Берем толковую книжку или открываем даташит. В нем структурные схемы всех узлов периферии. И по этим схемам смотрим что и как. Справа вы увидите выходы таймера, которые дергают прерывания. Условия, по которым на этих выходах появляется активный уровень, четко прописаны в книжках и даташитах, притом вплоть до такта, что и когда будет происходить. Не в симуляторы нужно смотреть, а вдумчиво читать соответствующие разделы по архитектуре.
Стыдобище, господа!....
Я с 2007 года делаю отладку всех своих проектов в студии. Асм, си. Так как знаю архитектуру мк, ни единый глюк студии мне не мешает.
Берем толковую книжку или открываем даташит. В нем структурные схемы всех узлов периферии. И по этим схемам смотрим что и как. Справа вы увидите выходы таймера, которые дергают прерывания. Условия, по которым на этих выходах появляется активный уровень, четко прописаны в книжках и даташитах, притом вплоть до такта, что и когда будет происходить. Не в симуляторы нужно смотреть, а вдумчиво читать соответствующие разделы по архитектуре.
Стыдобище, господа!....
Re: Таймеры/счётчики в AVR
Demiurg, вы сейчас вообще не в тему несете. Вам видимо настолько в голову засела мысль про "знание архитектуры", что ветвь дискуссии вы уже не видите и проблем. Глаза откройте и перечитайте о чем речь шла. А то хамить уже начали вообще не к месту. Стыдобище вам, потому что не видите в чем вопрос даже был, только за симулятор зацепились.
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Таймеры/счётчики в AVR
[uquote="NStorm",url="/forum/viewtopic.php?p=3872898#p3872898"]...[/uquote]
[uquote="ChipCard",url="/forum/viewtopic.php?p=3872793#p3872793"]Дальнейшее обсуждение в этой теме не вижу смысла. Единственное, не замечаю, как устанавливается флаг TOV0. По идее он устанавливается перед переходом по вектору.[/uquote]
Никто из вас не показал, куда действительно нужно смотреть. А смотреть нужно в книжки, даташиты, структурные схемы. Вот про что я говорю, прежде чем советовать симуляторы, прочитайте внимательно вопрос вопрошающего. Мы закончили?
[uquote="ChipCard",url="/forum/viewtopic.php?p=3872793#p3872793"]Дальнейшее обсуждение в этой теме не вижу смысла. Единственное, не замечаю, как устанавливается флаг TOV0. По идее он устанавливается перед переходом по вектору.[/uquote]
Никто из вас не показал, куда действительно нужно смотреть. А смотреть нужно в книжки, даташиты, структурные схемы. Вот про что я говорю, прежде чем советовать симуляторы, прочитайте внимательно вопрос вопрошающего. Мы закончили?
Re: Таймеры/счётчики в AVR
Demiurg,

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

А это что:
[uquote="NStorm",url="/forum/viewtopic.php?p=3872806#p3872806"]Устанавливается железно периферией ДО перехода по вектору. Ставится он именно когда периферия детектирует событие.[/uquote]
?
Но вы не потрудились вникнуть в вопрос ChipCard. А был он не в этом даже. А в том, почему он флага в симуляторе не видит. Вы можете сколько угодно далдонить про "архитектуру", но тема про студию, а вопрос про симулятор. И вопрос был в том, почему именно в симуляторе не виден флаг прерывания. И я на него дал ответ. Потому что да, архитектура + особенности симулятора.
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Таймеры/счётчики в AVR
[uquote="NStorm",url="/forum/viewtopic.php?p=3872902#p3872902"]И я на него дал ответ. Потому что да, архитектура + особенности симулятора.[/uquote]
Да. Да! Я рад, что мы наконец-то пришли к консенсусу. Когда ты знаешь четко, что и как происходит в кишках мк, ты смело можешь плевать на то, что вытворяет любой симулятор. Лично мне по барабану глюки студии. Мне в ней комфортно работается.
)
Да. Да! Я рад, что мы наконец-то пришли к консенсусу. Когда ты знаешь четко, что и как происходит в кишках мк, ты смело можешь плевать на то, что вытворяет любой симулятор. Лично мне по барабану глюки студии. Мне в ней комфортно работается.
Re: Таймеры/счётчики в AVR
Если задать OCR0A в цикле, на выходе PD6 тишина
Если раскоментирова //OCR0A = 10; , расположенную выше цикла, то все работае
Кто подскажет в чем ошибка?
Код: Выделить всё
// 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;
}Кто подскажет в чем ошибка?
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Таймеры/счётчики в AVR
дело в лишней ";"
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: Таймеры/счётчики в AVR
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3948285#p3948285"]дело в лишней ";"[/uquote]
Точно
, огромнейшее Вам спасибо!
Точно
Re: Таймеры/счётчики в AVR
Всем привет! Появиласть задачаь заряжать акб автомобиля, "модулированым током 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
Помогите пожалуйста настроить таймер в 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
Таймер настраивала так:
В чем может быть проблема, как вы думаете?
А еще есть вторая проблема, с перываниями.
Я хочу настроить прерывание с частотой 2мс. Но в действительности ISR (TCA0_CMP0_vect) не срабатывает. Зато срабатывает ISR (TCA0_OVF_vect) с периодом ~0,05м
Помогите пожалуйста разобраться.
Я хочу настроить таймер 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м
Помогите пожалуйста разобраться.
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Таймеры/счётчики в AVR
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; //(перезапуск программного счетчика.)
да и не нужен 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
Как говорит Ivanoff-iv, только включить еще аппаратный шим (т.е. режим + канал OC1A или B), а не ногодрыг, как сейчас.


