|
|
  |
несколько вопросов по ATmega162 |
|
|
|
May 24 2006, 09:13
|
Группа: Новичок
Сообщений: 2
Регистрация: 24-05-06
Пользователь №: 17 400

|
Здравствуйте! только начал работать с микроконтроллерами, и, естественно, появляются глупые вопросы  дело такое, я собираю плату сопряжения ПК (через rs232) и некоторыми датчиками станка (фотодатчики, вращающиеся, 3 шт) и некоторыми двигателями (приводами, если точнее, но не важно, нужно лишь на клеммы подавать некоторый уровень напряжения). в качестве "сердца" выбран ATmega162, 3 встроенных счетчика используются фотодатчиками, для приводов 3 цапа подключаю. переодически величины счетчика отправляются в ПК, и обнуляются. Ну, общую схему я себе представляю, нужно принципиально представить, и тут я торможу, т.к. начинающий. Как, примерно, можно реализовать инкрементирование счетчика, строб импульсов должен, по идее, поступать на какой то пин МК, и как то программно обрабатываться. Кто нибудь, может примерно сказать, как выглядит программа для такого счетчика и куда подавать строб(я так понимаю, нужно еще и прерывание внешнее использовать при подачи импульсов)?
|
|
|
|
|
May 24 2006, 09:38
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(antonn @ May 24 2006, 12:13)  ... в качестве "сердца" выбран ATmega162, 3 встроенных счетчика используются фотодатчиками, для приводов 3 цапа подключаю. если точность особая не нужна то можно обойтись просто 2-й инт цепочкой и использовать PWM режим таймера 0 и 1 или 1 и 2-го Цитата .... как выглядит программа для такого счетчика и куда подавать строб(я так понимаю, нужно еще и прерывание внешнее использовать при подачи импульсов)? если контроллера будет делать еще что-то и частота импульсов большая то конечно лучьше завести на прерывания (их как раз 3 внешних 0, 1 , 2) а в обработчиках делать инкремент ваших счетчиков. в прикрепленном файлике ссылки на ресурсы
Прикрепленные файлы
______.htm ( 7.2 килобайт )
Кол-во скачиваний: 282
|
|
|
|
|
May 24 2006, 10:33
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Таймер/счетчик может работать от двух мсточников - внутренних клоков (возможно с предделителем) - для отсчета времени, и внешних импульсов на определенную ногу Tn(0,1,2) источник тактирования выбирается в регистре TCCRn. Прерывание генерируеться по переполнению счетчика и вы можете его использовать, чтобы считать количество переполнений. Если количество импульсов до считывания не переполнит счетчик, прерывание не понадобиться. Не совсем понятно с ЦАПами - они внешние? или используете ШИМ?
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
May 24 2006, 10:48
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата Кто нибудь, может примерно сказать, как выглядит программа для такого счетчика и куда подавать строб(я так понимаю, нужно еще и прерывание внешнее использовать при подачи импульсов)? Можно настроить таймер на программное прерывание. В обработчике прерывания , проверять вход,и по изменению на активный уровень соответственно инкрементировать счетчик. Тут зависит от длительности стробов, и временных интервалов. Точность (дескритизацию) можно устанавливать частотой таймера. Ошибка в пределах одного цикла таймера. Таким образом можно отвязаться от конкретных выводов контроллера(внешнее прерывание, запуск таймера и т.д.) и использовать более удобный пин.
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
May 24 2006, 14:02
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата Как, примерно, можно реализовать инкрементирование счетчика, строб импульсов должен, по идее, поступать на какой то пин МК, и как то программно обрабатываться. На мой взгляд, вам достаточно будет объявить 3 переменных Cnt0..Cnt2, и создать три обработчика внешних прерываний Int0, Int1, Int2, в обработчках этих прерываний инкрементирвать соответствующий счетчик. Кроме того запустить любой из встроенных таймеров для подсчета времени. Взависимости от времени, анализировать состояние трех переменных Cnt0..Cnt2 и выполнять какие-то требуемые действия, после чего переменные Cnt0..Cnt2 обнулять. С ЦАПами чуть позже.. ;> Примерная структура программы на C (WinAvr) для решения вашей задачи: Код #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h>
long Cnt0 = 0; long Cnt1 = 0; long Cnt2 = 0; long SysTime = 0; // если захотите обрабатывать эти переменные в основном цикле программы // необходимо будет предусмотреть синхронизацию данных (просто запретом прерываний), //а также добавить ключевое слово volatile в объявление каждой из этих переменных
// Обработчик прерывания INT0 Singal (SIG_INTERRUPT0){ Cnt0++; }
// Обработчик прерывания INT1 Signal (SIG_INTERRUPT1){ Cnt1++; }
// Обработчик прерывания INT2 Signal (SIG_INTERRUPT2){ Cnt2++; }
// Обработчик прерывание по переполнению таймера 0 Signal (SIG_OVERFLOW0){ SysTime++; // Обработка переменных Cnt0..Cnt2 // взависимости от текщего времени, которое у нас ведется в переменной SysTime }
int main(void) { // настройка портов // настройка таймеров и разрешение прерываний от таймеров (TIMSK) // настройка внешних прерываний рег. GIMSK // настройка УАРТа(ов) sei(); // разрешение прерываний
for(;;){ // Обработка UART0 и/или UART1 (передача по rs232) // какие-то другие действия // управление ЦАПами и проч. } return 0; }
|
|
|
|
|
May 24 2006, 14:20
|
Группа: Новичок
Сообщений: 2
Регистрация: 24-05-06
Пользователь №: 17 400

|
спасибо, пойду почитаю... 2beer_warrior переполнения не предвидится. ЦАПов пока нет, планирую их с последовательной передачей взять (эта передача, пока что, тоже под вопросом). Вообще ЦАПы под вопросом, мои "командиры" "морщатся", что то не нравится... думаю, прерывание нужно внешнее, мне кроме импульса на счетчик нужно где то проверять бит направления вращения (одновременно с импульсом идет), по прерыванию и хотел увеличивать счетчик (или уменьшать, зависит от направления). Представляю пока так (надеюсь правильно): с датчика приходит импульс, который я подаю на вывод внешнего прерывания (один для всех датчиков), бит направления выдаю на один из пинов портов (итого 3 порта для трех датчиков), и по биту выставляю еще в 3 порта (показывает, что этот датчик сейчас работает, иначе 0 в порт). А в программе проверять биты работы датчиков, и соотвествующий счетчик изменять (по биту вращения). Похоже на правду или я совсем "плаваю"?  2defunct угу, значит так... попробую переделать под биты направления
|
|
|
|
|
May 24 2006, 16:03
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата Похоже на правду или я совсем "плаваю"? smile.gif Похоже, если скорость импульсов небольшая, получиться. Имейте в виду, что поступление каждого из трех импульсов, вызвет прерывание, и может случиться, что МК только и будет прерываться  Ну а если получиться, в таком случае можно подумать о использовании таймеров под ШИМы и отказа от ЦАПов.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|