Регистрация | Последние сообщения | Персональный список | Поиск | Настройка конференции | Личные данные | Правила конференции | Список участников | Top 64 | Статистика раздела | faq | Что нового v.2.3 | Чат
Skunk Forum - Техника, Наука, Общество » Форум разработчиков РЭА »
Как обработать сигнал от датчика механической мыши:реверсивный счётчик

Версия для печати (настроить)

Новая тема | Написать ответ

Подписаться

Автор Тема:   Как обработать сигнал от датчика механической мыши:реверсивный счётчик
ava2
Member

Сообщений: 47
Откуда: Тамбов
Регистрация: Сентябрь 2006

написано 08 Января 2007 16:13ИнфоПравкаОтветитьIP

Прошу, по возможности, подсказать нет ли где программы обработки от датчика механичекой мыши для контроллера AVR или другого:
счет импульсов "туда-обратно" с использованием 2 оптических датчиков мыши.
Если нет программы - может готовый алгоритм обработки имеется...

Весельчак У
Moderator

Сообщений: 8344
Откуда: Санктъ-Питербурхъ
Регистрация: Декабрь 2000

написано 08 Января 2007 23:09ИнфоПравкаОтветитьIP

Где-то был алгоритм, точнее программа для x51. Надо поискать.

ava2
Member

Сообщений: 48
Откуда: Тамбов
Регистрация: Сентябрь 2006

написано 09 Января 2007 08:18ИнфоПравкаОтветитьIP

Очень прошу!

misyachniy
Member

Сообщений: 135
Откуда: Kyiv
Регистрация: Февраль 2002

написано 09 Января 2007 18:52ИнфоПравкаОтветитьIP

датчика механичекой мыши - это с шариком и оптическими датчиками? :-)
Один выход с оптодатчика на ножку прерывания(INT0) второй на обычную ножку.
Прерывание по форонту.
По прерыванию читаем состояние второго датчика.
Логическая единица инкрементируем счетчик, логический ноль - декрементируем счетчик.

Весельчак У
Moderator

Сообщений: 8351
Откуда: Санктъ-Питербурхъ
Регистрация: Декабрь 2000

написано 09 Января 2007 22:37ИнфоПравкаОтветитьIP

misyachniy
Один выход с оптодатчика на ножку прерывания(INT0) второй на обычную ножку.
Прерывание по форонту.

А когда в другую сторону крутится?

ava2
Нашёл. Правда оказалось, что для MSP430, но это непринципиально.

код:

#include <msp430x14x.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>

unsigned int i=337;
signed char j=0, s;
unsigned char K1, K2;

void main(void)
{
WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer
_EINT();
P1IE=0x0;
P2IE=0x0;
P1IFG=0x0;//Нет флагов прерываний
P1IES=0x0;//Прерываний нет
P1DIR=0x48;//Биты 3, 7 (Вых. частоты, упр. питанием) - выход, остальное на ввод
P1SEL=0x08;//Бит 3 (сигнал) - частота, остальные - в/в
P1OUT=0xC0;//На кнопку и ключ питания - 1, остальное - 0
P2IFG=0x0;//Нет флагов прерываний
P2IES=0xFF;//Прерыванме по спаду
P2DIR=0x80;
P2SEL=0x80;
P2OUT=0x7F;
P3DIR=0x93;//Биты 0, 1, 4, 7 (SCL, SDA, TXD, RD/-WR) - вывод, биты 2, 3, 5, 6 (N/A, N/A, RXD, N/A) - ввод
P3SEL=0x30;//Биты 4, 5 - RS232 (TXD, RXD), остальные - в/в
P3OUT=0xFF;//На выход - все единицы
P4DIR=0xFF;//Все на вывод - шина данных индикатора
P4SEL=0x0;//Разрешить регистр
P5DIR=0x0;//Биты 0, 1, 2, 3, 4, 5, 6, 7 - на ввод
P5SEL=0x00;//Разрешить на в/в биты 0, 1, 2, 3, 4, 5, 6, 7
P5OUT=0xF8;//E2, E1, A0, подсветка =1 (выключена), ADC_CS, ADC_SCLK =1
P6DIR=0x07;//На вывод биты 0, 1, 2 (управление ключами), остальные на ввод
P6SEL=0x80;//Бит 7 (A7) - АЦП, остальные в/в
P6OUT=0xF8;//Биты 0, 1, 2 =0, остальные =1
_EINT(); //разрешаем все прерывания

//Основной цикл программы
K1=K2=1;
BCSCTL1=0x87;
BCSCTL2=0;
DCOCTL=0xE0;
_DINT();
TACTL=0x230;
TACCTL0=0x080;
TACCTL2=0x0C0;
TACCR0=0x200;
TACCR1=0x1000;
TACCR2=0x200;
while (1)
{
K2=K1; //Запомнить текущее состояние
K1=(P5IN&0x6);
switch (K1)
{
case 0x6:
K1=1;
break;
case 0x4:
K1=2;
break;
case 0x0:
K1=3;
break;
case 0x2:
K1=4;
break;
}
s=K1-K2;
switch (s)
{
case 1:
j++;
break;
case -1:
j--;
break;
case 3:
j--;
break;
case -3:
j++;
break;
}
if (j>=4)
{
i++;
j=0;
}
if (j<=-4)
{
i--;
j=0;
}
if (i<215) i=215; //ограничение из-за особенностей реализации, можно сделать 0
if (i>460) i=460; //ограничение из-за особенностей реализации, можно сделать 65535
TACCR2=i; //Выходной код для выдачи напряжения через ШИМ, можно использовать в другом месте.
}
}


