Página 1 de 1
4x4 = 16 = 4 PINOS

Enviado:
21 Jan 2013 20:15
por vtrx
Não estou entendendo como inicializar o PORTb do esquema abaixo:
http://www.piclist.org/techref/microchip/4x4key4io8diode.htm
Alguem pode me explicar como fazer a varredura?
Pode ser em ASM ou C.
Re: 4x4 = 16 = 4 PINOS

Enviado:
22 Jan 2013 06:37
por andre_luis
Parece que está faltando resistor de pull-up, como se o circuito tivesse sido originalmente sido desenhado para algum microcontrolador que possua naturalmente o nível '1' na saída ( ex.: 8051 ).
+++

Enviado:
22 Jan 2013 06:57
por eletroinf
Da uma tentiada no código:
http://www.mikerj.clara.net/keypad.asm
"The inputs are pulled high by the
; internal weak pullups"
Só testando, mas quando o milagre é demais...

Enviado:
22 Jan 2013 09:54
por cfreund
Como segurança, coloque uma rede resistiva de 10k.
Seta as portas como input e ativa o pullup.
Para lêr:
- setar RB0 como output.
- RB0 em low.
- Ler RB1, RB2, RB3
Se RB3 e RB2 estiver baixo, SW1
Se RB3 e RB1 estiver baixo, SW2
Se RB3 estiver baixo, SW3
Se RB2 e RB1 estiver baixo, SW4
Próxima linha:
- setar RB0 como input e ativar pullup
- setar RB1 como output
- RB1 em low
- Ler RB0, RB2 e RB3
Se RB3 e RB2 estiver baixo, SW5
Se RB3 estiver baixo, SW6
Se RB0 e RB3 estiver baixo, SW7
Se RB2 estiver baixo, SW8
Próxima linha:
- setar RB1 como input e ativar pullup
- setar RB2 como output
- RB2 em low
- Ler RB0, RB1 e RB3
Se RB3 estiver baixo, SW9
Se RB3 e RB1 estiver baixo, SW10
Se RB3 e RB0 estiver baixo, SW11
Se RB1 estiver baixo, SW12
Próxima linha:
- setar RB2 como input e ativar pullup
- setar RB3 como output
- RB3 em low
- Ler RB0, RB1 e RB2
Se RB2 estiver baixo, SW13
Se RB1 estiver baixo, SW14
Se RB0 estiver baixo, SW15
Se RB2 e RB1 estiver baixo, SW16

Enviado:
22 Jan 2013 17:51
por vtrx
cfreund,o código funcionou.
Vai ser um saco transcrever para C...

Enviado:
22 Jan 2013 18:18
por cfreund
Pow, a lógica está toda ai!
Alguns if's e else's e probrema resorvido.

Enviado:
23 Jan 2013 00:01
por jorgeluiz
bom exercicio pra ver se ainda to em forma.
em asm seria assim (da uma conferida que fiz meio correndo)
.
caso_A
movlw b'00001110'
movwf trisb
testab1
btfss portb,1
goto testab2_a ;0
goto testab2_b ;1
testab2_a
btfss porb,2
goto testab3_a ;0-0
goto testab3_b ;1-0
testab2_b
btfss portb,2
goto testab3_d ;0-1
goto testab3_c ;1-1
testab3_a
btfss portb,3
goto caso_B ;0-0-0
goto sw_4 ;1-0-0
testab3_b
btfss portb,3
goto sw_2 ;0-1-0
goto caso_B ;1-1-0
testab3_c
btfss portb,3
goto sw_1 ;0-0-1
goto caso_B ;1-0-1
testab3_d
btfss portb,3
goto sw_3 ;0-1-1
goto caso_B ;1-1-1
caso_B
movlw b'00001101'
movwf trisb
testab0
btfss portb,0
goto testab2_a ;0
goto testab2_b ;1
testab2_a
btfss porb,2
goto testab3_a ;0-0
goto testab3_b ;1-0
testab2_b
btfss portb,2
goto testab3_d ;0-1
goto testab3_c ;1-1
testab3_a
btfss portb,3
goto caso_C ;0-0-0
goto caso_C ;1-0-0
testab3_b
btfss portb,3
goto sw_7 ;0-1-0
goto caso_C ;1-1-0
testab3_c
btfss portb,3
goto sw_5 ;0-0-1
goto sw_8 ;1-0-1
testab3_d
btfss portb,3
goto sw_6 ;0-1-1
goto caso_C ;1-1-1
caso_C
movlw b'00001011'
movwf trisb
testab0
btfss portb,0
goto testab2_a ;0
goto testab2_b ;1
testab1_a
btfss porb,1
goto testab3_a ;0-0
goto testab3_b ;1-0
testab1_b
btfss portb,1
goto testab3_d ;0-1
goto testab3_c ;1-1
testab3_a
btfss portb,3
goto caso_D ;0-0-0
goto caso_D ;1-0-0
testab3_b
btfss portb,3
goto sw_11 ;0-1-0
goto caso_D ;1-1-0
testab3_c
btfss portb,3
goto sw_10 ;0-0-1
goto sw_12 ;1-0-1
testab3_d
btfss portb,3
goto caso_D ;0-1-1
goto caso_D ;1-1-1
caso_D
movlw b'00000111'
movwf trisb
testab0
btfss portb,0
goto testab2_a ;0
goto testab2_b ;1
testab1_a
btfss porb,1
goto testab3_a ;0-0
goto testab3_b ;1-0
testab1_b
btfss portb,1
goto testab2_d ;0-1
goto testab2_c ;1-1
testab2_a
btfss portb,2
goto caso_A ;0-0-0
goto caso_A ;1-0-0
testab2_b
btfss portb,2
goto caso_A ;0-1-0
goto sw_15 ;1-1-0
testab2_c
btfss portb,2
goto sw_16 ;0-0-1
goto sw_14 ;1-0-1
testab2_d
btfss portb,2
goto sw_13 ;0-1-1
goto caso_A ;1-1-1
.
bota as rotinas de tratamento das chaves e retorna pra casoA

