74hc164 & pic16f628A

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

74hc164 & pic16f628A

Mensagempor cassiolws » 14 Jan 2013 22:36

Estou trabalhando com tres 74hc164 ligados em série e com leds ligados nas saídas e um pic16f628A gerenciando, simulando no proteus o programa funciona somente quando desloco bits para a direita, quando desloco para a esquerda somente o primeiro dos três shifts funciona, na placa montada todos os leds piscam, revirei a placa e parece não ser problema de hardware. Se alguém puder ajudar segue programa feito em Mikro C

Código: Selecionar todos
//INICIO SAIDAS                     //DEFINE SAÍDAS
#define CLOCK PORTA.B2                   //PINO RA2->LINHA DE CLOCK 74HC164
#define DATA PORTA.B3                    //PINO RA3->LINHA DE DADOS 74HC164
//FIM SAIDAS
//------------------

void SHIFT(unsigned char DADO1, unsigned char DADO2, unsigned char DADO3)
{
unsigned char X, X1, X2;
         X1=DADO1;
         X2=0;
         for(X=0;X<24;X++)
            {
            if (X2==8)X1=DADO2;
            if (X2==16)X1=DADO3;
            if (X1&1) DATA=1;
            else DATA=0;
            CLOCK=1;
            CLOCK=0;
            X1>>=1;
            X2++;
            }
}                                   //FIM SHIFT

void main()
{
unsigned char CA, TESTE1, TESTE2, TESTE3;
unsigned char A;
TRISA=0b11110011;
TRISB=0b00000000;
CMCON=0X07;

PORTA=0;
PORTB=0;
TESTE1=255;
TESTE2=255;
TESTE3=255;
CLOCK=0;
SHIFT(TESTE1, TESTE2, TESTE3);
DELAY_MS(1000);
while (1)
{
  A==0;
   for(CA=0;CA<24;CA++)
     {
     if (A<8) TESTE1>>=1;
     if (A>7 & A<16) TESTE2>>=1;
     if (A>15) TESTE3>>=1;
     SHIFT(TESTE1, TESTE2, TESTE3);
     A++;
     DELAY_MS(1000);
     }//FOR
  DELAY_MS(1000);
  TESTE1=20;
  TESTE2=50;
  TESTE3=1;
  SHIFT(TESTE1, TESTE2, TESTE3);
  A==0;
  DELAY_MS(1000);
  for(CA=0;CA<24;CA++)
     {
     if (A<8) TESTE1<<=1;
     if (A>7 & A<16) TESTE2<<=1;
     if (A>15) TESTE3<<=1;
     SHIFT(TESTE1, TESTE2, TESTE3);
     A++;
     DELAY_MS(1000);
     }//FOR
}//WHILE
}//MAIN
Editado pela última vez por cassiolws em 16 Jan 2013 09:50, em um total de 1 vez.
eletronic´s 666 \m/
cassiolws
Bit
 
Mensagens: 26
Registrado em: 15 Jul 2008 00:42

Re: 74hc164 & pic16f628A

Mensagempor diogo_18sp » 15 Jan 2013 11:34

posta o circuito q vc simulou???
diogo_18sp
Byte
 
Mensagens: 117
Registrado em: 14 Jan 2008 18:12
Localização: Amparo ,SP

Mensagempor ze » 15 Jan 2013 12:17

o h.w. do ci 164 desloca de um lado só mesmo. Vou considerar que voce cascateou corretamente. Por s.w. uma maneira de deslocar 3 bytes...
Código: Selecionar todos
void desloca1byte(unsigned char a)
{
unsigned char i;
for (i=0;i<8;i++)
   {
   DATA=a;
      CLOCK=1;
   //talvez interessante uns asm "nop" aqui
      CLOCK=0;
      a>>=1;
   }
}
void desloca3bytes(unsigned char a,unsigned char b,unsigned char c)
{
desloca1byte(a);
desloca1byte(b);
desloca1byte(c);
}
Para acionar reles com o 164 não é muito lega pois vai haver acionamento indesejado. dá até pra usar mas teria que ter um sinal de enable dos reles por fora. o legal é o hc595 que desloca internamente antes de por pra fora.
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor cassiolws » 16 Jan 2013 17:04

diogo_18sp Cara vou postar o esquema aqui só não sei como fazer isso ainda. hehe

