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 писал(а):Так как мне настроить биты регистров что бы получить нужный мне шим на ножке PORTB1?
в даташите есть отличная табличка, в которой перечислены все режимы ШИМ таймера и соответствующие значения всех управляющих битов. вы можете настроить режим по этой таблице.
что касается битов CS02, CS01, CS00 - они определяют частоту счета таймера, тем самым влияя на период ШИМ
при помощи битов COM0xx вы можете управлять режимом переключения выходного сигнала, формируя тем самым "прямой" ШИМ, "инверсный" ШИМ или "меандр".
все очень детально написано в соответствующем разделе даташита - приведены таблички с пояснениями.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Если вам нужен меандр (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 МГц):
9.6 мгц \ 256= 37.5 кгц. да так я могу сделать. но будет ли на такой частоте ик приемник принимать сигналы. будет наверно но хуже чем если бы частота была бы одинаковой.
1.8 мгц это как? я знаю что есть 3 частоты 128 кгц, 4.8 мгц и 9.6 мгц RC обвязок генератора. спасибо за инфу. про второй пример я примерно знал. про первый не знал вовсе
вот у меня получилось промодулировать сигнал. правда частота да 37.5 кгц. что немного не подходит для моих целей но попробовать все таки можно. или же купить приемник на 37.5 если они конечно продаются на такую частоту
если вы городите систему инфракрасного управления, то:
1. лично мне попадались приемники TSOP на частоту 38 килогерц гораздо чаще, чем на 36. 37,5 ближе к 38
2. для передачи кода RC5 я делал "библиотечку", которая вообще не использует аппаратные режимы таймера для генерации несущей - вам необходимо обязательно аппаратно генерировать все?
3. попробуйте менять значение регистра OSCCAL, как я вам рекомендовал - возможно, вам удастся подогнать частоту до нужного значения
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
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 тини, батарейка таблетка. вот все что нужно для брелочка.
ну я вижу видео есть. я статью правда не читал. внизу под статьей есть прошивка и исходники для WinAvr. Не могу посмотреть я пользуюсь Code Vision Avr
вот а сейчас фотка загрузилась. да хороший пультик. но я хотел еще проще сделать. одна кнопка для включения питания мк, один ик светодиод, мк и батарейка. все больше нечего усложнять. нужно всего лишь передать код из пары байт и все
я вот думаю если у тини 13 есть ацп то может есть резон купить что нибудь более простое и главное подходящее по составу для моей цели? допустим тини 10 или 15. хотя я про них не читал
Всем привет. Столкнулся с такой проблемой.. необходимо настроить 8 битный таймер на чстоту срабатывания 2Гц. 16 битный таймер занят другой работой и использовать его нет возможности.