Página 1 de 2

como fazer a soma de valor de duas variaveis ?

MensagemEnviado: 29 Dez 2013 15:02
por renan-papaco
é possivel somar um valor de uma variavel que faz uma contagem interna e assimila os valores dessas contagems em mascaramentos em um port do microcontrolador? essa variavel conta até 11 que vai controlar um CD4514 que vai fazer a varredura de um teclado matricial e somar com outra variavel que estará atribuida a um port q servirá de entrada das linhas de retorno do teclado que tenho... q é 11X5... o objetivo é somar variavel X(saida pra varredura) com a variavel Y(entrada de linhas de retorno) pra em que cada soma eu possa fazer um comando específico. é possivel fazer isso?

Re: como fazer a soma de valor de duas variaveis ?

MensagemEnviado: 29 Dez 2013 15:21
por andre_luis
Em que linguagem de programação ?





+++

Re: como fazer a soma de valor de duas variaveis ?

MensagemEnviado: 31 Dez 2013 13:44
por renan-papaco
em C usando SDCC

Re: como fazer a soma de valor de duas variaveis ?

MensagemEnviado: 31 Dez 2013 16:51
por andre_luis
Sendo em C, basta você simplesmente jogar o valor da variável no Port.
Tenta elaborar algum diagrama e postar, pois posso não ter entendido direito.


+++

Re: como fazer a soma de valor de duas variaveis ?

MensagemEnviado: 31 Dez 2013 19:57
por renan-papaco
ok, vou fazer um fluxograma e upar o link aqui.. ja q num tenho conta em sites de armazenamentos de fotos eu posto a foto no facebook e colo o link aqui.

Re: como fazer a soma de valor de duas variaveis ?

MensagemEnviado: 31 Dez 2013 20:31
por EvandrPic
é só você add a imagem como anexo...
Exemplo.:

renan-papaco escreveu:ok, vou fazer um fluxograma e upar o link aqui.. ja q num tenho conta em sites de armazenamentos de fotos eu posto a foto no facebook e colo o link aqui.

Re: como fazer a soma de valor de duas variaveis ?

MensagemEnviado: 31 Dez 2013 20:32
por renan-papaco
Imagem


assim?

uhuuu consegui!

Re: como fazer a soma de valor de duas variaveis ?

MensagemEnviado: 01 Jan 2014 08:25
por andre_luis
Renan,

Na verdade, não entendi muito além de um determinado ponto pois ainda não ficou claro pra mim, e acabei parando na varredura.
Qual seria exatamente o objetivo disso ?

Código: Selecionar todos
// a variável global dispara, se 1 indica que novo incremento na contagem

/******* EXECUCAO ********/
If ( dispara )   Varredura() ;


/****** DECLARACAO *******/
void varredura ( void )
{
static int coluna = 0 ;
if ( coluna++ <= 11 )
{
//////// ???
}

dispara = 0 ;
}


Mas se serve de consolo, ( respondendo a sua questão inicial ) qualquer lógica pode ser implementada em C.
Vamos entendendo aos poucos e vamos avançando passo-a-passo.


+++

Re: como fazer a soma de valor de duas variaveis ?

MensagemEnviado: 01 Jan 2014 13:59
por renan-papaco
andre_teprom escreveu:Renan,

Na verdade, não entendi muito além de um determinado ponto pois ainda não ficou claro pra mim, e acabei parando na varredura.
Qual seria exatamente o objetivo disso ?

Código: Selecionar todos
// a variável global dispara, se 1 indica que novo incremento na contagem

/******* EXECUCAO ********/
If ( dispara )   Varredura() ;//poderia explicar para mim a função desta linha?


/****** DECLARACAO *******/
void varredura ( void )
{
static int coluna = 0 ;
if ( coluna++ <= 11 )
coluna=P1;//(não sei se está certo... o objetivo é fazer com q o port P1  controle a varredura,  através de um CD4511 contando junto com a variável coluna.)
{
//////// ???(aqui seriam os códigos de soma da coluna e da linha e cada uma delas representa uma tecla... não precisa ser todas as teclas do teclado necessariamente)
}

dispara = 0 ;
}


Mas se serve de consolo, ( respondendo a sua questão inicial ) qualquer lógica pode ser implementada em C.
Vamos entendendo aos poucos e vamos avançando passo-a-passo.


+++


primeiramente feliz ano novo pra vc...

o meu objetivo nisso é aprender a interfacear um teclado matricial grande no microcontrolador... e sem usar um circuito lógico q projetei, ele até facilita a programação, pois só com o comando switch case dá pra fazer alguma coisa, mas quero avançar na programação e sei q assim como eu, você e os outros participantes deste fórum adoramos discutir sobre microcontroladores e eletrônica digital em geral.quero explorar mais do software e menos de hardware...