Lelis valeu pela resposta mas fiz da maneira que vc falou, ja havia feito antes e agora fiz novamente pq vai que é urucubaca, mas deu a mesma coisa, no proteus ele faz a sequencia para a direita mas para a esquerda ele so faz no primeiro shift e quando eu boto pra rodar na placa não acontece nada.
Quando eu faço deslocamento para a esquerda eu estou fazendo nas variáveis TESTE e não diretamente no hc164, isso influencia em alguma coisa? Não entendi quando vc falou que ele só desloca para um lado.

Abç.
cassiolws
Bit
 
Mensagens: 26
Registrado em: 15 Jul 2008 00:42

Mensagempor vtrx » 16 Jan 2013 19:16

Para a esquerda,voce vai ter que ou usar o hc595 ou fazer uma alteração no circuito e 'emular' um GATE colocando um transistor entre o terra geral do 164 e o terra do circuito pois voce vai ter que deslocar todos os bits por vez mantendo apenas o ultimo,antepenultimo etc.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor ze » 17 Jan 2013 08:18

para postar desenhos hospede-o no imageshack p.ex., visualize no seu navegador, copie o link que aparece na barra de endereço e cole no post entre [i m g] http....bla bla bla [/ i m g] sem espaços. sei lá talvez funcione. tem um post fixo sobre isso aqui mesmo no asm51.

então separemos o sw do hw.
-hw:o 164 só desloca prum lado: do Q0 ao Q7. mas esse não é seu problema no momento. desculple mas preciso escrever isso pra confrmar...é cascata mas voce deve ligar o Q7 de um no D0 do outro.

o foco...
-sw:tô 1/2 cego. mostra onde está o trecho do sw que desloca p esquerda... ahhh achei. depois que desloca p esquerda, o bit 0 sempre vai ser 0. talvez aí seu problema. sei lá...
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor EvandrPic » 17 Jan 2013 09:01

Como postar imagens no ASM51:
http://www.asm51.eng.br/phpBB/viewtopic.php?t=847


cassiolws escreveu:diogo_18sp Cara vou postar o esquema aqui só não sei como fazer isso ainda. hehe

Lelis valeu pela resposta mas fiz da maneira que vc falou, ja havia feito antes e agora fiz novamente pq vai que é urucubaca, mas deu a mesma coisa, no proteus ele faz a sequencia para a direita mas para a esquerda ele so faz no primeiro shift e quando eu boto pra rodar na placa não acontece nada.
Quando eu faço deslocamento para a esquerda eu estou fazendo nas variáveis TESTE e não diretamente no hc164, isso influencia em alguma coisa? Não entendi quando vc falou que ele só desloca para um lado.

Abç.
EvandrPic
Dword
 
Mensagens: 2116
Registrado em: 31 Mar 2010 15:05

Mensagempor cassiolws » 18 Jan 2013 09:30

Segue, imagem do circuito que eu simulei.


Imagem
eletronic´s 666 \m/
cassiolws
Bit
 
Mensagens: 26
Registrado em: 15 Jul 2008 00:42

Mensagempor cassiolws » 18 Jan 2013 09:47

Lelis e vtrx a parte que eu desloco os bits para a esquerda é essa, veja que eu desloco as variáveis, e não mudo a maneira de enviar os bits para o shift. Mas mesmo assim quando o programa chega a esta parte somente o primeiro shift funciona ele não faz o empilhamento para os próximos.



Código: Selecionar todos
 
DELAY_MS(1000);
  TESTE1=20;
  TESTE2=50;
  TESTE3=1;
  SHIFT(TESTE1, TESTE2, TESTE3);
  A==0;
  DELAY_MS(1000);
  for(CA=0;CA<24;CA++)
     {
     if (A<8) TESTE1<<=1;
     if (A>7 & A<16) TESTE2<<=1;
     if (A>15) TESTE3<<=1;
     SHIFT(TESTE1, TESTE2, TESTE3);
     A++;
     DELAY_MS(1000);
     }//FOR
eletronic´s 666 \m/
cassiolws
Bit
 
Mensagens: 26
Registrado em: 15 Jul 2008 00:42

Mensagempor vtrx » 18 Jan 2013 10:45

Não tem como voce deslocar da esquerda para direita sem Flicker usando o HC164,a menos que faça um Hardware para isso que seria isolar os terras dos Leds e ligá-los ao coletor de um transistor,tipo o BC548,o emissor do transistor no terra e a base num pino do micro com o software excitando a base cada vez que todos os dados dos 3 HC estiverem carregados.
É a maneira mais barata que tem.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor ze » 18 Jan 2013 12:06

