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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Jman
Мучитель микросхем
Сообщения: 414
Зарегистрирован: Ср янв 26, 2011 13:43:30
Откуда: С того берега моря
Контактная информация:

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

Сообщение Jman »

akl писал(а):Задаём в OCR1A значение K=(1000*Fclk/1000000-1). В каждом прерывании инвертируем состояние выбранной ножки и увеличиваем значение OCR1A на K.
Объясните пожалуйста подробнее, желательно с кодом, если вас не затруднит....
Сделал вот так:

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

#include <mega16.h>
#define pulse PORTA.0

// Timer1 output compare A interrupt service routine
int s = 0; // переменная для хранения секунд

// Обработка прерывания по совпадению
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
   s++; // увеличиваем переменную каждую секунду
        pulse= ~pulse; 

TCNT1=0; //обнуляем таймер
}
Считал так. 8000000/1024 = 7813; 7813/15 = 520. Пишу 15 в регистр сравнения OCR1A. Частота на выходе 250 Гц. Делю 15/2 пишу в регистр OCR1A число 7, на выходе пина четко 500 Гц... Не знаю, правильно ли я посчитал. Как мне не обнулять таймер, но вывести меандр?
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Реклама
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

Re: CodeVision AVR в вопросах и ответах

Сообщение mixon46 »

мне еще нужен шим на tiny13. PORTB.1 36 кгц. у мк тини 13 есть только один 8 битный таймер счетчик.


TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

помогите разобраться с регистрами.
для управления таймером счетчиком есть два регистра TCCR0A и TCCR0B
регистр TCCR0A начну с него

COM0A1, COM0A0, COM0B1, COM0B0, reserved, reserved, WGM01, WGM00

Биты WGM01, WGM00 отвечают за режим таймера счетчика

Биты COM0A1, COM0A0 отвечают за вывод OC0A

Биты COM0B1, COM0B0 отвечают за вывод OC0B

Из этого я делаю вывод что мне нужно использовать COM0B1, COM0B0, WGM01, WGM00 биты.



Далее регистр TCCR0B

FOC0A, FOC0B, reserved, reserved, WGM02, CS02, CS01, CS00

Биты CS02, CS01, CS00 отвечают за деление тактового сигнала для таймера счетчика

Биты FOC0A, FOC0B устанавливают принудительно сигнал на выходе OC0A и OC0B

Их этого я делаю вывод что мне могут пригодится CS02, CS01, CS00 биты для деления сигнала

Далее регистр TCNT0
Это счетный регистр, он считает от 0 до 255

Далее регистр сравнения OCR0B, регистр OCR0A мне не понадобится. Сюда я запишу значение для получения нужной частоты сигнала шим?

Так как мне настроить биты регистров что бы получить нужный мне шим на ножке PORTB1?
Последний раз редактировалось Gudd-Head Пн авг 10, 2015 13:04:43, всего редактировалось 1 раз.
Причина: Сюда перенёс.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18657
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

mixon46 писал(а):Так как мне настроить биты регистров что бы получить нужный мне шим на ножке PORTB1?
в даташите есть отличная табличка, в которой перечислены все режимы ШИМ таймера и соответствующие значения всех управляющих битов. вы можете настроить режим по этой таблице.

что касается битов CS02, CS01, CS00 - они определяют частоту счета таймера, тем самым влияя на период ШИМ

при помощи битов COM0xx вы можете управлять режимом переключения выходного сигнала, формируя тем самым "прямой" ШИМ, "инверсный" ШИМ или "меандр".

все очень детально написано в соответствующем разделе даташита - приведены таблички с пояснениями.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

я ж не умею по английски читать. помогите мне настроить шим 36 кгц с заполнением окна 50%

если записать в регистр OCR0B разные числа то меняется % заполнения окна. а частоту то как поставить 36 кгц?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18657
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Если вам нужен меандр (50% заполнение) без возможности это самое заполнение менять, то легко можно получить ровно 36 килогерц (внимание: тактирование от встроенного RC-генератора 1,8 МГц):

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

DDRB = (1<<PB1);
TCCR0A = (1<<COM0B0) | (1<<WGM01); // режим CTC и Toggle OC0B
OCR0B = 25; // для частоты 36 кГц период 50 тиков таймера, 25 - это 50%
TCCR0B = 1; // без предделителя (тактирование 1,8 МГц)
Если нужен именно ШИМ, то ровно 36 килогерц не получится, но получится близко к нему 37,5 килогерц, можно попробовать подогнать частоту при помощи OSCCAL (внимание: тактирование от встроенного RC-генератора 9,6 МГц):

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

DDRB = (1<<PB1);
TCCR0A = (1<<COM0B1) | (1<<WGM00) | (1<<WGM01); // режим FastPWM и Clear OC0B
OCR0B = 127; // 50% от 255
TCCR0B = 1; // без предделителя (тактирование 9,6 МГц)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

