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

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 3
Зарегистрирован: Пн янв 26, 2015 20:15:32

Сообщение u-Art »

while (1)
{
PORTB.0 = 1;
PORTB.0 = 0;
#asm
nop
... (Всего 12 nop)
nop
#endasm
}

Пока сделал так, в качестве эксперимента, странно, что скважность не более 7, если верить протеусу, видимо включение порта и отключение происходит более, чем за 2 такта.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

u-Art писал(а):Так, чтобы была возможность 2 такта держать лапку в 1, затем 8 тактов на лапке 0 и возврат к началу счета.
Вроде это режим Fast PWM top=OCR0A...
Когда мне надо было 1 такт "1" и 2 такта "0", мне посоветовали режим СТС.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

А как у Вы предлагаете организовать это в режиме СТС?
Единственный вариант я вижу через прерывания, используя второй регистр сравнения, но при таком количестве тактов прерывания замутить нереально..
Изображение
Вложения
CTC.png
(64.17 КБ) 837 скачиваний
Fucking static initialization order fiasco
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18693
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

люди, вы что, с нового года не отошли?! :shock: :shock: :shock:
Fast PWM timer mode элементарно решает проблему 2 такта единичка 8 тактов нолик!!!

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

#include <avr/io.h>
#include <avr/interrupt.h>

int main(void){
   OCR0A = 10;
   OCR0B = 2;
   TCCR0A = _BV(COM0B1) | _BV(WGM00) | _BV(WGM01);
   TCCR0B = _BV(WGM02) | _BV(CS00);
   DDRB = 0xFF;
   while(1);
}
Изображение
Вложения
fast_pwm.jpg
(101.22 КБ) 849 скачиваний
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Да я в таймерах плаваю...
_BV это установить бит?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18693
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

#define _BV(x) (1<<(x))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

ARV писал(а):Fast PWM timer mode элементарно решает проблему 2 такта единичка 8 тактов нолик!!!
Да, действительно. Но это если есть расширенная настройка таймера, как здесь:
Изображение
А если таймер упрощенный, то только эмуляцией
Вложения
PWM.png
(77 КБ) 882 скачивания
Fucking static initialization order fiasco
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18693
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

снова фантазии на отвлеченную тему? речь шла о тини13, не так ли? можно было бы еще сказать, что MCS51 в классическом исполнении вообще не позволяют таймеру тактироваться на частоте 9,6 МГц - а чо, это ведь так?

и далее - в каких именно AVR реализован "упрощенный" таймер без Fast PWM с регулируемым "верхом" (т.е. с изменяемой разрядностью счетчика ШИМ)? что-то память подводит...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Родился
Сообщения: 3
Зарегистрирован: Пн янв 26, 2015 20:15:32

Сообщение u-Art »

ARV Благодарю за ответ!

Я правильно понимаю, что в таком режиме таймера можно занять контроллер другими операциями?

Код немного смущает, это видимо не codevisionavr?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18693
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ШИМ реализуется аппаратно, поэтому ядро МК свободно полностью. Но таймер занят, и по вашим условиям даже нормальный обработчик прерываний на него не повесить.

код WinAVR, но в конкретном примере нет ничего, что не было бы совместимо с любыми иными компиляторами (макрос _BV раскрыл ранее).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 54
Зарегистрирован: Пт окт 03, 2014 14:41:16

Сообщение alexan9er »

ARV, а на скриншоте что за осцилограф? Из протеуса какой-то инструмент?
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

alexan9er писал(а): осцилограф Из протеуса
Он самый
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Родился
Сообщения: 6
Зарегистрирован: Пн мар 02, 2015 15:16:00

Сообщение FAIR »

Здравствуйте. Подскажите, пожалуйста, реально ли сделать так, чтобы таймер\счетчик 2 в Atmega88, считал импульсы так,как делает это таймер\счетчик 0 с пина T0, с переключением OCRx при совпадении?
Если я правильно понимаю, то это можно реализовать с помощью асинхронного режима, подключив мой прямоугольный сигнал к TOSC1. К сожалению, мои попытки так сделать в Proteus не увенчались успехом :dont_know: . Может кто сталкивался с такой задачей. :)
Последний раз редактировалось FAIR Пн мар 02, 2015 19:47:29, всего редактировалось 1 раз.
Вымогатель припоя
Аватара пользователя
Сообщения: 508
Зарегистрирован: Пт фев 22, 2013 18:00:43
Откуда: Беларусь, г. Гомель

Сообщение rxstart1 »

Глупость пишите таймер не считает импульсы он просто тикает :))
Родился
Сообщения: 6
Зарегистрирован: Пн мар 02, 2015 15:16:00

Сообщение FAIR »

Хорошо, можно ли сделать так, чтобы счетчик 2 считал импульсы с внешнего генератора?
Вымогатель припоя
Аватара пользователя
Сообщения: 508
Зарегистрирован: Пт фев 22, 2013 18:00:43
Откуда: Беларусь, г. Гомель

Сообщение rxstart1 »

да настроить таймер скажем по совпадению на пол секунды и в обработчике запустить счетчик, скажем count++, а в обработчике прерывания работать с результатом count=0; rez=count как то так
interrupt [EXT_INT0] void ext_int0_isr(void)
{
IntCount++; // Колличество прерываний увеличиваем на 1
}
//__________________________________________
//
// Обработчик прерывание TIMER1 по достижении 0.5 сек
//__________________________________________
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
FTaho=IntCount; // Запомнить в FTaho текущее колличествво прерываний
IntCount=0; // Обнулить счетчик количества прерываний
TCNT1=0; // Сбросить счетчик TIMER1
}
Родился
Сообщения: 6
Зарегистрирован: Пн мар 02, 2015 15:16:00

Сообщение FAIR »

Если я правильно понял, то таймер будет каждые, например, пол секунды, вызывать прерывание, в котором будет считаться количество таких прерываний. А заставить счетчик 2 именно считать импульсы с внешнего генератора никак нельзя? :roll: Я не знаю точно с какой частотой будут идти импульсы.
Вымогатель припоя
Аватара пользователя
Сообщения: 508
Зарегистрирован: Пт фев 22, 2013 18:00:43
Откуда: Беларусь, г. Гомель

Сообщение rxstart1 »

Блин еще раз попробую растолковать :))
таймер постоянно тикает ноги подвешеные на INT0 INT1 могут быть обработаны обработчиком прерываний и тут 2 варианта:
1. есть прерывание на ноге сохраняем показания счетчика таймера и сбрасываем его
2. есть событие прошло время захвата возвращаем колличество прерываний
так понятно???
если частота не известна, все ровно должен быть определен интервал от и до. Если и это неизвестно, то советую настроить совпадение по прошествию 1 сек
Родился
Сообщения: 6
Зарегистрирован: Пн мар 02, 2015 15:16:00

Сообщение FAIR »

Это я понимаю. Дело в том, что мне принципиально важно, чтобы счетчик 2 считал импульсы с внешнего генератора без использования внешних прерываний INT0 и INT1. Просто чтобы он работал, как счетчик импульсов внешнего генератора, в режиме по совпадению переключал пин OCx при совпадении. :)
Вымогатель припоя
Аватара пользователя
Сообщения: 508
Зарегистрирован: Пт фев 22, 2013 18:00:43
Откуда: Беларусь, г. Гомель

Сообщение rxstart1 »

типа такой конструкции if (pind.4==state) {CNT2=0;}
Ответить

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