так же, как и по-вашему: всегдаROMan2947 писал(а):как это должно работать по вашему?
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
так же, как и по-вашему: всегдаROMan2947 писал(а):как это должно работать по вашему?
Код: Выделить всё
if (!(PIND&KEY2))вот это, на что вы обратили вниманиеROMan2947 писал(а):не всегда,а до тех пор пока кнопка не нажата
Код: Выделить всё
if((1<<PD2))Работу кнопок я смотрю в еепроме как они прибавляют или отнимают.на мой взгляд с ними тоже)интереса ради проверьте кнопки на светодиодах
после нажатия кнопок должна измениться частота на выходе ФАПЧ но этого не происходитможете четко сформулировать задачу, проблему и вопрос? как в армии - кратко и по существу?
Код: Выделить всё
// регистры сравнения 16 битный заносим AH старшую AL младшую часть переменной
OCR1AH = (N >> 8) & 0x00FF;// Задаем новое значение коэффициента пересчета
OCR1AL = N & 0x00FF;//записываем число для сравнениякак-то сложновато...bango писал(а):это код в прерывании измененную переменную записываю для сравнения с ТССR
Код: Выделить всё
OCR1A = N;Настраивал таймер по описанию которое прикрепил с верху.режим таймера у вас правильно задан?
этот же регистр 2х байтный если я ни чего ни путаю а у меня число от 1500 до 4000 примерно вот поэтому я его и делю на две части.OCR1A = N;
так, как я написал - правильно.bango писал(а):этот же регистр 2х байтный
Код: Выделить всё
while(1){
Buton_save(); // Проверим состояние кнопки "Save" и сохраним переменные
Buton_minys (); // Проверка нажатия кнопки уменьшить
Buton_plys();// Проверка нажатия кнопки увеличение
if(FChangeFlag)
{
TIMSK |= (1 << OCIE1A); // Разрешаем прерывания по совпадению для модификации OCR1A
}
}Вот где то тут истина я отвечу работа мешает думать.на выходе OC1A у вас должна появиться частота, равная поделенной на OCR1A частоте, поступившей на вход T1 - верно? на Т1 частота поступает? какая именно?
вы учитываете тот факт, что запись в OCR1A в обработчике происходит в время уже начатого цикла работы таймера, и, соответственно, на этот цикл не повлияет?
Код: Выделить всё
void TIM16_WriteTCNT1 ( unsigned int i )
{
unsigned char sreg;
unsigned int i;
/* Save global interrupt flag */
sreg = SREG;
/* Disable interrupts */
_CLI();
/* Set TCNT1 to i */
TCNT1 = i;
/* Restore global interrupt flag */
SREG = sreg;вы забываете, что OCR1A обновляется в обработчике прерывания, т.е. запрещать прерывания не надо. но в остальном вы правы - снов я поторопился, т.к. привык пользовать таймер в режиме Fast-PWM, когда доступ в OCR1x буфферизируется... и совсем забыл, что эта буфферизация активна не всегда.ROMan2947 писал(а):но разница на виду
Да это вы верно понялина выходе OC1A у вас должна появиться частота, равная поделенной на OCR1A частоте, поступившей на вход T1 - верно?
да поступает. точно не знаю надо посчитать, должна поступать в (Диапазон регулирования частоты: 100 - 300 кГц)на Т1 частота поступает? какая именно?
Пока я над этим не думал это хорошее замечание. и даже не знаю как это вообщем отразится.вы учитываете тот факт, что запись в OCR1A в обработчике происходит в время уже начатого цикла работы таймера, и, соответственно, на этот цикл не повлияет?
значит получается запрет прерывания убрать из опроса прерывания и вот этот код убратьзапрещать прерывания не надо
Код: Выделить всё
if(FChangeFlag)
{
TIMSK |= (1 << OCIE1A); // Разрешаем прерывания по совпадению для модификации OCR1A
}Код: Выделить всё
int main(void)
TIMSK |= (1 << OCIE1A); // Разрешаем прерывания по совпадению для модификации OCR1AЯ думал что так нужно делать. Дома попробую сделать так как вы сказали и завтра отпишусь.честно говоря, я не понимаю, зачем обновлять OCR1A в обработчике прерываний?
Код: Выделить всё
for(N=1000; N < 4000; N+=100) _delay_ms(300);