9.6 мгц \ 256= 37.5 кгц. да так я могу сделать. но будет ли на такой частоте ик приемник принимать сигналы. будет наверно но хуже чем если бы частота была бы одинаковой.

1.8 мгц это как? я знаю что есть 3 частоты 128 кгц, 4.8 мгц и 9.6 мгц RC обвязок генератора. спасибо за инфу. про второй пример я примерно знал. про первый не знал вовсе


вот у меня получилось промодулировать сигнал. правда частота да 37.5 кгц. что немного не подходит для моих целей но попробовать все таки можно. или же купить приемник на 37.5 если они конечно продаются на такую частоту
Вложения
ауакуа.jpg
(174.13 КБ) 567 скачиваний
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18657
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

если вы городите систему инфракрасного управления, то:
1. лично мне попадались приемники TSOP на частоту 38 килогерц гораздо чаще, чем на 36. 37,5 ближе к 38 :)
2. для передачи кода RC5 я делал "библиотечку", которая вообще не использует аппаратные режимы таймера для генерации несущей - вам необходимо обязательно аппаратно генерировать все?
3. попробуйте менять значение регистра OSCCAL, как я вам рекомендовал - возможно, вам удастся подогнать частоту до нужного значения
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

Можно и на 38 кгц купить попробовать. Я юзаю не RC5. У меня массив и каждый бит через 2 мсек отправляется в порт. Просто и легко

flash unsigned char a[16]={1,0,1,1,0,0,....};
void main (void)
{
unsigned char b;
PORTB=0x04;
DDRB=0x0B;

TCCR0A=0x00;
TCCR0B=0x01;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;


while (1)
{
while (PINB.2==1){}
TCCR0A=0x23;
OCR0B=0x80;
for (b=0; b<16; b++)
{ PORTB=a;
delay_ms (2);
};
PORTB.0=0;
TCCR0A=0x00;
delay_ms (40);
};


}



далее приемник который я еще не довел до ума. принимает каждый бит и записывает его в память. после проверяет с уже записанным кодом. и если код верен то переводит режим устройства.

в память записаны 16 байт. а принимаю я 16 бит. я еще не разобрался как можно было бы записать в массив всего 2 байта. а потом сверять биты. поэтому пока что так

вам необходимо обязательно аппаратно генерировать все?


а что можно не использовав шим от таймера еще как то промодулировать сигнал? ну можно конечно например таймером 555. да но мне нужен брелочек маленький-малопотребляющий ик диод, смд 13 тини, батарейка таблетка. вот все что нужно для брелочка.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18657
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

вот мой "брелочек" - не без недостатков, но работает: http://www.simple-devices.ru/prj/9-elec ... te-control
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

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

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

Сообщение ARV »

какие фотки? я вам ссылку на проект дал - там и фотки, и видео, и описание и исходники
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

ну я вижу видео есть. я статью правда не читал. внизу под статьей есть прошивка и исходники для WinAvr. Не могу посмотреть я пользуюсь Code Vision Avr

вот а сейчас фотка загрузилась. да хороший пультик. но я хотел еще проще сделать. одна кнопка для включения питания мк, один ик светодиод, мк и батарейка. все больше нечего усложнять. нужно всего лишь передать код из пары байт и все
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18657
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

в исходниках способ генерации несущей без всяких таймеров. в статье - подробности. почитайте.
не хотите - я ж не заставляю :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

я вот думаю если у тини 13 есть ацп то может есть резон купить что нибудь более простое и главное подходящее по составу для моей цели? допустим тини 10 или 15. хотя я про них не читал
Kamelot
Открыл глаза
Сообщения: 64
Зарегистрирован: Пн июн 22, 2015 08:30:17

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

Сообщение Kamelot »

Нащел на просторах интернета такой вот код, дешифратор rc5.
автор использует таймер 1. в инициализации есть код

/* Reset Timer1 Counter */
TCCR1A = 0;
/* Enable Timer1 in normal mode with /8 clock prescaling */
/* One tick is 500ns with 16MHz clock */
TCCR1B = _BV(CS11);

потом в коде встречаются только сточки TCNT1 = 0;

ни обработчиков прерывания таймера ни чтения из регистра TCNT1 я не нашел, зачем автор использует этот таймер?
ссылка с исхрдниками
https://github.com/pinkeen/avr-rc5/blob/master/rc5.c
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Так у автора и спросите. Кому охота копаться в чужом говне коде?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

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

Сообщение DarkWolf »

Всем привет. Столкнулся с такой проблемой.. необходимо настроить 8 битный таймер на чстоту срабатывания 2Гц. 16 битный таймер занят другой работой и использовать его нет возможности.
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

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

Сообщение amd9800 »

Какой МК?
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

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

Сообщение DarkWolf »

amd9800 писал(а):Какой МК?
МК ATmega324P, работает на частоте 1,250 МГц (10Мгц/8).
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Тогда только софтово (залепить счётчик в прерывания)...
Или использовать внешний генератор в качестве тактового для таймера.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Ответить

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