Enviado:
23 Jan 2013 10:35
por vtrx
Boa Jorge.
O código funcional esta no LINK.
Oque me faltou foi perceber qeu precisava de resistores Pull up e que não poderia fazer a comparação sem uma 'varredura',eu testei apenas uma chave lendo diretamente a sequencia.

Enviado:
24 Jan 2013 18:50
por vtrx
Se alguem tiver interessado,terminei um código funcional para 4 pinos 16 chaves.
Fiz em C18 mas a rotina de escaneamento das chaves é toda em ASM,qu e para mim é até bom pois vou colocá-la junto as outras em C e vou poder verificar a temporização mais facilmente.
Segue link com projeto teste no proteus que da a saida no pORTB conforme as 16 chaves e mais o projeto C18.
http://www.4shared.com/rar/mWPKfcgW/4x4_C18.html

Enviado:
27 Jan 2013 19:21
por vtrx
O assunto aqui eu encerrei,mas como neste exato momento não tinha nada para fazer,resecreví o código funcional,todo em C18 conforme um usuário Portugues do forum da Microchip sugeriu pois ele não é adepto de ASM(ainda bem que sou Trilingue...).
- Código: Selecionar todos
#include<P18F2550.H>
#include <delays.h>
#pragma config FOSC = HS
#pragma config CPUDIV = OSC2_PLL3
#pragma config IESO = OFF
#pragma config PWRT = ON
#pragma config WDT = OFF
#pragma config BOR = OFF
#pragma config LVP = OFF
//......................................................
volatile unsigned char KEYS,COUNT,KEYCODE;
void SCAN2();
//-----------------------------------------------
void SCAN2(){
TRISA = 0B00001110;
KEYS = PORTA & 0X0F;
if (KEYS != TRISA){
switch (KEYS) {
case 0x02:PORTB = 0x01;break;
case 0x04:PORTB = 0x02;break;
case 0x06:PORTB = 0x04;break;
case 0x08:PORTB = 0x08;break;
}
}
TRISA = 0B00001101;
KEYS = PORTA & 0X0F;
if (KEYS != TRISA){
switch (KEYS) {
case 0x01:PORTB = 0x10;break;
case 0x05:PORTB = 0x20;break;
case 0x04:PORTB = 0x40;break;
case 0x09:PORTB = 0x80;break;
}
}
TRISA = 0B00001011;
KEYS = PORTA & 0X0F;
if (KEYS != TRISA){
switch (KEYS) {
case 0x03:PORTB = 0xFF;break;
case 0x01:PORTB = 0xFE;break;
case 0x02:PORTB = 0xFC;break;
case 0x09:PORTB = 0xF8;break;
}
}
TRISA = 0B00000111;
KEYS = PORTA & 0X0F;
if (KEYS != TRISA){
switch (KEYS) {
case 0x03:PORTB = 0xF0;break;
case 0x05:PORTB = 0xE0;break;
case 0x06:PORTB = 0xC0;break;
case 0x01:PORTB = 0x80;break;
}
}
}
//---------------------------------------------------------
void main(){
// INTCON2bits.RBPU = 0;
ADCON1 = 0X0F;
CMCON = 0X07;
TRISB = 0b00000000;
TRISA = 0b00001111;
PORTA = 0X00;
PORTB = 0X00;
while(1){
SCAN2();
Delay10TCYx(200);
}
}
Ja estou com a plaquinha na mãos para soldar e testar tudo,no proteus funcionou certinho.