Página 1 de 2

como expandir portas do 8051 usando shift registers?

MensagemEnviado: 20 Abr 2014 15:21
por renan-papaco
nesse caso queria aprender expandir portas de entrada com CD4021, ou o 74LS165...tendo mais 8 bits de entrada...como proceder passo a passo?(obs: usando qualquer port do mcu.

Re: como expandir portas do 8051 usando shift registers?

MensagemEnviado: 20 Abr 2014 21:42
por ze2
só fiz com saída com hc164 mas o princípio me parece ser relativamente fácil e o mesmo pro 165: um pino de entrada de dado e um pino de clock. o pino sh/ld não consigo pensar no uso dele agora.
Código: Selecionar todos
#define clk P10
#define dado P11
//#define shld P12
P1=0xff;//me lembro vagamente que tive que fazer isso pra não fica preso em 0. (no século passado)
unsigned char lebyte(void)
{
unsigned char i,d=0;
for (i=0;i<8;i++) //8 bits
   {
   clk=1;//aciona o shift reg
   asm"nop";//asm"nop";//talvez + de 1. Um tempinho em 1
   clk=0;

   d|=P11; //captura o bit

   d<<=1;//próximo - desloca em sw
   }
return d;
}

Digitei online. Me autopermito-me a mim mesmo próprio o benefício de qualquer engano
abç
Ah sim... de nada

Re: como expandir portas do 8051 usando shift registers?

MensagemEnviado: 21 Abr 2014 08:53
por renan-papaco
vlw pela ajuda...mas tira aí umas duvidas...
pelo que eu vi a variavel "d" é que armazena os valores .
a variavel "i" conta até 8 permitindo q D só guarde 8 bits num é? e o q significa esse asm"nop" seria para impedir qualquer operação do MPU para sincronizar a entrada de dados com o clock?(se não sincronizar, bagunça a p%#$ toda

e no caso, o switch case mesmo serviria para eu poder ler o que estaria nesta variavel né?

Re: como expandir portas do 8051 usando shift registers?

MensagemEnviado: 21 Abr 2014 10:28
por tcpipchip


Se quiseres tambem mando o fonte....mas fiz em ASSEMBLY....

Re: como expandir portas do 8051 usando shift registers?

MensagemEnviado: 21 Abr 2014 10:37
por renan-papaco
tcpipchip escreveu:https://dl.dropboxusercontent.com/u/83554849/BALAS_MENU.pdf

Se quiseres tambem mando o fonte....mas fiz em ASSEMBLY....

valeu aí...só preciso aprender uma maneira de sincronizar o clock do shift register com a entrada serial para ler os dados corretamente... alguem tem uma ideia de como faço isso?

Re: como expandir portas do 8051 usando shift registers?

MensagemEnviado: 21 Abr 2014 11:39
por tcpipchip
tem o pino para resetar o SHIFTER

Código: Selecionar todos
Rem ***********************************************************************
Rem * Esta rotina le os 4021, RETORNA EM dado_sensor e dado_selecao
Rem * Parametros: nenhum
Rem * Retorna: dado_sensor, dado_selecao
Rem ***********************************************************************
Sub Rec_4021_sensor_selecao_produto()
   Set Stb_4021_sensor_selecao_produto
   nop
   nop
   nop
   nop
   nop
   Reset Stb_4021_sensor_selecao_produto
   nop
   nop
   nop
   nop
   nop
   nop
   For Loop_o = 1 To 8
      MOV A , {Dado_SELECAO}
      MoV C , Sda_4021_sensor_selecao_produto
      RLC A
      MOV {dado_SELECAO} , A
      Reset Scl_4021
      NOP
      nop
      nop
      nop
      nop
      nop
      Set Scl_4021
      NOP
      nop
      nop
      nop
      nop
      nop
   Next

   For Loop_o = 1 To 8
      MOV A , {Dado_SENSOR}
      MoV C , Sda_4021_sensor_selecao_produto
      RLC A
      MOV {Dado_SENSOR} , A
      Reset Scl_4021
      nop
      nop
      nop
      nop
      nop
      nop
      Set Scl_4021
      NOP
      nop
      nop
      nop
      nop
      nop
   Next
   Waitms 100
End Sub

Re: como expandir portas do 8051 usando shift registers?

MensagemEnviado: 21 Abr 2014 14:17
por Red Neck Guy
Defina o que seria sincronizar.
A principio, é bem simples ler esse cara, simplificando é assim:
1) PS é um load para cada um dos FFs internos, então você deve comutá-lo antes do ciclo de leitura
2) A saída Q8 é onde você irá ler os bits enfileirados, iniciando pela entrada P8 que já é disponibilizada logo após o clock no pino PS
3) Depois disso, a cada borda de clock, os bits vão sendo deslocados de Q0 para Q8 e você vai lendo eles, por essa razão a maioria dos códigos que leem esse tipo de chip tem um loop,

