Страница 23 из 72
Re: Таймеры/счётчики в AVR
Добавлено: Пт июл 24, 2015 12:21:03
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 Гц... Не знаю, правильно ли я посчитал. Как мне не обнулять таймер, но вывести меандр?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн авг 10, 2015 12:53:55
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?
Re: Таймеры/счётчики в AVR
Добавлено: Пн авг 10, 2015 13:10:23
ARV
mixon46 писал(а):Так как мне настроить биты регистров что бы получить нужный мне шим на ножке PORTB1?
в даташите есть отличная табличка, в которой перечислены все режимы ШИМ таймера и соответствующие значения всех управляющих битов. вы можете настроить режим по этой таблице.
что касается битов CS02, CS01, CS00 - они определяют частоту счета таймера, тем самым влияя на период ШИМ
при помощи битов COM0xx вы можете управлять режимом переключения выходного сигнала, формируя тем самым "прямой" ШИМ, "инверсный" ШИМ или "меандр".
все очень детально написано в соответствующем разделе даташита - приведены таблички с пояснениями.
Re: Таймеры/счётчики в AVR
Добавлено: Пн авг 10, 2015 13:18:11
mixon46
я ж не умею по английски читать. помогите мне настроить шим 36 кгц с заполнением окна 50%
если записать в регистр OCR0B разные числа то меняется % заполнения окна. а частоту то как поставить 36 кгц?
Re: Таймеры/счётчики в AVR
Добавлено: Пн авг 10, 2015 13:47:55
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 МГц)
Re: Таймеры/счётчики в AVR
Добавлено: Пн авг 10, 2015 13:56:48
mixon46
9.6 мгц \ 256= 37.5 кгц. да так я могу сделать. но будет ли на такой частоте ик приемник принимать сигналы. будет наверно но хуже чем если бы частота была бы одинаковой.
1.8 мгц это как? я знаю что есть 3 частоты 128 кгц, 4.8 мгц и 9.6 мгц RC обвязок генератора. спасибо за инфу. про второй пример я примерно знал. про первый не знал вовсе
вот у меня получилось промодулировать сигнал. правда частота да 37.5 кгц. что немного не подходит для моих целей но попробовать все таки можно. или же купить приемник на 37.5 если они конечно продаются на такую частоту
Re: Таймеры/счётчики в AVR
Добавлено: Пн авг 10, 2015 14:38:48
ARV
если вы городите систему инфракрасного управления, то:
1. лично мне попадались приемники TSOP на частоту 38 килогерц гораздо чаще, чем на 36. 37,5 ближе к 38

2. для передачи кода RC5 я делал "библиотечку", которая вообще не использует аппаратные режимы таймера для генерации несущей - вам необходимо обязательно аппаратно генерировать все?
3. попробуйте менять значение регистра OSCCAL, как я вам рекомендовал - возможно, вам удастся подогнать частоту до нужного значения
Re: Таймеры/счётчики в AVR
Добавлено: Пн авг 10, 2015 15:14:05
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 тини, батарейка таблетка. вот все что нужно для брелочка.
Re: Таймеры/счётчики в AVR
Добавлено: Пн авг 10, 2015 18:11:50
ARV
вот мой "брелочек" - не без недостатков, но работает:
http://www.simple-devices.ru/prj/9-elec ... te-control
Re: Таймеры/счётчики в AVR
Добавлено: Пн авг 10, 2015 20:17:19
mixon46
ну? а фотки где? не загрузились что то. в смысле "брелочек"? большой что ли получился?
Re: Таймеры/счётчики в AVR
Добавлено: Пн авг 10, 2015 20:24:35
ARV
какие фотки? я вам ссылку на проект дал - там и фотки, и видео, и описание и исходники
Re: Таймеры/счётчики в AVR
Добавлено: Пн авг 10, 2015 20:31:35
mixon46
ну я вижу видео есть. я статью правда не читал. внизу под статьей есть прошивка и исходники для WinAvr. Не могу посмотреть я пользуюсь Code Vision Avr
вот а сейчас фотка загрузилась. да хороший пультик. но я хотел еще проще сделать. одна кнопка для включения питания мк, один ик светодиод, мк и батарейка. все больше нечего усложнять. нужно всего лишь передать код из пары байт и все
Re: Таймеры/счётчики в AVR
Добавлено: Пн авг 10, 2015 20:39:03
ARV
в исходниках способ генерации несущей без всяких таймеров. в статье - подробности. почитайте.
не хотите - я ж не заставляю

Re: Таймеры/счётчики в AVR
Добавлено: Пн авг 10, 2015 20:44:47
mixon46
я вот думаю если у тини 13 есть ацп то может есть резон купить что нибудь более простое и главное подходящее по составу для моей цели? допустим тини 10 или 15. хотя я про них не читал
Re: Таймеры/счётчики в AVR
Добавлено: Пт авг 14, 2015 08:41:01
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
Re: Таймеры/счётчики в AVR
Добавлено: Пт авг 14, 2015 09:18:19
Gudd-Head
Так у автора и спросите. Кому охота копаться в чужом говне коде?
Re: Таймеры/счётчики в AVR
Добавлено: Пн авг 17, 2015 19:29:16
DarkWolf
Всем привет. Столкнулся с такой проблемой.. необходимо настроить 8 битный таймер на чстоту срабатывания 2Гц. 16 битный таймер занят другой работой и использовать его нет возможности.
Re: Таймеры/счётчики в AVR
Добавлено: Пн авг 17, 2015 21:47:44
amd9800
Какой МК?
Re: Таймеры/счётчики в AVR
Добавлено: Вт авг 18, 2015 08:33:06
DarkWolf
amd9800 писал(а):Какой МК?
МК ATmega324P, работает на частоте 1,250 МГц (10Мгц/8).
Re: Таймеры/счётчики в AVR
Добавлено: Вт авг 18, 2015 09:07:29
Gudd-Head
Тогда только софтово (залепить счётчик в прерывания)...
Или использовать внешний генератор в качестве тактового для таймера.