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


