Ir ao conteúdo

Dúvida com pic16f877a e 74HC595


jjean

Posts recomendados

Postado

boa tarde, 

estou montando um circuito com o 74HC595 e o PIC16f877a com cristal de 10MHz. 

nas saídas do 74HC595 liguei alguns LEDs, ele mostra algumas informações enviada normalmente, porém alguns LEDs ficam sempre ligados, quando troco os CIs de lugar os LEDs acesos também mudam, o que indica que não é CI com defeito na saída nem programação.

 

alguém já teve um problema parecido? ou sabe o que posso tentar pra resolver?

a ligação fiz semelhante a esta 

schematic_74hc595.jpg?1366148875

 

abraço

Postado

 

...o que indica que não é CI com defeito na saída nem programação.

Para podermos falar o mesmo,temos que ver o programa.

Postado

obrigado VTRX pelo retorno,

foi usado partes de programas encontrados aqui no fórum.

#include <16f877a.h>#FUSES NOWDT //No Watch Dog Timer#FUSES PUT //Power Up Timer#FUSES NOPROTECT //Code not protected from reading#FUSES NODEBUG //No Debug mode for ICD#FUSES BROWNOUT //Reset when brownout detected#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O#FUSES NOCPD //No EE protection#FUSES HS#define EXP_OUT_ENABLE PIN_E1 //RCK - terminal 12 do 74HC595(1)#define EXP_OUT_CLOCK PIN_E0 //SCK - terminal 11 do 74HC595(1)#define EXP_OUT_DO_1 PIN_E2 //SER - terminal do 74HC595(1)#use delay(clock=10000000)int16 data1,data2,data3,data4,data5;////------ 74HC595 serial chip --------------void outSerial(int8 chip1,int8 chip2){int8 i;int32 data;data = data | chip2|data2;data = data<<8;data = data | chip1|data1;// Output to serial linefor(i=0; i<16; i++){if(data & 0x8000){output_high(EXP_OUT_DO_1);}else{output_low(EXP_OUT_DO_1);}data = data<<1;output_low(EXP_OUT_CLOCK); //Shift dataoutput_high(EXP_OUT_CLOCK);}output_low(EXP_OUT_ENABLE); //Output on pinsoutput_high(EXP_OUT_ENABLE);}///////////////////////////////////////////////////////////void inicia(){outserial(0b00000001, 0b00000000);delay_ms(50);outserial(0b00000010, 0b00000000);delay_ms(50);outserial(0b00000100, 0b00000000);delay_ms(50);outserial(0b00001000, 0b00000000);delay_ms(50);outserial(0b00010000, 0b00000000);delay_ms(50);outserial(0b00100000, 0b00000000);delay_ms(50);outserial(0b01000000, 0b00000000);delay_ms(50);outserial(0b10000000, 0b00000000);delay_ms(50);outserial(0b00000000, 0b00000001);delay_ms(50);outserial(0b00000000, 0b00000010);delay_ms(50);outserial(0b00000000, 0b00000100);delay_ms(50);outserial(0b00000000, 0b00001000);delay_ms(50);outserial(0b00000000, 0b00010000);delay_ms(50);outserial(0b00000000, 0b00100000);delay_ms(50);outserial(0b00000000, 0b01000000);delay_ms(50);outserial(0b00000000, 0b10000000);delay_ms(50);}void main(){while(true){output_toggle(pin_d2);INICIA();}}
abraço
Postado

Explique melhor o problema,tipo:

 

...ele mostra algumas informações enviada normalmente, porém alguns LEDs ficam sempre ligados...

Se voce enviar zero,todos os leds ficam apagados?

Alguns leds ficam acesos somente quando inicia o circuito(reset)?

 

 

...quando troco os CIs de lugar os LEDs acesos também mudam...

Pelo que disse,estou supondo que os leds ficam acesos aleatoriamente apenas na inicialização do circuito,se for isto,é normal mesmo.

Postado

Pelo que disse,estou supondo que os leds ficam acesos aleatoriamente apenas na inicialização do circuito,se for isto,é normal mesmo.

quando eu inicio o programa os leds correm, mas considerei isso normal.

o que acontece é que um led ou mais ficam ligados sempre, se eu retiro e recoloco o 74HC595 o led aceso muda de posição, mas continua algum aceso.

 

Explique melhor o problema,tipo:

Se voce enviar zero,todos os leds ficam apagados?

Alguns leds ficam acesos somente quando inicia o circuito(reset)?

fiz o teste de enviar zero e funcionou normalmente, retornei a programação antiga e também funcionou.  :confused:

