#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
Ответ
#2

как-то так:

Код:
#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;
}
Ответ
#3

Вот без постоянного дерганья трисов:

Код:
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;
}
Ответ
#4

вечерком поиграюсь в симуляторе. у тебя конечно красивше :)

чота мне кажется, что от тут
Код:
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
Ответ
#5

wired, так пойдёт?
8входов с индикацией+рег Никитина+пульт RC5
Лишнее можно убрать.


Файлы вложений
.rar att.rar Размер: 78.76 KB  Загрузок: 34
Ответ
#6

пасиб, но такое не совсем то
во первьіх я не люблю перебор нескольких входов двумя кнопками
а во вторьіх смотри:
Цитата: [Сегодня 09:46] wired : а та что бьіла нажата до того переводится во вход, светик гаснет, ждем нажатия
[Сегодня 09:46] wired : в єтот момент ножка переводится из входа в вьіход с 0, светик горит
[Сегодня 09:45] wired : кнопкой закорачиваю на землю
[Сегодня 09:45] wired : ножка через светик подтянута к +
т.е. я использую всего 4 ноги и для непосредственного вьібора входа и их-же для индикации.

код в первом сообщении рабочий :)
хотелось красотьі.
я чуть попозже еще енкодер покажу. ото там жесть.
Ответ
#7

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, если нажата - = номеру кнопки.
Ответ
#8

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, если нажата - = номеру кнопки.
показалось что вход в иф будет только на нажатую кнопку, т.е. один раз.
Ответ
#9

Бля, ты прав!
Надо:
Код:
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;

Хотелось как лучше. Получилось - как всегда :)
Ответ
#10

Чтото в железе селектор больше как сенсорньій получился :) реагировал на все что угодно, но не на кнопки.
Пока по кондерчику параллельно кнопке не напаял
Ответ
#11

Ну, включил пуллапы?
Ответ
#12

на работе :) ?
ночером буду пуллапьі включать
Ответ
#13

при наличии конерчиков, особой разницьі с пуллапами не заметил, но пуллапьі на всякий оставил
Ответ
#14

Должно работать и без кондерчиков. они тут не нужны.
Тут даже дребезг давить не надо. т.к. при таком алгоритме он ни к чему не приводит.
Ответ
#15

ок, поснимаю, посмотрю что будет
Ответ
#16

да, кстати с пуллапами и без кондерчиков все отлично пашет
Ответ


Перейти к форуму:


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