4x4 = 16 = 4 PINOS

Circuitos eletrônicos, topologias, diagramas elétricos, etc...

Moderadores: 51, Renie, gpenga

4x4 = 16 = 4 PINOS

Mensagempor vtrx » 21 Jan 2013 20:15

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.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: 4x4 = 16 = 4 PINOS

Mensagempor andre_luis » 22 Jan 2013 06:37

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 ).


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor eletroinf » 22 Jan 2013 06:57

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...
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Mensagempor cfreund » 22 Jan 2013 09:54

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
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Mensagempor vtrx » 22 Jan 2013 17:51

cfreund,o código funcionou.
Vai ser um saco transcrever para C...
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor cfreund » 22 Jan 2013 18:18

Pow, a lógica está toda ai!

Alguns if's e else's e probrema resorvido.
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Mensagempor jorgeluiz » 23 Jan 2013 00:01

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
Avatar do usuário
jorgeluiz
Byte
 
Mensagens: 448
Registrado em: 26 Mar 2007 02:26

Mensagempor vtrx » 23 Jan 2013 10:35

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.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor vtrx » 24 Jan 2013 18:50

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
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor vtrx » 27 Jan 2013 19:21

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.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01


Voltar para Circuitos Diversos

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x