OCR1A и OCR1B тоже 16-ти битные.DronVolk писал(а): не могу понять смысл OCR1A/B, OCR1C.
OCR1A/B - 8 битные как я понял из даташита, а вот OCR1C 16 битный и в заголовке
он разбит на 2-е 8 битные переменные OCR1CH и OCR1CL то есть H - high L - low ....
Таймеры/счётчики в AVR
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Таймеры/счётчики в AVR
- Реклама
-
PlagueDoctor
- Первый раз сказал Мяу!
- Сообщения: 28
- Зарегистрирован: Пн ноя 24, 2014 12:02:44
Re: Таймеры/счётчики в AVR
uk8amk, добрые день! Вставил просто Ваши строчки
Всё, таймер, как миленький работает, всё хорошо. Вы не могли бы мне объяснить что и как происходит в нём? Вот в первой строчке - побитовый сдвиг вправо до 8 или на 8 я не понимаю. Во второй строчке побитовое И. Вот тоже это не понимаю. Чего уж таить. Если не трудно, объясните? А так, большое спасибо!
Код: Выделить всё
OCR1CH = q>>8;
OCR1CL = q&0xFF;- DronVolk
- Встал на лапы
- Сообщения: 109
- Зарегистрирован: Чт сен 03, 2015 15:52:10
- Откуда: Сибирский федеральный округ
Re: Таймеры/счётчики в AVR
число в памяти занимает 16 бит это 2 байта. H-high старший бит L-low младный бит. Как было написсано выше обязательно нужно писать с начало один байт а потом другой но компилятор при обычном присваивании делает это наобород вот они и разбиты на 2-а 8 битных числа.
Сдвиг q>>8 переводит значение старшего байта в область младшего байта получается 8 битное число, q&0xFF обрезает старшие биты и из 16 числа получается 8 битное.
Сдвиг q>>8 переводит значение старшего байта в область младшего байта получается 8 битное число, q&0xFF обрезает старшие биты и из 16 числа получается 8 битное.
Последний раз редактировалось DronVolk Вс сен 06, 2015 11:06:04, всего редактировалось 1 раз.
я повелитель электронов! Но иногда появляются электроны бунтари и делают, что им вздумается, например, прокладывают новые пути движения...
"Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного." Альберт Эйнштейн.
"Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного." Альберт Эйнштейн.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Таймеры/счётчики в AVR
здесь и далее по тексту каша из битов и байтов - местами они перепутаны, местами нет.DronVolk писал(а):H-high старший бит L-low младный бит.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- DronVolk
- Встал на лапы
- Сообщения: 109
- Зарегистрирован: Чт сен 03, 2015 15:52:10
- Откуда: Сибирский федеральный округ
Re: Таймеры/счётчики в AVR
меня отвлекали пока писал вот и проглядел)))
я повелитель электронов! Но иногда появляются электроны бунтари и делают, что им вздумается, например, прокладывают новые пути движения...
"Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного." Альберт Эйнштейн.
"Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного." Альберт Эйнштейн.
- Реклама
Re: Таймеры/счётчики в AVR
здесь и далее по тексту каша из битов и байтов - местами они перепутаны, местами нет.
Спойлер
//ШИМ по Т/С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
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Таймеры/счётчики в AVR
ваша проверочная программка может помочь понять, как категорически не следует делать:gavrasio писал(а):Посмотри на мою поверочную програмку. Может поможет тебе в чём-то.
Код: Выделить всё
ISR (INT1_vect) //Обработка прерываний по INT1
{
_delay_us(200); // ВОТ ЭТО КРАЙНЕ ПЛОХОЙ ПОДХОД. НИКОГДА ТАК НЕ ДЕЛАЙТЕ, ЕСЛИ ЭТО НЕ ЯВЛЯЕТСЯ ВОПРОСОМ ЖИЗНИ ИЛИ СМЕРТИ.
if(pwm<970)
pwm += 50; //Увеличивая pwm, уменьшаем ширину импульсов
} если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Таймеры/счётчики в AVR
[img]file:///home/extract/Downloads/screen97.png[/img]ваша проверочная программка может помочь понять, как категорически не следует делать:
Вот так эта програмка работает.А не посмотришь. Ваш "клёвый хостинг" img.radiokot.ru не берёт изображения.
Но, поверь, программа рабочая на сто. У меня есть много поверочных программ - и просто на тупое прерывание, и на захват, и на быстрый ШИМ и т.д.
А с _delay-ем что не в порядке? Стандартный приём. Типа защита от дребезга. Компилятор его разворачивает где-то на двадцаать тактов( если не набольше).
Re: Таймеры/счётчики в AVR
Дилей в прерывании? В преферансе и за меньшее сразу канделябром по рогам без предупреждения.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Таймеры/счётчики в AVR
вам следует подучиться, причем серьезно.gavrasio писал(а):А с _delay-ем что не в порядке? Стандартный приём. Типа защита от дребезга. Компилятор его разворачивает где-то на двадцаать тактов( если не набольше).
как на 20 тактов может быть развернут delay, если вы требуете задержки на 200 микросекунд?! допустим, тактовая частота у вас 1 МГц (что само по себе редкость), тогда очевидно, что компилятор развернет delay в 200 тактов! с учетом того, что обычно тактовая частота выше, то и тактов будет пропорционально больше
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
Pnjom-Penb
- Мучитель микросхем
- Сообщения: 469
- Зарегистрирован: Вс авг 30, 2015 03:52:59
Re: Таймеры/счётчики в AVR
А если это вопрос жизни или смерти - тем более никогда так не делайте.ARV писал(а):Код: Выделить всё
ISR (INT1_vect) { _delay_us(200); // ... НИКОГДА ТАК НЕ ДЕЛАЙТЕ, ЕСЛИ ЭТО НЕ ЯВЛЯЕТСЯ ВОПРОСОМ ЖИЗНИ ИЛИ СМЕРТИ. ...
Re: Таймеры/счётчики в AVR
Я с Вами согласен на все сто. Нечего в прерываниях подолгу сидеть, особенно с делаями.Но возможности современных микроконтроллеров таковы, что им наплевать на все ограничения, которые были раньше. Сейчас эта тема не актуальна. Сейчас объём мозга программиста катит в тему, но никак объём МК.Дилей в прерывании? В преферансе и за меньшее сразу канделябром по рогам без предупреждения.
- B@R5uk
- Собутыльник Кота
- Сообщения: 2896
- Зарегистрирован: Сб ноя 13, 2010 12:53:25
- Откуда: приходит весна?
Re: Таймеры/счётчики в AVR
Подскажите, пожалуйста, есть ли в AVR возможность установить выход таймера (OCnx) в желаемое состояние (ноль), когда таймер выключен? Можно ли это сделать не меняя настройки и не переключая режим работы?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Таймеры/счётчики в AVR
не переусердствуйте со своим объемом: в одной теме вы for функцией называете, здесь задержками в прерываниях разбрасываетесь...gavrasio писал(а):Сейчас объём мозга программиста катит в тему, но никак объём МК.
я имел виду случай, когда террорист ИГ приставил к вашему горлу нож и говорит - пиши delay или зарэжу! тогда можноPnjom-Penb писал(а):А если это вопрос жизни или смерти - тем более никогда так не делайте.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Таймеры/счётчики в AVR
Непонятный вопрос. Не меняя настроек и не переключая режим -- это как? Ничего совсем не трогая? Силой мысли? Нет, силой мысли пока нельзя.B@R5uk писал(а):Подскажите, пожалуйста, есть ли в AVR возможность установить выход таймера (OCnx) в желаемое состояние (ноль), когда таймер выключен? Можно ли это сделать не меняя настройки и не переключая режим работы?
-
Pnjom-Penb
- Мучитель микросхем
- Сообщения: 469
- Зарегистрирован: Вс авг 30, 2015 03:52:59
Re: Таймеры/счётчики в AVR
Я разумеется понял, о чем Вы говорили, просто, космическая наглость, помноженная на космическую же пустоту, как-то не вызывают серьезного к ним отношения. ("патамуиникусают...")ARV писал(а):я имел виду случай, когда ...
- B@R5uk
- Собутыльник Кота
- Сообщения: 2896
- Зарегистрирован: Сб ноя 13, 2010 12:53:25
- Откуда: приходит весна?
Re: Таймеры/счётчики в AVR
Не трогая биты WGMn3:0, задающие режим работы таймера, и биты CSn2:0, включающие таймер.a5021 писал(а):Не меняя настроек и не переключая режим -- это как?
Re: Таймеры/счётчики в AVR
Иницализация портов происходит в main Тут же происходит иницаилизация всех системных регистров. В чём проблема?Подскажите, пожалуйста, есть ли в AVR возможность установить выход таймера (OCnx) в желаемое состояние (ноль)
- B@R5uk
- Собутыльник Кота
- Сообщения: 2896
- Зарегистрирован: Сб ноя 13, 2010 12:53:25
- Откуда: приходит весна?
Re: Таймеры/счётчики в AVR
Не понял при чём тут main, но проблема в том, что состояние OCnx хранится отдельно от соответствующего бита порта PORTx Pxn, так как состояние OCnx является внутренним битом компонента таймера Waveform Generator и не выведен ни в какой регистр, доступный для модификации (во всяком случае я не нашёл таковой в даташите).
Re: Таймеры/счётчики в AVR
Отключите канал: TCCRnA &= ~(1<<COMnA1) и дрыгайте этой ногой, как вам вздумается.