ava2
Member

Сообщений: 49
Откуда: Тамбов
Регистрация: Сентябрь 2006

написано 10 Января 2007 08:56ИнфоПравкаОтветитьIP

Спасибо большое. Не сочтите за нахала - нельзя комментарий к каждой строке...
Ассемблер ближе - (AVR, x51).
Может быть из основного цикла можно будет логику уловить.
Так сказать на пальцах...
Извиняюсь ещё раз.

Добавление от 10 Января 2007 16:16:

Добавка: "....нельзя ли комментарий добавить...?"(а то двусмысленно получилось)

Весельчак У
Moderator

Сообщений: 8359
Откуда: Санктъ-Питербурхъ
Регистрация: Декабрь 2000

написано 11 Января 2007 03:03ИнфоПравкаОтветитьIP

ava2
К каждой строке - напряжённо, по крайней мере, сейчас.
Общий смысл такой - по комбинациям на входных портах (т.е. состояниям фотодиодов оптрона) определяется какие фотодиоды засвечены. После этого состояние сравнивается с предыдущим состоянием. На основе этого делается заключение в какую сторону крутится колесо. Условно, 00->10, 10->11, 11->01, 01->00 - вправо, 00->01, 01->11, 11->10 и 10->00 - влево. По достижении 4 изменений в одну сторону непрерывно, т.е. полного цикла прохождения одного отверстия перед светодиодом, увеличивается счётчик состояний. Когда одно отверстие двигается около светодиода туда-сюда, но не проходит полный цикл, изменение выходного состояния не происходит - таким образом подавляется "дребезг". Точнее уже сам не помню, но программа работает - проверено на макете.

K1=(P5IN&0x6); - обнуление ненужных разрядов порта.

switch (K1) { } - оператор выбора из некоторых значений, которые указаны после слов case, переменной K1.

if, надеюсь, и так понятно.

Достаточно просто сделать проверки условий и присвоение значений, а можно и таблицу сделать.

ava2
Member

Сообщений: 50
Откуда: Тамбов
Регистрация: Сентябрь 2006

написано 11 Января 2007 08:20ИнфоПравкаОтветитьIP

Спасибо огромное.
С наступившим Рождеством!

Ваш ответ:

Коды форума
Смайлики


Ник:    Пароль       
Отключить смайлики

Все время MSK

Склеить | Разбить | Закрыть | Переместить | Удалить

Новая тема | Написать ответ
Последние сообщения         
Перейти к:

Свяжитесь с нами | skunksworks.net

Copyright © skunksworks.net, 2000-2018

Разработка и техническая поддержка: skunksworks.net


Рейтинг@Mail.ru Яндекс.Метрика