Обсуждаем контроллеры компании Atmel.
Ответить

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

Ср мар 28, 2018 10:35:47

на мой взгляд с ними тоже)интереса ради проверьте кнопки на светодиодах

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

после нажатия кнопок должна измениться частота на выходе ФАПЧ но этого не происходит
Код:
   // регистры сравнения 16 битный заносим AH старшую AL младшую часть переменной
   OCR1AH = (N >> 8) & 0x00FF;// Задаем новое значение коэффициента пересчета
   OCR1AL = N & 0x00FF;//записываем число для сравнения

это код в прерывании измененную переменную записываю для сравнения с ТССR таймера 1 и частота должна по идеи измениться.
Последний раз редактировалось bango Ср мар 28, 2018 10:49:10, всего редактировалось 1 раз.

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

Ср мар 28, 2018 10:54:47

bango писал(а):это код в прерывании измененную переменную записываю для сравнения с ТССR
как-то сложновато...
Код:
OCR1A = N;


режим таймера у вас правильно задан?

Добавлено after 13 minutes 7 seconds:
на выходе OC1A у вас должна появиться частота, равная поделенной на OCR1A частоте, поступившей на вход T1 - верно? на Т1 частота поступает? какая именно?
вы учитываете тот факт, что запись в OCR1A в обработчике происходит в время уже начатого цикла работы таймера, и, соответственно, на этот цикл не повлияет?

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

Ср мар 28, 2018 10:56:45

режим таймера у вас правильно задан?

Настраивал таймер по описанию которое прикрепил с верху.
OCR1A = N;

этот же регистр 2х байтный если я ни чего ни путаю а у меня число от 1500 до 4000 примерно вот поэтому я его и делю на две части.

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

Ср мар 28, 2018 11:07:38

bango писал(а):этот же регистр 2х байтный
так, как я написал - правильно.

Добавлено after 9 minutes 40 seconds:
да вот еще что...
я уж не знаю, насколько вы там сделали усекновение программы свей, но главный цикл в том файле, что вы выложили, полностью эквивалентен следующему:
Код:
while(1){
   Buton_save(); // Проверим состояние кнопки "Save" и сохраним переменные
   Buton_minys ();  // Проверка нажатия кнопки уменьшить
   Buton_plys();// Проверка нажатия кнопки увеличение
   if(FChangeFlag)
        {
           TIMSK |= (1 << OCIE1A);   // Разрешаем прерывания по совпадению для модификации OCR1A
        }
}
кстати, запрещать прерывания по совпадению в обработчике прерывания по совпадению не надо

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

Ср мар 28, 2018 11:07:45

на выходе OC1A у вас должна появиться частота, равная поделенной на OCR1A частоте, поступившей на вход T1 - верно? на Т1 частота поступает? какая именно?
вы учитываете тот факт, что запись в OCR1A в обработчике происходит в время уже начатого цикла работы таймера, и, соответственно, на этот цикл не повлияет?

Вот где то тут истина я отвечу работа мешает думать.

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

Ср мар 28, 2018 11:08:59

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

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

Ср мар 28, 2018 11:12:05

этот же регистр 2х

даташит:
The following code examples show how to do an atomic write of the TCNT1 Register contents. Writing any of
the OCR1A/B or ICR1 Registers can be done by using the same principle.

Код:
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;


можно и как у вас написать,но разница на виду.

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

Ср мар 28, 2018 11:33:00

ROMan2947 писал(а):но разница на виду
вы забываете, что OCR1A обновляется в обработчике прерывания, т.е. запрещать прерывания не надо. но в остальном вы правы - снов я поторопился, т.к. привык пользовать таймер в режиме Fast-PWM, когда доступ в OCR1x буфферизируется... и совсем забыл, что эта буфферизация активна не всегда.

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

Ср мар 28, 2018 14:24:45

на выходе OC1A у вас должна появиться частота, равная поделенной на OCR1A частоте, поступившей на вход T1 - верно?

Да это вы верно поняли
на Т1 частота поступает? какая именно?

