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

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

Добавлено: Пн янв 26, 2015 23:41:44
u-Art
while (1)
{
PORTB.0 = 1;
PORTB.0 = 0;
#asm
nop
... (Всего 12 nop)
nop
#endasm
}

Пока сделал так, в качестве эксперимента, странно, что скважность не более 7, если верить протеусу, видимо включение порта и отключение происходит более, чем за 2 такта.

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

Добавлено: Вт янв 27, 2015 09:39:46
Gudd-Head
u-Art писал(а):Так, чтобы была возможность 2 такта держать лапку в 1, затем 8 тактов на лапке 0 и возврат к началу счета.
Вроде это режим Fast PWM top=OCR0A...
Когда мне надо было 1 такт "1" и 2 такта "0", мне посоветовали режим СТС.

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

Добавлено: Вт янв 27, 2015 13:05:44
Pink-Pank
А как у Вы предлагаете организовать это в режиме СТС?
Единственный вариант я вижу через прерывания, используя второй регистр сравнения, но при таком количестве тактов прерывания замутить нереально..
Изображение

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

Добавлено: Вт янв 27, 2015 14:09:26
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);
}
Изображение

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

Добавлено: Вт янв 27, 2015 14:56:57
Gudd-Head
Да я в таймерах плаваю...
_BV это установить бит?

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

Добавлено: Вт янв 27, 2015 15:04:20
ARV
#define _BV(x) (1<<(x))

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

Добавлено: Ср янв 28, 2015 08:22:07
Pink-Pank
ARV писал(а):Fast PWM timer mode элементарно решает проблему 2 такта единичка 8 тактов нолик!!!
Да, действительно. Но это если есть расширенная настройка таймера, как здесь:
Изображение
А если таймер упрощенный, то только эмуляцией

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

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

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

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

Добавлено: Чт янв 29, 2015 00:08:10
u-Art
ARV Благодарю за ответ!

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

Код немного смущает, это видимо не codevisionavr?

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

Добавлено: Чт янв 29, 2015 07:38:24
ARV
ШИМ реализуется аппаратно, поэтому ядро МК свободно полностью. Но таймер занят, и по вашим условиям даже нормальный обработчик прерываний на него не повесить.

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

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

Добавлено: Чт янв 29, 2015 09:18:18
alexan9er
ARV, а на скриншоте что за осцилограф? Из протеуса какой-то инструмент?

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

Добавлено: Чт янв 29, 2015 09:20:45
Gudd-Head
alexan9er писал(а): осцилограф Из протеуса
Он самый

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

Добавлено: Пн мар 02, 2015 16:07:32
FAIR
Здравствуйте. Подскажите, пожалуйста, реально ли сделать так, чтобы таймер\счетчик 2 в Atmega88, считал импульсы так,как делает это таймер\счетчик 0 с пина T0, с переключением OCRx при совпадении?
Если я правильно понимаю, то это можно реализовать с помощью асинхронного режима, подключив мой прямоугольный сигнал к TOSC1. К сожалению, мои попытки так сделать в Proteus не увенчались успехом :dont_know: . Может кто сталкивался с такой задачей. :)

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

Добавлено: Пн мар 02, 2015 19:46:13
rxstart1
Глупость пишите таймер не считает импульсы он просто тикает :))

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

Добавлено: Пн мар 02, 2015 19:57:43
FAIR
Хорошо, можно ли сделать так, чтобы счетчик 2 считал импульсы с внешнего генератора?

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

Добавлено: Пн мар 02, 2015 20:02:19
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
}

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

Добавлено: Пн мар 02, 2015 20:25:34
FAIR
Если я правильно понял, то таймер будет каждые, например, пол секунды, вызывать прерывание, в котором будет считаться количество таких прерываний. А заставить счетчик 2 именно считать импульсы с внешнего генератора никак нельзя? :roll: Я не знаю точно с какой частотой будут идти импульсы.

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

Добавлено: Пн мар 02, 2015 20:42:58
rxstart1
Блин еще раз попробую растолковать :))
таймер постоянно тикает ноги подвешеные на INT0 INT1 могут быть обработаны обработчиком прерываний и тут 2 варианта:
1. есть прерывание на ноге сохраняем показания счетчика таймера и сбрасываем его
2. есть событие прошло время захвата возвращаем колличество прерываний
так понятно???
если частота не известна, все ровно должен быть определен интервал от и до. Если и это неизвестно, то советую настроить совпадение по прошествию 1 сек

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

Добавлено: Пн мар 02, 2015 20:57:58
FAIR
Это я понимаю. Дело в том, что мне принципиально важно, чтобы счетчик 2 считал импульсы с внешнего генератора без использования внешних прерываний INT0 и INT1. Просто чтобы он работал, как счетчик импульсов внешнего генератора, в режиме по совпадению переключал пин OCx при совпадении. :)

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

Добавлено: Пн мар 02, 2015 21:52:21
rxstart1
типа такой конструкции if (pind.4==state) {CNT2=0;}