Então, agora se você não quer fazer com loop, não precisa, mas é uma solução que fica a teu critério.
Eu te aconselho a dar uma olhada em um livro de lógica sobre o funcionamento de registradores de deslocamento, estudar um pouco sobre algoritmos aí certas coisas irão fazer sentido pra ti.
Não me entenda mal, é só uma dica para teres sucesso no que está pretendendo construir por aí.

Re: como expandir portas do 8051 usando shift registers?

MensagemEnviado: 21 Abr 2014 19:00
por renan-papaco
eu andei estudando o CD4021... ele tem um latch dentro dele na qual eu devo ativar em 1 para ler o dip SW que incorporei nele, usando resistores de 1K para forçar nivel 0 nas suas entradas... eu percebo q a cada ciclo de leitura esse latch deve ir em 1, sempre quando o software solicitar !!! agora entendi! só preciso q me digam agora qual rotina em C para sincronizar o clock de o shift junto com o pino DATA, pois se não houver sincronia a leitura dará errado.

Re: como expandir portas do 8051 usando shift registers?

MensagemEnviado: 21 Abr 2014 19:27
por Red Neck Guy
A sincronia é simplesmente ler o dado na borda do clock
algo como

Código: Selecionar todos
unsigned char dado=0;
(for i=0;i<8;i++){
dado |= DIN?1:0;
dado<<=1;
CLK = 1;
CLK = 0;
}


Os nops entre as atribuições ao CLK são - digamos a grosso modo - para baixar a frequência do clock e também aumentar a largura do "pulso". Aí, depende do clock do teu sistema e tudo mais, mas tu pode inserir NOPs entre os clocks a vontade.

Re: como expandir portas do 8051 usando shift registers?

MensagemEnviado: 22 Abr 2014 09:12
por ze2
"pelo que eu vi a variavel "d" é que armazena os valores"
= correto. mas note que ela é de uso interno da função que retorna o valor dela. Mas nada impede que voce a coloque por fora (e antes) da função pra ela ser global. aí sim a
"variavel "d" é que armazena os valores"

"a variavel "i" conta até 8 permitindo q D só guarde 8 bits num é?"
= é

"o q significa esse asm"nop"
= nop é é um microdelay dependente da freq do clock do mc. aliás, a única coisa útil do asm. o mc fica um ciclo de máquina sem fazer nada. nop=no operation. algo como sem função. no nosso caso, cada nop deixaria p.ex. 1uS em alto. seria + pra compatibilizar com dados do datashit do hw

"e no caso, o switch case mesmo serviria para eu poder ler o que estaria nesta variavel né?"
= maiomeno. switch case é pra voce comparar o valor da variável . p.ex.
Código: Selecionar todos
switch (lebyte()) //a função pode ser considerada uma variável global
{
case 1: faca_isso();break;
case 2: faca_aquilo();break;
case xxx: fap_fap();break; //break mesmo
}