да поступает. точно не знаю надо посчитать, должна поступать в (Диапазон регулирования частоты: 100 - 300 кГц)
вы учитываете тот факт, что запись в OCR1A в обработчике происходит в время уже начатого цикла работы таймера, и, соответственно, на этот цикл не повлияет?

Пока я над этим не думал это хорошее замечание. и даже не знаю как это вообщем отразится.

По поводу опроса кнопок вы дали хорошие замечания вот что значит взгляд профи за это спасибо.
запрещать прерывания не надо

значит получается запрет прерывания убрать из опроса прерывания и вот этот код убрать
Код:
        if(FChangeFlag)
        {
           TIMSK |= (1 << OCIE1A);   // Разрешаем прерывания по совпадению для модификации OCR1A
        }

а TIMSK вставить вот так я правильно понял?
Код:
int main(void)

TIMSK |= (1 << OCIE1A);   // Разрешаем прерывания по совпадению для модификации OCR1A

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

Ср мар 28, 2018 15:07:06

как-то так, да

честно говоря, я не понимаю, зачем обновлять OCR1A в обработчике прерываний? ведь если делать это в главном цикле, обработчик прерывания вообще не понадобится - пусть себе гонит меандр на выходе абсолютно аппаратно

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

Ср мар 28, 2018 15:38:40

честно говоря, я не понимаю, зачем обновлять OCR1A в обработчике прерываний?

Я думал что так нужно делать. Дома попробую сделать так как вы сказали и завтра отпишусь.

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

Чт мар 29, 2018 07:49:20

у меня в протэусе кварц не правильно выставлен, пытаюсь понять как установить 16Мгц
вот что сейчас показывает осциллограф
Т1 = 6,7 нс = 1000\6,7 = 149,25 Мг
ОС1А = 30,4мс 100\30,4 = 3,2 Мг
ОС0А = 1020мс = 10\102 0,9 гц

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

Чт мар 29, 2018 08:10:32

в протеусе "нарисованный" кварц никак не влияет на поведение МК. чтобы изменить частоту "кварца" надо в свойствах МК задать тактовую частоту - хоть 100 МГц можно :)

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

Чт мар 29, 2018 08:21:47

Но даже если я кварц не выставил частота от кнопок должна меняться?

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

Чт мар 29, 2018 09:05:59

по идее должна

проверьте проще: вместо главного цикла напишите
Код:
for(N=1000; N < 4000; N+=100) _delay_ms(300);
и посмотрите в течение нескольких секунд на выходную частоту, вообще не трогая кнопки - будет меняться или нет?

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

Чт мар 29, 2018 09:50:45

По инструкции выставил 16 мг в протэусе.
Долно быть вот так
16000000/1024/250 = 62,5Гц
а у меня выходит вот так что за кварц стоит не пойму
f = 1/с
ОС0А = 500мс = 0,5с = 2 Гц предделитель 1024 делитель = 250
ОС0А = 126мс = 0,126с = 7,9 Гц предделитель 256 делитель = 250
ОС0А = 31мс = 0,031с = 32,2 Гц предделитель 64 делитель = 250
ОС0А = 4мс = 0,004с = 250 Гц предделитель 8 делитель = 250

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

Чт мар 29, 2018 10:29:01

фьюз CKDIV8 в протеусе как установлен?

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

Чт мар 29, 2018 10:38:04

1101
Вложения
Fuse.png
(15.34 KiB) Скачиваний: 225

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

Чт мар 29, 2018 10:42:37

ну вот. фактическая частота тактирования у вас в 8 раз меньше, т.е. 2 МГц, а не 16. этот фьюз должен быть незапрограммирован, т.е. 1

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

Чт мар 29, 2018 10:55:38

Выстовил как вы показали вот так получается
Вот так настроен счетчик
TCCR0B |= (1 << CS00);// CS = 101 - от внутреннего источника
TCCR0B |= (1 << CS02);// после пред делителя (15625)

OCR0A = M;// Задаем значение коэффициента пересчета 249
а частота получается
ОС0А = 31мс = 0,031с = 32 Гц предделитель 1024 делитель = 250
Ответить