Página 1 de 2
74hc164 & pic16f628A

Enviado:
14 Jan 2013 22:36
por cassiolws
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
Re: 74hc164 & pic16f628A

Enviado:
15 Jan 2013 11:34
por diogo_18sp
posta o circuito q vc simulou???

Enviado:
15 Jan 2013 12:17
por ze
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ç

Enviado:
16 Jan 2013 17:04
por cassiolws
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ç.

Enviado:
16 Jan 2013 19:16
por vtrx
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.

Enviado:
17 Jan 2013 08:18
por ze
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á...

Enviado:
17 Jan 2013 09:01
por EvandrPic
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ç.

Enviado:
18 Jan 2013 09:30
por cassiolws
Segue, imagem do circuito que eu simulei.


Enviado:
18 Jan 2013 09:47
por cassiolws
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

Enviado:
18 Jan 2013 10:45
por vtrx
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.

Enviado:
18 Jan 2013 12:06
por ze
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ç

Enviado:
18 Jan 2013 13:39
por cassiolws
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);
}
}
}

Enviado:
24 Jan 2013 16:38
por cassiolws
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!

Enviado:
25 Jan 2013 07:42
por ze
é.

Enviado:
25 Jan 2013 08:27
por KrafT
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)