talvez seu compilador avisou mas voce nao percebeu. tente com if ((A>7) && (A<16)) TESTE2<<=1; coloque todas as variáveis teste=1. compartilhe o .dsn. pregui de conectar os treco. quem sabe + tarde simulo pra ver. otra coisa voce incrementa CA e faz comparação com A. usa o CA mesmo carai. e A==0???? isso é novo pra mim. o compilador não xingou? antigamente era A=0;
na etapa do fliker voce ainda vai chegar
tudo eu pra pensar poha. ainda acho que fazer 3 rotações de 8 é melhor.
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor cassiolws » 18 Jan 2013 13:39

Lellis, meu primeiro teste eu fiz bem parecido com o que vc falou com referencia a 3 rotações de 8, mas dai começo a dar erradao e modifiquei o prog e fico esse coco. hehe Consegui fazer funcionar da maneira que vc falou, tirei a variável "A" usei somente CA mesmo sei la de onde que eu tirei esse A, bom pelo menos no simulador funcionou, rotacionou direitinho para os dois lados, mas na placa não, hehe vou ter que ver aqui e vou refazer a placa.

Segue o prog da maneira que funcionou:

Código: Selecionar todos
//INICIO SAIDAS                     //DEFINE SAÍDAS
#define CLOCK PORTA.B2              //PINO RA2->LINHA DE CLOCK 74HC164
#define DATA PORTA.B3               //PINO RA3->LINHA DE DADOS 74HC164
//FIM SAIDAS
//------------------
void DESLOCA1BYTE(unsigned char A)
{
unsigned char I;
for (I=0;I<8;I++)
   {
   DATA=A;
      CLOCK=1;
      CLOCK=0;
      A>>=1;
   }//FOR
}//DESLOCA1BYTE

void DESLOCA3BYTES(unsigned char A,unsigned char B,unsigned char C)
{
DESLOCA1BYTE(A);
DESLOCA1BYTE(B);
DESLOCA1BYTE(C);
}// DESLOCA3BYTES

void main()
{
unsigned char CA, TESTE1, TESTE2, TESTE3;
TRISA=0b11110011;
TRISB=0b00000000;
CMCON=0X07;

PORTA=0;
PORTB=0;
TESTE1=255;
TESTE2=255;
TESTE3=255;
CLOCK=0;
DESLOCA3BYTES(TESTE1, TESTE2, TESTE3);
DELAY_MS(1000);
while (1)
{
   for(CA=0;CA<24;CA++)
     {
     if (CA<8) TESTE1>>=1;
     if ((CA>7 && CA<16)) TESTE2>>=1;
     if (CA>15) TESTE3>>=1;
     DESLOCA3BYTES(TESTE1, TESTE2, TESTE3);
     DELAY_MS(1000);
     }//FOR
  DELAY_MS(1000);
  TESTE1=1;
  TESTE2=1;
  TESTE3=1;
  DESLOCA3BYTES(TESTE1, TESTE2, TESTE3);
  DELAY_MS(1000);
  for(CA=0;CA<24;CA++)
     {
     if (CA<8) TESTE1<<=1;
     if ((CA>7 && CA<16)) TESTE2<<=1;
     if (CA>15) TESTE3<<=1;
     DESLOCA3BYTES(TESTE1, TESTE2, TESTE3);
     DELAY_MS(1000);
     }
}
}
eletronic´s 666 \m/
cassiolws
Bit
 
Mensagens: 26
Registrado em: 15 Jul 2008 00:42

Mensagempor cassiolws » 24 Jan 2013 16:38

Montei o circuito novamente, agora na protoboard e funcionou, mas ficou gerando um pequeno espúrio quando o uC envia os dados para o shift os Leds dão uma piscada bem rápida. É normal isso?

Abraço!
eletronic´s 666 \m/
cassiolws
Bit
 
Mensagens: 26
Registrado em: 15 Jul 2008 00:42

Mensagempor ze » 25 Jan 2013 07:42

é.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor KrafT » 25 Jan 2013 08:27

lellis escreveu:é.


Leia-se: "Para acionar reles com o 164 não é muito legal pois vai haver acionamento indesejado. dá até pra usar mas teria que ter um sinal de enable dos reles por fora. o legal é o hc595 que desloca internamente antes de por pra fora." (by lellis, algumas linhas acima)
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Próximo

Voltar para PIC

Quem está online

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

cron

x