o q eu disse ali no fluxograma q (tentei fazer) fiz foi basicamente escanear as 11 colunas do teclado e cada vez q ele acende um pino no CD4511, uma variavel contará dentro do programa... se eu aperto alguma tecla q corresponde a coluna X e a linha Y(ex: coluna 0 e linha 4) então o programa vai ler a variavel da contagem da coluna que seria 0(primeira das 11 colunas) e somar com o valor 04h que vai estar no port de retorno do uC.

eu notei no código q vc postou, vc já declarou a variável coluna e limitou sua contagem até 11... preciso fazer com q o valor de 0h a Ah vá para o port P1(P1.0 a P1.3) q irá contar em binário até 11 em um loop infinito. eu acho q daria pra fazer isso apenas com o seguinte comando:
"coluna=P1;"

preciso declarar também uma outra variável chamada ENTRADA que corresponderá aos primeiros quatro pinos de P3(vamos supor q vai ser essa q irá receber as linhas de retorno do teclado), a variavel ENTRADA é iniciada em 0 e enquanto ela estiver em 0, o programa nada fará...só aguardará até q alguma tecla seja pressionada.
vou fazer o esquema pra vc ver.

Re: como fazer a soma de valor de duas variaveis ?

MensagemEnviado: 01 Jan 2014 15:23
por andre_luis
Bom, inclui agora a leitura da porta no código de varredura que fiz anteriormente.
Quanto ás demais funcionalidades, ainda estou quebrando um pouco a cabeça pra entender, mas devagar vai indo...

Código: Selecionar todos
    // a variável global dispara, se 1 indica que novo incremento na contagem

    /******* EXECUCAO ********/
    If ( dispara )   Varredura() ;

    /****** DECLARACAO *******/
    void varredura ( void )
    {
    static int coluna = 0 ;
    if ( coluna++ <= 11 )
    {
    // filtro para aplicar na porta apenas a parte baixa do contador, sem interferir nos demais pinos
    P1 |= ( coluna & 0x0F ) ;   
    P1 &= ( coluna | 0xF0 ) ;     
    }
    dispara = 0 ;
    }




+++

Re: como fazer a soma de valor de duas variaveis ?

MensagemEnviado: 01 Jan 2014 15:32
por Red Neck Guy
Olá
Eu trabalhei bastante com o 8051 e a coisa mais legal que ele tem é o barramento externo que nos permite criar coisas muitos legais e com cara de projeto de computadores dos anos 80.
A ideia que vou dar pode ser utilizada para amostrar as teclas diretamente - manipulando os registradores dos ports - ou então utilizando MOVX para leitura do barramento externo - em C basta ver como o compilador faz o acesso a variáveis externas, no keil bastava declara-las como xdata.

Imagem

Então, pra fazer a leitura direta, basta
Código: Selecionar todos
unsigned char linhasTeclado[16];

void amostraTeclado(void){
  unsigned char i;

  for(i=0;i<16;i++){
    habilita_linha(i,1);
    linhasTeclado[i] = P0; 
    habilita_linha(i,0);
  }
}

void habilita_linha(unsigned char linha,unsigned char valor){

  switch(linha){
    case 0: P2_0 = valor; break;
    case 1: P2_1 = valor; break;
    case 2: P2_2 = valor; break;
   // e assim por diante para todas as linhas....
  }
}



Ou então, utilizando as portas AND e utilizando o mapeamento externo
Código: Selecionar todos

xdata volatile byte linha_01 _AT_  0x100;
xdata volatile byte linha_02 _AT_  0x200;
xdata volatile byte linha_03 _AT_  0x400;
xdata volatile byte linha_04 _AT_ 0x800; // e assim por diante
// como não estamos utilizando um decodificador de endereços, perdemos uma ampla faixa aqui, mas como a idéia é um hardware minimalista não há problemas....

xdata volatile *byte linhas[4] = { &linha_01,&linha_02,&linha_03,&linha_04};

unsigned char amostraTeclado[4];

void amostragemTeclado(void){
  unsigned char i;

  for(i=0;i<4;i++)
    amostraTeclado[i] =  *linhas[i];
}


Re: como fazer a soma de valor de duas variaveis ?

MensagemEnviado: 01 Jan 2014 23:08
por renan-papaco
andre_teprom escreveu:Bom, inclui agora a leitura da porta no código de varredura que fiz anteriormente.
Quanto ás demais funcionalidades, ainda estou quebrando um pouco a cabeça pra entender, mas devagar vai indo...