posso ter me confundido entre os programas (o que acho pouco provável), porque continuei os testes mesmo com esse problema

 

este está apresentando o problema desde o inicio, onde ele "corre" os leds.

#include <16f877a.h>#FUSES NOWDT                    //No Watch Dog Timer#FUSES PUT                      //Power Up Timer#FUSES NOPROTECT                //Code not protected from reading#FUSES NODEBUG                  //No Debug mode for ICD#FUSES BROWNOUT                 //Reset when brownout detected#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O#FUSES NOCPD                    //No EE protection#FUSES HS #define EXP_OUT_ENABLE  PIN_E1 //RCK - Pino 12 do 74HC595(1)#define EXP_OUT_CLOCK   PIN_E0 //SCK - Pino 11 do 74HC595(1)#define EXP_OUT_DO_1    PIN_E2 //SER - Pino 14 do 74HC595(1) #use delay(clock=10000000)int16 contador=0,RPM;int16 data1,data2;////------  74HC595 serial chip --------------void outSerial(int8 chip1,int8 chip2) {   int8 i;   int32 data;      data = data | chip2|data2;   data = data<<8;   data = data | chip1|data1;      // Output to serial line   for(i=0; i<16; i++)      {      if(data & 0x8000)         {         output_high(EXP_OUT_DO_1);}      else         {         output_low(EXP_OUT_DO_1);}               data = data<<1;            output_low(EXP_OUT_CLOCK);     //Shift data      output_high(EXP_OUT_CLOCK);      }   output_low(EXP_OUT_ENABLE);         //Output on pins   output_high(EXP_OUT_ENABLE);   }void inicia(){        outserial(0b00000001, 0b00000000);         delay_ms(50);                outserial(0b00000010, 0b00000000);         delay_ms(50);                outserial(0b00000100, 0b00000000);         delay_ms(50);                 outserial(0b00001000, 0b00000000);         delay_ms(50);                outserial(0b00010000, 0b00000000);         delay_ms(50);                 outserial(0b00100000, 0b00000000);         delay_ms(50);               outserial(0b01000000, 0b00000000);         delay_ms(50);                 outserial(0b10000000, 0b00000000);         delay_ms(50);                outserial(0b00000000, 0b00000001);         delay_ms(50);                 outserial(0b00000000, 0b00000010);         delay_ms(50);               outserial(0b00000000, 0b00000100);         delay_ms(50);                 outserial(0b00000000, 0b00001000);         delay_ms(50);                outserial(0b00000000, 0b00010000);         delay_ms(50);                 outserial(0b00000000, 0b00100000);         delay_ms(50);                outserial(0b00000000, 0b01000000);         delay_ms(50);                 outserial(0b00000000, 0b10000000);         delay_ms(50);}     #int_timer1void timer1_isr(void){   output_toggle (pin_d2);    contador=get_timer0();      RPM=contador*150;         outserial(0b00000001, 0b00000000);              set_timer0 (0);   set_timer1 (3036);    //Preload do Timer1   }void main(){  INICIA();output_high (pin_d2);   setup_timer_0(rtcc_ext_h_to_l | rtcc_div_1);   setup_timer_1(t1_internal | t1_div_by_8);      set_timer0(0);   set_timer1(3036);   enable_interrupts(int_timer1);   enable_interrupts(global);}

obrigado pelo retorno Aphawk

@jjean,

 

Se estiver aconteçendo apenas no início, tipo quando liga, é só colocar um circuito RC no pino de Reset.

 

Paulo

no terminal do reset utilizo apenas o resistor de pull-up.

o problema ocorre em todo o roteiro.

 

abraço

Postado

Tente alterar o trecho:

