Спасибо, вроде разобрался =)
Помогите теперь пожалуйста понять таймеры, очень хочется сделать ШИМ чтобы управлять серво, но пока не понятно как это происходит. Читаю курс AVR123 не могу разобраться,там сразу слишком много информации для начинающего, вчера весь вечер разбирался с битами, что и куда устанавливается, помог только даташит на русском к меге 128. пишу на WIN AVR , поэтому частенько приходится перелопачивать все что нахожу под свой компилятор(не всегда получается, все используют свои библиотеки и макросы. даже не обьявляя их в коде и порой это запутывает до конца). А конкретный вопрос вот в чем, не могли бы вы подсказать алгоритм установки таймера , без кода, а может просто словами (или блок схемой) , и про прерывания и какую роль в них играет таймер (как взаимодействует с ними). КодВизард не кактит, хочется самому втыкнуть как все это работает
для начала на примере 8 битного, пожалуйста
- Код: Выделить всё • Развернуть
DDRD=0x20; // 00100000 PD5(OC1A)-PWM Timer1 OUT
// ножку PD5 назначить выходом
// Настройка TIMER1 для генерации ШИМ
//TIMER1 initialize
//prescale:1 clock 7.37 MHz
// WGM: 7) PWM 10bit fast, TOP=0x03FF
// actual value: 7200,000Hz (100,0%)
// последнее - это частота ШИМ сигнала
TCCR1B = 0x00; //stop Timer
TCNT1H = 0xFC; // 11111100
TCNT1L = 0x01; // 00000001
/* значение в 16 битном регистре OCR1A определяет величину генерируемого ШИМ сигнала на ножке PD5 - если поделить ее на 10.23 то получим PWM в процентах*/
OCR1AH = 0x03; // PWM(PD5) = OCR1A / 10.23
OCR1AL = 0xFF; // 0x03FF это число 1023
/* регистр OCR1A состоит из двух 8-ми битных регистров OCR1AH и OCR1AL запись в них нужно проводить в указанной последовательности! */
OCR1BH = 0x03;
OCR1BL = 0xFF;
ICR1H = 0x03;
ICR1L = 0xFF;
TCCR1A = 0x83; // 10000011
TCCR1B = 0x09; // 00001001 - start Timer
// Теперь ШИМ 100% - т.е. на ножке PD1 лог. "1"
Буду по порядку задавать вопросы:
1)
- Код: Выделить всё • Развернуть
TCCR1B = 0x00; //stop Timer
-таймер остановлен, не работает пока его настраивают дальше? зачем это делается, если он выключен?
2)
- Код: Выделить всё • Развернуть
TCNT1H = 0xFC; // 11111100
TCNT1L = 0x01; // 00000001
, в этом регистре пишем до куда считать , получается до 64513, вроде понятно =)
3)
- Код: Выделить всё • Развернуть
/* значение в 16 битном регистре OCR1A определяет величину генерируемого ШИМ сигнала на ножке PD5 - если поделить ее на 10.23 то получим PWM в процентах*/
OCR1AH = 0x03; // PWM(PD5) = OCR1A / 10.23
OCR1AL = 0xFF; // 0x03FF это число 1023
вот тут очень непонятно, почему он определяет велечину генерируемого ШИМ ?
небольшое отступление:я имею таковое представление о работе таймера в качестве ШИМ. прошу направьте на путь истинный =)
TCNT увеличивается , пока не сравняется с регистром OCR. Как только он сравнивается с ним, происходит прерывание, в нем на определенный порт выводится 1, потом 0, и от паузы между ними зависит велечина ШИМ, но как она может зависеть от велечины OCR не понятно, я думал что OCR определяет период, прошу подсказать =)
4)
- Код: Выделить всё • Развернуть
OCR1BH = 0x03;
OCR1BL = 0xFF;
Это второй регистр сравнения, какую функцию он выполняет, если его значение такое же как и у первого?
Отступление:Кажется я начинаю понимать суть, но нужно знать еще тонкости. В этом примере на выходе мы получаем 100% шим, может быть потому, что 2 регистра сравнения имеют одинаковые значения?
5)
- Код: Выделить всё • Развернуть
ICR1H = 0x03;
ICR1L = 0xFF;
регистр захвата, что это и с чем его едят? какую функцию он здесь выполняет? можно линк на страницу даташита, буду не против, так же буду благодарен если на русский даташит атмеги 128
6)
- Код: Выделить всё • Развернуть
TCCR1A = 0x83; // 10000011
TCCR1B = 0x09; // 00001001 - start Timer
Почему тут 2 регистра управления, как я понял, одним таймером? чем они отличаются? или они обьеденены в один?