Easyelectronics.ru

Электроника для всех
Текущее время: 22 янв 2021, 20:06

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Фазовращатель
СообщениеДобавлено: 22 ноя 2019, 15:07 
Только пришел

Зарегистрирован: 22 ноя 2019, 12:22
Сообщения: 8
Здравствуйте. Вопрос следующий. В Atmega16 настроены Таймер_ 0 и Таймер_ 1 в режиме сброс при совпадении на частоту 8 кгц. Нужно программно сдвигать фазу сигнала Таймера_1 в большую или меньшую сторону относительно сигнала Таймера_0 с помощью двух кнопок. Это задача максимум. Для начала попробовал более простой вариант с одной кнопкой, алгоритм следующий
кнопка: PA0 при нажатии прижимает пин к земле.
1) нажимаю кнопку , останавливаю оба таймера.
2) Записываю нужное число для сдвига фазы в счетный регистр Таймера_1
3) отжимаю кнопку, запускаю оба таймера

Код:
/ Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 2000,000 kHz
// Mode: CTC top=OCR0
// OC0 output: Toggle on compare match
// Timer Period: 0,0625 ms
// Output Pulse(s):
// OC0 Period: 0,125 ms Width: 0,0625 ms
TCCR0=(0<<WGM00) | (0<<COM01) | (1<<COM00) | (1<<WGM01) | (0<<CS02) | (1<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0=0x7C;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Toggle on compare match
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 0,0625 ms
// Output Pulse(s):
// OC1A Period: 0,125 ms Width: 0,0625 ms
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (1<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x03;
OCR1AL=0xE7;
OCR1BH=0x00;
OCR1BL=0x00;


     
while (1)
      {
           while (PINA.0 != 0);//ждем нажатия кнопки
           TCCR0 &= (0<<CS01); //останавливаем таймер О и 1
           TCCR1B &= (0<<CS10);
           while (PINA.0 != 1);//ждем когда кнопка будет отжата
           TCNT1H=0x01;  // изменяем счетный регистр таймера1 и запускаем оба
           TCNT1L=0xf4;  // таймера
           TCCR0=(0<<WGM00) | (0<<COM01) | (1<<COM00) | (1<<WGM01) | (0<<CS02) |
                        (1<<CS01) | (0<<CS00);
           TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) |
                         (0<<CS11) | (1<<CS10);
           SFIOR &= (1<<PSR10); //сбрасываем предделитель
           
      }
     
}


Не работает как надо. Как правильно останавливать и запускать синхронно таймеры?
Какие варианты решения есть ещё? Проверяю результат в Протеус.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Фазовращатель
СообщениеДобавлено: 22 ноя 2019, 15:35 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3051
1. Где весь код? Где установка выводов портов на выход?
Код:
DDRD = (1 << PD4) | (1 << PD5);
DDRB = (1 << PB3);


2. Что за PINA.0? В GCC такого нет.

3. Ошибка:
Код:
           TCCR0 &= (0<<CS01); //останавливаем таймер О и 1
           TCCR1B &= (0<<CS10);

Не так делается для очистки бита, а вот так:
Код:
           TCCR0 &= ~(1<<CS01); //останавливаем таймер О и 1
           TCCR1B &= ~(1<<CS10);


Хотя это и не помешало вашему коду, потому что дальше всё равно выставляете все биты назад. Но тогда смело можно было написать = 0, вместо & 0.

Ну и вообще все эти (0 << X) в вашем коде лишены смысла. Там и так нули.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Фазовращатель
СообщениеДобавлено: 22 ноя 2019, 15:49 
Только пришел

Зарегистрирован: 22 ноя 2019, 12:22
Сообщения: 8
[quote="NStorm"]1. Где весь код? Где установка выводов портов на выход?
Код:
DDRD = (1 << PD4) | (1 << PD5);
DDRB = (1 << PB3);

Настройку портов пропустил чтобы слишком не раздувать размер кода.
2. Что за PINA.0? В GCC такого нет.
Пишу в CodeVisionAVR там такая конструкция работает, считывает состояние нулевого пина порта А


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Фазовращатель
СообщениеДобавлено: 22 ноя 2019, 15:58 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3051
Вот такой код прям из протеуса в GCC (WinAVR) работает:
Show


До нажатия кнопки:
Вложение:
Screenshot_20191122_135716.png
Screenshot_20191122_135716.png [ 3.15 Кб | Просмотров: 470 ]