void outSerial(int8 chip1,int8 chip2) {   int8 i;   int32 data;   output_high(EXP_OUT_ENABLE);      data = 0;   data = data | chip2|data2;   data = data<<8;   data = data | chip1|data1;   

Se não funcionar,é possivel gravar um video com o problema?

Postado

@jjean,

 

Dentro de sua rotina OutSerial() , quando voce faz um pulso, coloque um pequeno delay . Não entendo nada de C, o delay é com você... :

 

 

output_low(EXP_OUT_CLOCK); //Shift data
//"COLOQUE AQUI QQR COISA PARA FAZER UM DELAY"

output_high(EXP_OUT_CLOCK);


output_low(EXP_OUT_ENABLE); //Output on pins
//"COLOQUE AQUI QQR COISA PARA FAZER UM DELAY"

output_high(EXP_OUT_ENABLE);

 

Deve resolver.

 

Paulo

Postado
#include <16f877a.h>#FUSES NOWDT                    //No Watch Dog Timer#FUSES PUT                      //Power Up Timer#FUSES NOPROTECT                //Code not protected from reading#FUSES NODEBUG                  //No Debug mode for ICD#FUSES BROWNOUT                 //Reset when brownout detected#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O#FUSES NOCPD                    //No EE protection#FUSES HS#define EXP_OUT_ENABLE  PIN_E1 //RCK - Pino 12 do 74HC595(1)#define EXP_OUT_CLOCK   PIN_E0 //SCK - Pino 11 do 74HC595(1)#define EXP_OUT_DO_1    PIN_E2 //SER - Pino 14 do 74HC595(1)#use delay(clock=10000000)#use   fast_io(E)int16 contador=0,RPM;int16 data1,data2;////------  74HC595 serial chip --------------void outSerial(int8 chip1,int8 chip2) {   int8 i;   int32 data;      data = data | chip2|data2;   data = data<<8;   data = data | chip1|data1;      // Output to serial line   for(i=0; i<16; i++)      {      if(data & 0x8000)         {         output_high(EXP_OUT_DO_1);}      else         {         output_low(EXP_OUT_DO_1);}               data = data<<1;            output_low(EXP_OUT_CLOCK);     //Shift data      output_high(EXP_OUT_CLOCK);      }   output_low(EXP_OUT_ENABLE);         //Output on pins   #asm nop #endasm     output_high(EXP_OUT_ENABLE);   }void inicia(){        outserial(0b00000001, 0b00000000);         delay_ms(50);                outserial(0b00000010, 0b00000000);         delay_ms(50);                outserial(0b00000100, 0b00000000);         delay_ms(50);                 outserial(0b00001000, 0b00000000);         delay_ms(50);                outserial(0b00010000, 0b00000000);         delay_ms(50);                 outserial(0b00100000, 0b00000000);         delay_ms(50);               outserial(0b01000000, 0b00000000);         delay_ms(50);                 outserial(0b10000000, 0b00000000);         delay_ms(50);                outserial(0b00000000, 0b00000001);         delay_ms(50);                 outserial(0b00000000, 0b00000010);         delay_ms(50);               outserial(0b00000000, 0b00000100);         delay_ms(50);                 outserial(0b00000000, 0b00001000);         delay_ms(50);                outserial(0b00000000, 0b00010000);         delay_ms(50);                 outserial(0b00000000, 0b00100000);         delay_ms(50);                outserial(0b00000000, 0b01000000);         delay_ms(50);                 outserial(0b00000000, 0b10000000);         delay_ms(50);}     #int_timer1void timer1_isr(void){   output_toggle (pin_d2);   contador=get_timer0();      RPM=contador*150;         outserial(0b00000001, 0b00000000);              set_timer0 (0);   set_timer1(3036 - get_timer1());    //Preload do Timer1   }void main(){ INICIA();   set_tris_d(0b11111111);   set_tris_e(0b00001111);   output_high (pin_d2);   setup_timer_0(rtcc_ext_h_to_l | rtcc_div_1);   setup_timer_1(t1_internal | t1_div_by_8);      set_timer0(0);   set_timer1(3036);   enable_interrupts(int_timer1);   enable_interrupts(GLOBAL);}

Da o retorno.

Tem outro detalhe que não entendi direito.

DATA teria que ser de 8 bits e não 32.

Postado

Mais uma tentativa pois esqueci de um detalhe.

Altere:

      output_low(EXP_OUT_CLOCK);     //Shift data     #asm nop #endasm        output_high(EXP_OUT_CLOCK);      }   output_low(EXP_OUT_ENABLE);         //Output on pins   #asm nop #endasm     output_high(EXP_OUT_ENABLE);

voce não complicou muito na rotina onde usa a variavel DATA?

32 bits em DATA,o deslocamento fica mais complicado de calcular.

O normal é deslocar 8 bits de dados,não entendo como não perder bits deslocando 16...

Postado

acredito que meu pic tenha dado algum problema porque agora, voltei com a programação antiga e também está travando  :(

 

o uso de 32 bits é porque irei usar 4 74HC595, estou com um apenas para testes.

 

quando der uma esfriada na cabeça vou revisar a placa e retorno com o que aconteceu.

obrigado pela ajuda  :joia:

 

abraço

Postado

consegui faze-lo funcionar. acabei apagando esta linha da programação de dentro do void main() por engano em alguma situação.

while(TRUE){}

não sei o porque mas ele funcionou normalmente, sem os LEDs "travados" acesos. 

 

agradeço pela ajuda :joia:

 

abraço

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!