Страница 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
люди, вы что, с нового года не отошли?!
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 не увенчались успехом

. Может кто сталкивался с такой задачей.

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 именно считать импульсы с внешнего генератора никак нельзя?

Я не знаю точно с какой частотой будут идти импульсы.
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;}