После нажатия:
Вложение:
Screenshot_20191122_135732.png
Screenshot_20191122_135732.png [ 2.58 Кб | Просмотров: 470 ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Фазовращатель
СообщениеДобавлено: 22 ноя 2019, 16:24 
Только пришел

Зарегистрирован: 22 ноя 2019, 12:22
Сообщения: 8
[quote="NStorm"]

Я проверил код в CodeVisionAVR только заменил PA0 на PORTA0 иначе компилятор ругался, но проблема осталась. Если несколько раз нажать на кнопку то фаза каждый раз смещается в разные положения, а не остается стабильно в одном и том же.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Фазовращатель
СообщениеДобавлено: 22 ноя 2019, 16:49 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 1016
Откуда: Earth
Yriy писал(а):
... Если несколько раз нажать на кнопку то фаза каждый раз смещается в разные положения, а не остается стабильно в одном и том же.

Проверяете в железе ? Дребезг кнопки учли ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Фазовращатель
СообщениеДобавлено: 22 ноя 2019, 16:52 
Только пришел

Зарегистрирован: 22 ноя 2019, 12:22
Сообщения: 8
[quote="Gnusmas"]
Проверяю в Протеусе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Фазовращатель
СообщениеДобавлено: 22 ноя 2019, 18:23 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3051
В GCC всё стабильно, скрины я показал. Что 2ое, что 10ое нажатие кнопки стабильно показывает одинаковое смещение. Хз что у вас в CVAVR не работает, я им не пользуюсь.

Цитата:
Gnusmas
, у него по коду пока один единственный сдвиг, дребезг даже в железе никак не повлияет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Фазовращатель
СообщениеДобавлено: 22 ноя 2019, 18:51 
Только пришел

Зарегистрирован: 22 ноя 2019, 12:22
Сообщения: 8
[quote="NStorm"]
Спасибо за помощь. Если у вас все работает значит проблема не в коде. Буду разбираться со средой разработки возможно какой-нибудь include не прописал или попробую поставить WinAVR.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Фазовращатель
СообщениеДобавлено: 22 ноя 2019, 19:13 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 786
Откуда: GMT+6
Yriy писал(а):
Если несколько раз нажать на кнопку то фаза каждый раз смещается в разные положения, а не остается стабильно в одном и том же.
Так и должно быть, ведь при нажатии кнопки значение в регистре TCNT0 каждый раз разное.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Фазовращатель
СообщениеДобавлено: 22 ноя 2019, 19:20 
Только пришел

Зарегистрирован: 22 ноя 2019, 12:22
Сообщения: 8
[quote="Kelvin"]
Я пробовал перед записью сначала обнулять счетный регистр тоже не помогало.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Фазовращатель
СообщениеДобавлено: 22 ноя 2019, 20:34 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 786
Откуда: GMT+6
Надо ещё состояние выходов обнулять или устанавливать в заведомо известное состояние.
И предделитель правильно сбрасывать.
Show Для тестов в протеусе раскомментируйте план Б


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Фазовращатель
СообщениеДобавлено: 22 ноя 2019, 22:03 
Только пришел

Зарегистрирован: 22 ноя 2019, 12:22
Сообщения: 8
[quote="Kelvin"]
Переделал ваш код под CodeVisionAVR и о чудо все заработало как надо.
Небольшой вопрос. Правильно ли я понимаю что инструкция для сброса предделителя
позволяет стартовать таймерам одновременно и если это так то не должна ли она стоять в самом конце кода.
Код:

      SFIOR |= _BV(PSR10); // Сбрасываем предделитель перед запуском таймеров
      
      // Запускаем как было
      TCCR0=(0<<WGM00) | (0<<COM01) | (1<<COM00) | (1<<WGM01) | (0<<CS02) | (1<<CS01) | (0<<CS00);
      TCCR1A=(0<<COM1A1) | (1<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
      TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
           // сброс предделителя ????
   }


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Фазовращатель
СообщениеДобавлено: 22 ноя 2019, 22:15 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 786
Откуда: GMT+6
Если предделитель сбрасывать после запуска таймера, то таймер может успеть тикнуть до сброса предделителя. А успеет ли тикнуть, будет зависеть от состояния предделителя в момент запуска таймера. А поскольку момент запуска таймера определяется моментом отпускания кнопки, то будет зависеть от человека.

Если же сначала сбросить предделитель, а затем запустить таймер, то время между сбросом предделителя и запуском таймера всегда будет постоянным (если не уйдете в обработчик прерывания). Соответственно и состояние предделителя в момент запуска таймера всегда будет одним и тем же.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Фазовращатель
СообщениеДобавлено: 22 ноя 2019, 23:13 
Только пришел

Зарегистрирован: 22 ноя 2019, 12:22
Сообщения: 8
Спасибо NStorm и Kelvin за помощь вопрос снят.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB