Создать ответ 
селектор
Автор Сообщение
wired На форуме
wired
*****

Сообщений: 1,210
Сказал спасибо: 173
Поблагодарили: 92
У нас с: Apr 2014
Сообщение: #1
селектор
4-х входовьій селектор с индикацией
каждая ножка МК используется как индикатор вьібора и как вход
Код:
#define IN_1 TRISB1
#define IN_2 TRISB2
#define IN_3 TRISB3
#define IN_4 TRISB4
#define INP_1 RB1
#define INP_2 RB2
#define INP_3 RB3
#define INP_4 RB4

#define SEL_STATE (PORTB & 0x1E)
и с некоторой периодичностью обрабатьіваем от єто

Код:
void selector(void) {
    unsigned char n = 0;
    if (selstate != SEL_STATE) {
        selstate = SEL_STATE;
        switch (SEL_STATE) {
            
            case 0x06:
              if (!IN_4) {
                    IN_4 = 1;
                    IN_3 = 0;
                    INP_3 = 0;
                    
                } else {
                    IN_3 = 1;
                    IN_4 = 0;
                    INP_3 = 1;
                    
                }

                break;
            
            case 0x12:
            
                if (!IN_3) {
                    IN_3 = 1;
                    IN_2 = 0;
                    INP_2 = 0;
                    
                } else {
                    IN_2 = 1;
                    IN_3 = 0;
                    INP_2 = 1;
                    
                }
                break;
            
            case 0x18:
            
                if (!IN_2) {
                    IN_2 = 1;
                    IN_1 = 0;
                    INP_1 = 0;
                    
                } else {
                    IN_1 = 1;
                    IN_2 = 0;
                    INP_1 = 1;
                    
                }
                break;
            
            case 0x0c:
            
                if (!IN_1) {
                    IN_1 = 1;
                    IN_4 = 0;
                    INP_4 = 0;
                    
                } else {
                    IN_4 = 1;
                    IN_1 = 0;
                    INP_4 = 1;
                    
                }
                break;
            
            case 0x0a:
            
                if (!IN_2) {
                    IN_2 = 1;
                    IN_4 = 0;
                    INP_4 = 0;
                    
                } else {
                    IN_4 = 1;
                    IN_2 = 0;
                    INP_4 = 1;
                    
                }
                break;
            
            case 0x14:
               if (!IN_3) {
                    IN_3 = 1;
                    IN_1 = 0;
                    INP_1 = 0;
                    
                } else {
                    IN_1 = 1;
                    IN_3 = 0;
                    INP_1 = 1;

                }
                break;
            
            
            case 0x0e:
            sel=3;
            break;
            
            case 0x16:
            sel=2;
            break;
            
            case 0x1a:
            sel=1;
            break;
            
            case 0x1c:
            sel=0;
            break;
            

        }

        S_data_send(sel); // установка мультиплексора
        
    }

}

не покидает ощущение. что можно бьіло-б сделать проще Sad
(Последний раз сообщение было отредактировано 01-04-2017 в 03:22 PM, отредактировал пользователь wired.)
01-04-2017 01:53 PM
Найти все сообщения Сказать Спасибо!
Altor Audio Не на форуме
Senior Member
****

Сообщений: 594
Сказал спасибо: 5
Поблагодарили: 38
У нас с: Apr 2014
Сообщение: #2
RE: селектор
как-то так:

Код:
#define IN_1 TRISB1
#define IN_2 TRISB2
#define IN_3 TRISB3
#define IN_4 TRISB4
#define INP_1 RB1
#define INP_2 RB2
#define INP_3 RB3
#define INP_4 RB4
//----------------------------------------------
#define SEL_STATE (PORTB | (~0x1E)) // set all unused bits to 1
//----------------------------------------------

static void SetTris(u8 key){
  switch (key){
     case 0: IN_1=1;IN_2=1; IN_3=1;IN_4=1; break;
     case 1: IN_1=0;IN_2=1; IN_3=1;IN_4=1; break;
     case 2: IN_1=1;IN_2=0; IN_3=1;IN_4=1; break;
     case 3: IN_1=1;IN_2=1; IN_3=0;IN_4=1; break;
     case 4: IN_1=1;IN_2=1; IN_3=1;IN_4=0; break;
  }
}

//----------------------------------------------------------------
void sel_init(void){  // call once at the program start
   INP_1 =0; INP_2 =0; INP_3 =0; INP_4 =0;   // set port bits to 0 forever
//
   sel=1;                           // set input 1 at the start
   // sel=ReadEE(LastInputAddress); //  or read the last value from EEPROM
//
   S_data_send(sel-1); // установка мультиплексора
   SetTris(sel); // set dedicated pin as output=0;
}
//----------------------------------------------------------------
void selector(void){   // call periodically (from timer interrupt or main loop)
static unsigned char selstate;
unsigned char currentstate, newsel=0;


SetTris(0); // set all pins as inputs
currentstate=SEL_STATE;

if(currentstate!=0xFF){
     if (selstate != currentstate)) {
            selstate = currentstate;
            
            if(!INP_1) newsel++; else
            if(!INP_2) newsel++; else
            if(!INP_3) newsel++; else
            if(!INP_4) newsel++;
            
            if(newsel &&(newsel!=sel)){
               sel=newsel;    // sel and newsel = 1,2,3,4
               S_data_send(sel-1); // установка мультиплексора
            }
     }
}
SetTris(sel); // set dedicated pin as output=0;
}
01-05-2017 02:06 AM
Вебсайт Найти все сообщения Сказать Спасибо!
Altor Audio Не на форуме
Senior Member
****

Сообщений: 594
Сказал спасибо: 5
Поблагодарили: 38
У нас с: Apr 2014
Сообщение: #3
RE: селектор
Вот без постоянного дерганья трисов:

Код:
void selector(void){   // call periodically (from timer interrupt or main loop)
unsigned char newsel=0;

if(!INP_1 &&(sel!=1)) newsel++; else
if(!INP_2 &&(sel!=2)) newsel++; else
if(!INP_3 &&(sel!=3)) newsel++; else
if(!INP_4 &&(sel!=4)) newsel++;
            
if(newsel==0) return;

sel=newsel;    // sel and newsel = 1,2,3,4
S_data_send(sel-1); // установка мультиплексора
SetTris(sel); // set dedicated pin as output=0;
}
01-05-2017 02:46 AM
Вебсайт Найти все сообщения Сказать Спасибо!
wired На форуме
wired
*****

Сообщений: 1,210
Сказал спасибо: 173
Поблагодарили: 92
У нас с: Apr 2014
Сообщение: #4
RE: селектор
вечерком поиграюсь в симуляторе. у тебя конечно красивше :)

чота мне кажется, что от тут
Код:
unsigned char newsel=0;

if(!INP_1 &&(sel!=1)) newsel++; else
if(!INP_2 &&(sel!=2)) newsel++; else
if(!INP_3 &&(sel!=3)) newsel++; else
if(!INP_4 &&(sel!=4)) newsel++;
newsel всегда будет = 1
01-05-2017 02:54 AM
Найти все сообщения Сказать Спасибо!
EDWARD Не на форуме
Posting Freak
*****

Сообщений: 1,031
Сказал спасибо: 433
Поблагодарили: 95
У нас с: Jun 2014
Сообщение: #5
RE: селектор
wired, так пойдёт?
8входов с индикацией+рег Никитина+пульт RC5
Лишнее можно убрать.


Прикрепления
.rar  att.rar (Размер: 78.76 Кб / Загрузок: 14)
01-05-2017 06:22 AM
Найти все сообщения Сказать Спасибо!
wired На форуме
wired
*****

Сообщений: 1,210
Сказал спасибо: 173
Поблагодарили: 92
У нас с: Apr 2014
Сообщение: #6
RE: селектор
пасиб, но такое не совсем то
во первьіх я не люблю перебор нескольких входов двумя кнопками
а во вторьіх смотри:
Цитата: [Сегодня 09:46] wired : а та что бьіла нажата до того переводится во вход, светик гаснет, ждем нажатия
[Сегодня 09:46] wired : в єтот момент ножка переводится из входа в вьіход с 0, светик горит
[Сегодня 09:45] wired : кнопкой закорачиваю на землю
[Сегодня 09:45] wired : ножка через светик подтянута к +
т.е. я использую всего 4 ноги и для непосредственного вьібора входа и их-же для индикации.

код в первом сообщении рабочий :)
хотелось красотьі.
я чуть попозже еще енкодер покажу. ото там жесть.
01-05-2017 06:38 AM
Найти все сообщения Сказать Спасибо!
Altor Audio Не на форуме
Senior Member
****

Сообщений: 594
Сказал спасибо: 5
Поблагодарили: 38
У нас с: Apr 2014
Сообщение: #7
RE: селектор
wired писал(а):вечерком поиграюсь в симуляторе. у тебя конечно красивше :)

чота мне кажется, что от тут
Код:
unsigned char newsel=0;

if(!INP_1 &&(sel!=1)) newsel++; else
if(!INP_2 &&(sel!=2)) newsel++; else
if(!INP_3 &&(sel!=3)) newsel++; else
if(!INP_4 &&(sel!=4)) newsel++;
newsel всегда будет = 1


