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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

DronVolk писал(а):не могу понять смысл OCR1A/B, OCR1C.
OCR1A/B - 8 битные как я понял из даташита, а вот OCR1C 16 битный и в заголовке
он разбит на 2-е 8 битные переменные OCR1CH и OCR1CL то есть H - high L - low ....

OCR1A и OCR1B тоже 16-ти битные.
PlagueDoctor
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пн ноя 24, 2014 12:02:44

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

Сообщение PlagueDoctor »

uk8amk, добрые день! Вставил просто Ваши строчки

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

 OCR1CH = q>>8; 
OCR1CL = q&0xFF;

Всё, таймер, как миленький работает, всё хорошо. Вы не могли бы мне объяснить что и как происходит в нём? Вот в первой строчке - побитовый сдвиг вправо до 8 или на 8 я не понимаю. Во второй строчке побитовое И. Вот тоже это не понимаю. Чего уж таить. Если не трудно, объясните? А так, большое спасибо!
Аватара пользователя
DronVolk
Встал на лапы
Сообщения: 109
Зарегистрирован: Чт сен 03, 2015 15:52:10
Откуда: Сибирский федеральный округ

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

Сообщение DronVolk »

число в памяти занимает 16 бит это 2 байта. H-high старший бит L-low младный бит. Как было написсано выше обязательно нужно писать с начало один байт а потом другой но компилятор при обычном присваивании делает это наобород вот они и разбиты на 2-а 8 битных числа.
Сдвиг q>>8 переводит значение старшего байта в область младшего байта получается 8 битное число, q&0xFF обрезает старшие биты и из 16 числа получается 8 битное.
Последний раз редактировалось DronVolk Вс сен 06, 2015 11:06:04, всего редактировалось 1 раз.
я повелитель электронов! Но иногда появляются электроны бунтари и делают, что им вздумается, например, прокладывают новые пути движения...

"Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного." Альберт Эйнштейн.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

DronVolk писал(а):H-high старший бит L-low младный бит.

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

Мой уютный бложик... заходите!
Аватара пользователя
DronVolk
Встал на лапы
Сообщения: 109
Зарегистрирован: Чт сен 03, 2015 15:52:10
Откуда: Сибирский федеральный округ

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

Сообщение DronVolk »

меня отвлекали пока писал вот и проглядел)))
я повелитель электронов! Но иногда появляются электроны бунтари и делают, что им вздумается, например, прокладывают новые пути движения...

"Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного." Альберт Эйнштейн.
gavrasio
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Пн июн 01, 2015 15:23:01

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

Сообщение gavrasio »

здесь и далее по тексту каша из битов и байтов - местами они перепутаны, местами нет.

Спойлер//ШИМ по Т/С1 с точной фазой. Ширина импульса регулируется кнопками на PD2 и PD3( это
//прерывания по INT0 и INT1)
#include<avr/io.h>
#include<util/delay.h>
#include<avr/interrupt.h>
#define F_CPU 4000000UL
#define PORT_INIT PORTB = PORTC = PORTD = DDRD = DDRC = DDRB = 0xFF

int pwm = 512; //pwm может быть от 0 до 1023 (десятиразрядная ШИМ)

ISR (INT1_vect) //Обработка прерываний по INT1
{
_delay_us(200);
if(pwm<970)
pwm += 50; //Увеличивая pwm, уменьшаем ширину импульсов
}

ISR (INT0_vect) //Обработка прерываний по INT0
{
_delay_us(200);
if(pwm>50)
pwm -= 50; //Уменьшая pwm, увеличиааем ширину импульсов
}

ISR (TIMER1_OVF_vect)
{
OCR1A = pwm;
OCR1B = pwm;
}

int main (void)
{
PORT_INIT; //OC1A и OC1B должны быть выходами(PB1 и PB2)
DDRD = 0x0C; //PD2 и PD3 - входы( кнопки управления), запускаются прерывания по INT0 и INT1
TCCR1A = 0b10110011; //COM1A1 | COM1A0 | COM1B1 | COM1B0 | - | - | WGM11 | WGM10 |
//ШИМ с точной фазой, 10-ти разрядная(два последних бита),выход OC1A(PB1) сбрасывается в "ноль",
//выход OC1B(PB2) сбрасывается в единицу
TCCR1B = 0b00000001; //Делитель частоты не используется
TIMSK = 0b00000100; //Прерывание по переполнению Т/С1(бит TOIE1)
OCR1A = pwm; //Начальное значение ШИМ( регистр сравнения A)
OCR1B = pwm; //Начальное сравнение ШИМ( регистр сравнения В)
GIMSK = 0b11000000; MCUCR = 0b00001010; //Инициализация внешних прерываний INT0, INT1(GIMSK) по спаду(MCUCR)

sei ( );
while (true);


}- это последняя скобка в спойлер
Посмотри на мою поверочную програмку. Может поможет тебе в чём-то.Это Atmega8.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

gavrasio писал(а):Посмотри на мою поверочную програмку. Может поможет тебе в чём-то.
ваша проверочная программка может помочь понять, как категорически не следует делать:

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