saiba mais sobre expandir coisas seriais dando uma olhada em "protocolo spi". depois dê mais uma (se conseguir) em "i2c io expander"

abç

Re: como expandir portas do 8051 usando shift registers?

MensagemEnviado: 22 Abr 2014 22:44
por renan-papaco
SPI e I2c podem ser boas pedidas, mas o kit q comprei não ensina a usar esses recursos...até perguntei aqui quem programa 8051 e usa outros recursos... se podia me dizer onde consigo um compilador freeware para usar tais recursos...

Re: como expandir portas do 8051 usando shift registers?

MensagemEnviado: 23 Abr 2014 08:18
por ze2
tais recursos independem do compilador. vc pode usá-los até mesmo com o sdcc. basta uma lida no protocolo e já era. o princípio é simples. seria algo como (a grosso modo) colocar bolinhas de gude pretas e brancas dentro de um tubo de ensaio lateralmente dando um tapinha nelas. Bolinha=bitdado, tapinha=clock
Não, não dei nenhum tapinha. Neste forum prefiro ... 51
abç

Re: como expandir portas do 8051 usando shift registers?

MensagemEnviado: 23 Abr 2014 17:56
por renan-papaco
ze escreveu:tais recursos independem do compilador. vc pode usá-los até mesmo com o sdcc. basta uma lida no protocolo e já era. o princípio é simples. seria algo como (a grosso modo) colocar bolinhas de gude pretas e brancas dentro de um tubo de ensaio lateralmente dando um tapinha nelas. Bolinha=bitdado, tapinha=clock
Não, não dei nenhum tapinha. Neste forum prefiro ... 51
abç


usar esse recurso SPI no SDCC que tenho? nem rola... o compilador dará erro...já q é uma versão capada fornecida do site onde comprei o kit isso a uns 3 anos e tbm to meio afastado da programação por causa do trabalho... oq eu devo fazer é trocar de compilador...o problema é ter q reaprender a programar quase tudo do zero...pois estou acostumado a usar o compilador e a IDE q tenho.

Re: como expandir portas do 8051 usando shift registers?

MensagemEnviado: 23 Abr 2014 18:12
por andre_luis
renan-papaco escreveu:usar esse recurso SPI no SDCC que tenho? nem rola... o compilador dará erro...


Não é bem assim: O acesso á dispositivos SPI nos compiladores pode ser feito atrávez de API´s presentes em bibliotecas pré-compiladas ou atravéz de drivers que voce mesmo pode adicionar manualmente ao seu projeto. No caso acima, pode procurar por implementações prontas na Web pela palavra-chave "SPI.C", "SDCC" , "8051" que encontra algumas opções para dispositivos diversos.

No caso, você não terá de se preocupar com nem uma linha do código que importar, mas apenas com o que entra ou sai da funçao.
Por exemplo, numa função que tivesse o seguinte formato: int ReadSPI ( int address ) você leria o valor diretamente no retorno da função, sem se ater ao que o autor escreveu dentro dela.

renan-papaco escreveu:...o problema é ter q reaprender a programar quase tudo do zero...pois estou acostumado a usar o compilador e a IDE q tenho.


Também tenho de discordar disso, pois a linguagem é C standard, e o que muda é apenas a sintaxe de alguns comandos.
Sempre que troquei de compilador, tive de lidar com centenas de erros de compilação, mas pra nossa sorte, são todos encadeados; ou seja, conforme elimina um problema, dezenas de outros desaparecem por tabela, e em poucas horas ( ou menos ) já está com o novo programa rodando.



+++

Re: como expandir portas do 8051 usando shift registers?

MensagemEnviado: 23 Abr 2014 22:12
por renan-papaco
eh mas comigo não é tão simples assim... pois justamente estou usando um compilador com headers pré compiladas... é ai que ferra td... a melhor coisa a fazer mesmo é parar de usa-lo ou usa-lo pra determinadas funções e usar um mais fodão pra funções mais gerais.(i/o mapeada é q é F***..)