Código: Selecionar todos
    // a variável global dispara, se 1 indica que novo incremento na contagem

    /******* EXECUCAO ********/
    If ( dispara )   Varredura() ;

    /****** DECLARACAO *******/
    void varredura ( void )
    {
    static int coluna = 0 ;
    if ( coluna++ <= 11 )
    {
    // filtro para aplicar na porta apenas a parte baixa do contador, sem interferir nos demais pinos
    P1 |= ( coluna & 0x0F ) ;   
    P1 &= ( coluna | 0xF0 ) ;     
    }
    dispara = 0 ;
    }




+++

isso aí...gostei da ideia de isolar os pinos MSB do port P1... daria até pra usar um só port pra fazer o controle total do teclado...

a parada agora é declarar a variavel de entrada...fazendo isso vc ja tem uma ideia de fazer o somatório.

Re: como fazer a soma de valor de duas variaveis ?

MensagemEnviado: 02 Jan 2014 09:43
por Red Neck Guy
Ali no código já existe a variável "de entrada". Na verdade o somatório que falas é a amostragem?
Nesse caso, bastaria criar algo do tipo

Código: Selecionar todos
#define N_AMOSTRAS  4 // OU A QUANTIDADE QUE VOCÊ QUISER
#define LINHAS           4 // QUANTIDADE DE LINHAS DO TECLADO, VOCÊ DEFINE DE ACORDO COM O TEU HARDWARE

unsigned char amostraTeclas[N_AMOSTRAS][LINHAS];

void amostraTeclado(){
  static unsigned char amostra=0;
  unsigned char i;

  for(i=0;i<LINHAS;i++){
  ///chama aqui o código que postei anteriormente com a alteração abaixo
  amostraTeclas[amostra] = ....
  }
 
  amostra = (amotra+1) % N_AMOSTRAS;
}

// PARA SABER SE E QUAL TECLA FOI PRESSIONADA
unsigned char leTecla(void){
  unsigned char k,i,j,cont;
  unsigned char codigoTec;

  for(k=0;k<linhas;k++)
    for(i=0;i<8;i++)
      for(j=0;j<8;j++){
         codigoTec++;
        cont=0;
        if(amostraTeclas[k][i]&(0x01)<<j)
          cont++;
        if(cont>N_AMOSTRAS>>1)
          return codigoTec;
      }
   return 0;     
}



Re: como fazer a soma de valor de duas variaveis ?

MensagemEnviado: 02 Jan 2014 23:21
por renan-papaco
teria um jeito mais simples de fazer isso... tipo, vou tentar simular um código:


#define P3 linhas 4
#define P1 colunas 11

void main()

se linhas =0 & colunas =1,
P0= 255

se linhas=1 & colunas=1
P0=254

e assim vai indo... não precisaria necessáriamente isolar outros pinos do port P1(saida da varredura), ou do P3(entrada)
só precisaria de um codigo digamos simplificado, haveria um jeito de fazer isso?

Re: como fazer a soma de valor de duas variaveis ?

MensagemEnviado: 02 Jan 2014 23:22
por renan-papaco
Aquino escreveu:Ali no código já existe a variável "de entrada". Na verdade o somatório que falas é a amostragem?
Nesse caso, bastaria criar algo do tipo

Código: Selecionar todos
#define N_AMOSTRAS  4 // OU A QUANTIDADE QUE VOCÊ QUISER
#define LINHAS           4 // QUANTIDADE DE LINHAS DO TECLADO, VOCÊ DEFINE DE ACORDO COM O TEU HARDWARE

unsigned char amostraTeclas[N_AMOSTRAS][LINHAS];

void amostraTeclado(){
  static unsigned char amostra=0;
  unsigned char i;

  for(i=0;i<LINHAS;i++){
  ///chama aqui o código que postei anteriormente com a alteração abaixo
  amostraTeclas[amostra] = ....
  }
 
  amostra = (amotra+1) % N_AMOSTRAS;
}

// PARA SABER SE E QUAL TECLA FOI PRESSIONADA
unsigned char leTecla(void){
  unsigned char k,i,j,cont;
  unsigned char codigoTec;

  for(k=0;k<linhas;k++)
    for(i=0;i<8;i++)
      for(j=0;j<8;j++){
         codigoTec++;
        cont=0;
        if(amostraTeclas[k][i]&(0x01)<<j)
          cont++;
        if(cont>N_AMOSTRAS>>1)
          return codigoTec;
      }
   return 0;     
}



o somatório na verdade seria para definir os comandos q cada tecla representa...é como o clássico switch case, nele posso atribuir um port do MCU a uma variavel de entrada e dependendo do valor nela, defino cada coisa q posso querer no software. só preciso de um jeito de somar a variavel switch case com o valor da variavel de varredura q vai ficar contando num loop infinito.
isso seria pra poder aprender a trabalhar melhor com variáveis...esses codigos me parecem muito avançados e tem tanta coisa que preciso aprender...