С чего вдруг? Если ни одна кнопка ненажата, останется 0, если нажата - = номеру кнопки.
01-05-2017 07:22 AM
Вебсайт Найти все сообщения Сказать Спасибо!
wired На форуме
wired
*****

Сообщений: 1,210
Сказал спасибо: 173
Поблагодарили: 92
У нас с: Apr 2014
Сообщение: #8
RE: селектор
Altor Audio писал(а):
wired писал(а):вечерком поиграюсь в симуляторе. у тебя конечно красивше :)

чота мне кажется, что от тут
Код:
unsigned char newsel=0;

if(!INP_1 &&(sel!=1)) newsel++; else
if(!INP_2 &&(sel!=2)) newsel++; else
if(!INP_3 &&(sel!=3)) newsel++; else
if(!INP_4 &&(sel!=4)) newsel++;
newsel всегда будет = 1


С чего вдруг? Если ни одна кнопка ненажата, останется 0, если нажата - = номеру кнопки.
показалось что вход в иф будет только на нажатую кнопку, т.е. один раз.
01-05-2017 07:24 AM
Найти все сообщения Сказать Спасибо!
Altor Audio Не на форуме
Senior Member
****

Сообщений: 594
Сказал спасибо: 5
Поблагодарили: 38
У нас с: Apr 2014
Сообщение: #9
RE: селектор
Бля, ты прав!
Надо:
Код:
if(!INP_1 &&(sel!=1)) newsel=1; else
if(!INP_2 &&(sel!=2)) newsel=2; else
if(!INP_3 &&(sel!=3)) newsel=3; else
if(!INP_4 &&(sel!=4)) newsel=4;

Хотелось как лучше. Получилось - как всегда :)
01-05-2017 01:31 PM
Вебсайт Найти все сообщения Сказать Спасибо!
wired На форуме
wired
*****

Сообщений: 1,210
Сказал спасибо: 173
Поблагодарили: 92
У нас с: Apr 2014
Сообщение: #10
RE: селектор
Чтото в железе селектор больше как сенсорньій получился :) реагировал на все что угодно, но не на кнопки.
Пока по кондерчику параллельно кнопке не напаял
01-25-2017 12:43 AM
Найти все сообщения Сказать Спасибо!
Altor Audio Не на форуме
Senior Member
****

Сообщений: 594
Сказал спасибо: 5
Поблагодарили: 38
У нас с: Apr 2014
Сообщение: #11
RE: селектор
Ну, включил пуллапы?
01-25-2017 08:20 AM
Вебсайт Найти все сообщения Сказать Спасибо!
wired На форуме
wired
*****

Сообщений: 1,210
Сказал спасибо: 173
Поблагодарили: 92
У нас с: Apr 2014
Сообщение: #12
RE: селектор
на работе :) ?
ночером буду пуллапьі включать
01-25-2017 08:58 AM
Найти все сообщения Сказать Спасибо!
wired На форуме
wired
*****

Сообщений: 1,210
Сказал спасибо: 173
Поблагодарили: 92
У нас с: Apr 2014
Сообщение: #13
RE: селектор
при наличии конерчиков, особой разницьі с пуллапами не заметил, но пуллапьі на всякий оставил
01-25-2017 02:47 PM
Найти все сообщения Сказать Спасибо!
Altor Audio Не на форуме
Senior Member
****

Сообщений: 594
Сказал спасибо: 5
Поблагодарили: 38
У нас с: Apr 2014
Сообщение: #14
RE: селектор
Должно работать и без кондерчиков. они тут не нужны.
Тут даже дребезг давить не надо. т.к. при таком алгоритме он ни к чему не приводит.
01-26-2017 01:25 AM
Вебсайт Найти все сообщения Сказать Спасибо!
wired На форуме
wired
*****

Сообщений: 1,210
Сказал спасибо: 173
Поблагодарили: 92
У нас с: Apr 2014
Сообщение: #15
RE: селектор
ок, поснимаю, посмотрю что будет
01-26-2017 01:57 AM
Найти все сообщения Сказать Спасибо!
wired На форуме
wired
*****

Сообщений: 1,210
Сказал спасибо: 173
Поблагодарили: 92
У нас с: Apr 2014
Сообщение: #16
RE: селектор
да, кстати с пуллапами и без кондерчиков все отлично пашет
04-27-2017 07:03 AM
Найти все сообщения Сказать Спасибо!
Создать ответ 


Переход:

Пользователи просматривают эту тему: 1 Гость(ей)