селектор -
wired - 01-04-2017
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); // установка мультиплексора
}
}
не покидает ощущение. что можно бьіло-б сделать проще
RE: селектор -
Altor Audio - 01-05-2017
как-то так:
Код:
#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;
}
RE: селектор -
Altor Audio - 01-05-2017
Вот без постоянного дерганья трисов:
Код:
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;
}
RE: селектор -
wired - 01-05-2017
вечерком поиграюсь в симуляторе. у тебя конечно красивше :)
чота мне кажется, что от тут
Код:
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
RE: селектор -
EDWARD - 01-05-2017
wired, так пойдёт?
8входов с индикацией+рег Никитина+пульт RC5
Лишнее можно убрать.
RE: селектор -
wired - 01-05-2017
пасиб, но такое не совсем то
во первьіх я не люблю перебор нескольких входов двумя кнопками
а во вторьіх смотри:
Цитата: [Сегодня 09:46] wired : а та что бьіла нажата до того переводится во вход, светик гаснет, ждем нажатия
[Сегодня 09:46] wired : в єтот момент ножка переводится из входа в вьіход с 0, светик горит
[Сегодня 09:45] wired : кнопкой закорачиваю на землю
[Сегодня 09:45] wired : ножка через светик подтянута к +
т.е. я использую всего 4 ноги и для непосредственного вьібора входа и их-же для индикации.
код в первом сообщении рабочий :)
хотелось красотьі.
я чуть попозже еще енкодер покажу. ото там жесть.
RE: селектор -
Altor Audio - 01-05-2017
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, если нажата - = номеру кнопки.
RE: селектор -
wired - 01-05-2017
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, если нажата - = номеру кнопки.
показалось что вход в иф будет только на нажатую кнопку, т.е. один раз.
RE: селектор -
Altor Audio - 01-05-2017
Бля, ты прав!
Надо:
Код:
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;
Хотелось как лучше. Получилось - как всегда :)
RE: селектор -
wired - 01-25-2017
Чтото в железе селектор больше как сенсорньій получился :) реагировал на все что угодно, но не на кнопки.
Пока по кондерчику параллельно кнопке не напаял
RE: селектор -
Altor Audio - 01-25-2017
Ну, включил пуллапы?
RE: селектор -
wired - 01-25-2017
на работе :) ?
ночером буду пуллапьі включать
RE: селектор -
wired - 01-25-2017
при наличии конерчиков, особой разницьі с пуллапами не заметил, но пуллапьі на всякий оставил
RE: селектор -
Altor Audio - 01-26-2017
Должно работать и без кондерчиков. они тут не нужны.
Тут даже дребезг давить не надо. т.к. при таком алгоритме он ни к чему не приводит.
RE: селектор -
wired - 01-26-2017
ок, поснимаю, посмотрю что будет
RE: селектор -
wired - 04-27-2017
да, кстати с пуллапами и без кондерчиков все отлично пашет