como fazer a soma de valor de duas variaveis ?

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

como fazer a soma de valor de duas variaveis ?

Mensagempor renan-papaco » 29 Dez 2013 15:02

é 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?
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

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

Mensagempor andre_luis » 29 Dez 2013 15:21

Em que linguagem de programação ?





+++
"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

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

Mensagempor renan-papaco » 31 Dez 2013 13:44

em C usando SDCC
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

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

Mensagempor andre_luis » 31 Dez 2013 16:51

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.


+++
"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

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

Mensagempor renan-papaco » 31 Dez 2013 19:57

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.
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

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

Mensagempor EvandrPic » 31 Dez 2013 20:31

é 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.
Você não está autorizado a ver ou baixar esse anexo.
EvandrPic
Dword
 
Mensagens: 2116
Registrado em: 31 Mar 2010 15:05

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

Mensagempor renan-papaco » 31 Dez 2013 20:32

Imagem


assim?

uhuuu consegui!
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

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

Mensagempor andre_luis » 01 Jan 2014 08:25

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.


+++
"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

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

Mensagempor renan-papaco » 01 Jan 2014 13:59

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.
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

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

Mensagempor andre_luis » 01 Jan 2014 15:23

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 ;
    }




+++
"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

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

Mensagempor Red Neck Guy » 01 Jan 2014 15:32

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];
}

ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

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

Mensagempor renan-papaco » 01 Jan 2014 23:08

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.
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

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

Mensagempor Red Neck Guy » 02 Jan 2014 09:43

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;     
}


ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

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

Mensagempor renan-papaco » 02 Jan 2014 23:21

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?
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

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

Mensagempor renan-papaco » 02 Jan 2014 23:22

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...
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Próximo

Voltar para 8051

Quem está online

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

x