Страница 25 из 72

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

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

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

Добавлено: Вс сен 06, 2015 09:28:03
PlagueDoctor
uk8amk, добрые день! Вставил просто Ваши строчки

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

 OCR1CH = q>>8; 
OCR1CL = q&0xFF;
Всё, таймер, как миленький работает, всё хорошо. Вы не могли бы мне объяснить что и как происходит в нём? Вот в первой строчке - побитовый сдвиг вправо до 8 или на 8 я не понимаю. Во второй строчке побитовое И. Вот тоже это не понимаю. Чего уж таить. Если не трудно, объясните? А так, большое спасибо!

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

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

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

Добавлено: Вс сен 06, 2015 10:35:07
ARV
DronVolk писал(а):H-high старший бит L-low младный бит.
здесь и далее по тексту каша из битов и байтов - местами они перепутаны, местами нет.

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

Добавлено: Вс сен 06, 2015 11:06:33
DronVolk
меня отвлекали пока писал вот и проглядел)))

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

Добавлено: Вс сен 20, 2015 15:02:56
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.

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

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

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

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

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

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

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

Добавлено: Вс сен 20, 2015 17:55:02
a5021
Дилей в прерывании? В преферансе и за меньшее сразу канделябром по рогам без предупреждения.

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

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

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

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

Добавлено: Вс сен 20, 2015 18:20:55
Pnjom-Penb
ARV писал(а):

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

ISR (INT1_vect)
{
    _delay_us(200); // ... НИКОГДА ТАК НЕ ДЕЛАЙТЕ, ЕСЛИ ЭТО НЕ ЯВЛЯЕТСЯ ВОПРОСОМ ЖИЗНИ ИЛИ СМЕРТИ.
    ...
А если это вопрос жизни или смерти - тем более никогда так не делайте. :))) :))) :)))

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

Добавлено: Вс сен 20, 2015 18:22:23
gavrasio
Дилей в прерывании? В преферансе и за меньшее сразу канделябром по рогам без предупреждения.
Я с Вами согласен на все сто. Нечего в прерываниях подолгу сидеть, особенно с делаями.Но возможности современных микроконтроллеров таковы, что им наплевать на все ограничения, которые были раньше. Сейчас эта тема не актуальна. Сейчас объём мозга программиста катит в тему, но никак объём МК.

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

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

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

Добавлено: Вс сен 20, 2015 19:06:24
ARV
gavrasio писал(а):Сейчас объём мозга программиста катит в тему, но никак объём МК.
не переусердствуйте со своим объемом: в одной теме вы for функцией называете, здесь задержками в прерываниях разбрасываетесь...
Pnjom-Penb писал(а):А если это вопрос жизни или смерти - тем более никогда так не делайте.
я имел виду случай, когда террорист ИГ приставил к вашему горлу нож и говорит - пиши delay или зарэжу! тогда можно :)))

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

Добавлено: Вс сен 20, 2015 19:14:25
a5021
B@R5uk писал(а):Подскажите, пожалуйста, есть ли в AVR возможность установить выход таймера (OCnx) в желаемое состояние (ноль), когда таймер выключен? Можно ли это сделать не меняя настройки и не переключая режим работы?
Непонятный вопрос. Не меняя настроек и не переключая режим -- это как? Ничего совсем не трогая? Силой мысли? Нет, силой мысли пока нельзя.

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

Добавлено: Вс сен 20, 2015 19:15:14
Pnjom-Penb
ARV писал(а):я имел виду случай, когда ...
Я разумеется понял, о чем Вы говорили, просто, космическая наглость, помноженная на космическую же пустоту, как-то не вызывают серьезного к ним отношения. ("патамуиникусают...")

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

Добавлено: Вс сен 20, 2015 19:19:07
B@R5uk
a5021 писал(а):Не меняя настроек и не переключая режим -- это как?
Не трогая биты WGMn3:0, задающие режим работы таймера, и биты CSn2:0, включающие таймер.

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

Добавлено: Вс сен 20, 2015 19:21:48
gavrasio
Подскажите, пожалуйста, есть ли в AVR возможность установить выход таймера (OCnx) в желаемое состояние (ноль)
Иницализация портов происходит в main Тут же происходит иницаилизация всех системных регистров. В чём проблема?

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

Добавлено: Вс сен 20, 2015 19:35:00
B@R5uk
Не понял при чём тут main, но проблема в том, что состояние OCnx хранится отдельно от соответствующего бита порта PORTx Pxn, так как состояние OCnx является внутренним битом компонента таймера Waveform Generator и не выведен ни в какой регистр, доступный для модификации (во всяком случае я не нашёл таковой в даташите).

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

Добавлено: Вс сен 20, 2015 19:43:13
a5021
Отключите канал: TCCRnA &= ~(1<<COMnA1) и дрыгайте этой ногой, как вам вздумается.