ISR (INT1_vect) //Обработка прерываний по INT1
{
_delay_us(200); // ВОТ ЭТО КРАЙНЕ ПЛОХОЙ ПОДХОД. НИКОГДА ТАК НЕ ДЕЛАЙТЕ, ЕСЛИ ЭТО НЕ ЯВЛЯЕТСЯ ВОПРОСОМ ЖИЗНИ ИЛИ СМЕРТИ.
if(pwm<970)
pwm += 50; //Увеличивая pwm, уменьшаем ширину импульсов
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
gavrasio
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Пн июн 01, 2015 15:23:01

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

Сообщение gavrasio »

ваша проверочная программка может помочь понять, как категорически не следует делать:

[img]file:///home/extract/Downloads/screen97.png[/img]
Вот так эта програмка работает.А не посмотришь. Ваш "клёвый хостинг" img.radiokot.ru не берёт изображения.
Но, поверь, программа рабочая на сто. У меня есть много поверочных программ - и просто на тупое прерывание, и на захват, и на быстрый ШИМ и т.д.
А с _delay-ем что не в порядке? Стандартный приём. Типа защита от дребезга. Компилятор его разворачивает где-то на двадцаать тактов( если не набольше).
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

Дилей в прерывании? В преферансе и за меньшее сразу канделябром по рогам без предупреждения.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

gavrasio писал(а):А с _delay-ем что не в порядке? Стандартный приём. Типа защита от дребезга. Компилятор его разворачивает где-то на двадцаать тактов( если не набольше).
вам следует подучиться, причем серьезно.

как на 20 тактов может быть развернут delay, если вы требуете задержки на 200 микросекунд?! допустим, тактовая частота у вас 1 МГц (что само по себе редкость), тогда очевидно, что компилятор развернет delay в 200 тактов! с учетом того, что обычно тактовая частота выше, то и тактов будет пропорционально больше :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

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

Сообщение Pnjom-Penb »

ARV писал(а):

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

ISR (INT1_vect)
{
    _delay_us(200); // ... НИКОГДА ТАК НЕ ДЕЛАЙТЕ, ЕСЛИ ЭТО НЕ ЯВЛЯЕТСЯ ВОПРОСОМ ЖИЗНИ ИЛИ СМЕРТИ.
    ...


А если это вопрос жизни или смерти - тем более никогда так не делайте. :))) :))) :)))
gavrasio
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Пн июн 01, 2015 15:23:01

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

Сообщение gavrasio »

Дилей в прерывании? В преферансе и за меньшее сразу канделябром по рогам без предупреждения.

Я с Вами согласен на все сто. Нечего в прерываниях подолгу сидеть, особенно с делаями.Но возможности современных микроконтроллеров таковы, что им наплевать на все ограничения, которые были раньше. Сейчас эта тема не актуальна. Сейчас объём мозга программиста катит в тему, но никак объём МК.
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

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

Сообщение B@R5uk »

Подскажите, пожалуйста, есть ли в AVR возможность установить выход таймера (OCnx) в желаемое состояние (ноль), когда таймер выключен? Можно ли это сделать не меняя настройки и не переключая режим работы?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

gavrasio писал(а):Сейчас объём мозга программиста катит в тему, но никак объём МК.
не переусердствуйте со своим объемом: в одной теме вы for функцией называете, здесь задержками в прерываниях разбрасываетесь...

Pnjom-Penb писал(а):А если это вопрос жизни или смерти - тем более никогда так не делайте.
я имел виду случай, когда террорист ИГ приставил к вашему горлу нож и говорит - пиши delay или зарэжу! тогда можно :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

B@R5uk писал(а):Подскажите, пожалуйста, есть ли в AVR возможность установить выход таймера (OCnx) в желаемое состояние (ноль), когда таймер выключен? Можно ли это сделать не меняя настройки и не переключая режим работы?

Непонятный вопрос. Не меняя настроек и не переключая режим -- это как? Ничего совсем не трогая? Силой мысли? Нет, силой мысли пока нельзя.
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

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

Сообщение Pnjom-Penb »

ARV писал(а):я имел виду случай, когда ...
Я разумеется понял, о чем Вы говорили, просто, космическая наглость, помноженная на космическую же пустоту, как-то не вызывают серьезного к ним отношения. ("патамуиникусают...")
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

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

Сообщение B@R5uk »

a5021 писал(а):Не меняя настроек и не переключая режим -- это как?
Не трогая биты WGMn3:0, задающие режим работы таймера, и биты CSn2:0, включающие таймер.
gavrasio
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Пн июн 01, 2015 15:23:01

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

Сообщение gavrasio »

Подскажите, пожалуйста, есть ли в AVR возможность установить выход таймера (OCnx) в желаемое состояние (ноль)

Иницализация портов происходит в main Тут же происходит иницаилизация всех системных регистров. В чём проблема?
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

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

Сообщение B@R5uk »

Не понял при чём тут main, но проблема в том, что состояние OCnx хранится отдельно от соответствующего бита порта PORTx Pxn, так как состояние OCnx является внутренним битом компонента таймера Waveform Generator и не выведен ни в какой регистр, доступный для модификации (во всяком случае я не нашёл таковой в даташите).
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

Отключите канал: TCCRnA &= ~(1<<COMnA1) и дрыгайте этой ногой, как вам вздумается.
Ответить

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