Página 1 de 2

74HC595 COM PIC 16F876

MensagemEnviado: 09 Dez 2015 10:04
por eloyfm
Ola Pessoal..
Sou iniciante e estou tentando fazer um programa funcionar dois 74HC595 com 16F876.
Preciso que o PIC receba um sinal em 10 entradas e que faça acender ou apagar
10 LEDs atravéz dos dois 74HC595. Basicamente só preciso aumentar as saidas do
PIC com esse Shifter Register. Entendi como funciona o shifter regiter e até consegui
fazer alguns testes manualmente, mas não consigo entender como seria o código.
Alguem poderia fazer a gentileza de dar uma ajuda, ou indicar algum exemplo, ou
mesmo um livro ou apostila que eu possa aprender ?? agradeço ....

Re: 74HC595 COM PIC 16F876

MensagemEnviado: 09 Dez 2015 10:21
por Red Neck Guy
Código: Selecionar todos
void LIB74595_enviaByte(unsigned char dado){
 
  for(unsigned char i=0;i<8;i++){
    SET_LED_DATA(0);
    if(dado&(0x01<<i))
      SET_LED_DATA(1);
    BLOCO_NOP;

    SET_LED_CLOCK(1);
    //vTaskDelay(1);
    BLOCO_NOP;
   
    SET_LED_CLOCK(0);
    //vTaskDelay(1);//
    BLOCO_NOP;
  }
 
  SET_LED_STROBE(1);
  //vTaskDelay(1);//
  BLOCO_NOP;
  SET_LED_STROBE(0); 
  //vTaskDelay(1);//
  BLOCO_NOP;   
}

Re: 74HC595 COM PIC 16F876

MensagemEnviado: 09 Dez 2015 12:34
por eloyfm
Ok..Esqueci de dizer.. Eu uso o CCS.

Vou tentar decifrar o codigo para entender pois como não conheço muito bem, é dificil
entender codigo sem comentário...
obrigado

Re: 74HC595 COM PIC 16F876

MensagemEnviado: 09 Dez 2015 15:05
por xultz
Eloyfm, vou tentar deixar mais mastigado prá você, então.
Estou me baseando neste datasheet: http://www.onsemi.com/pub_link/Collater ... 595A-D.PDF
Assim fica mais fácil saber qual pino eu me refiro, usando os nomes que este datasheet deu a eles.

Bom, pro 595 funcionar normalmente, ele precisa que o pino Output Enable esteja em nível baixo o tempo todo. O ideal é que seja aplicado um pulso de reset (de nível baixo) no pino Master Reset, mas não é exatamente obrigatório. Prá ficar pro o teu circuito, vamos supor que você ligou o Master Reset ao pino RB0 do PIC. Vamos supor que você ligou o pino Latch Clock ao pino RB1, e ligou o pino Shift Clock ao pino RB2, e ligou o pino Serial Data Input ao pino RB3.

Vou colocar aqui um código, mas eu vou escrever ele de cabeça, eu não tenho CCS aqui prá compilar ele, nem testar, então podem ter erros que você vai ter que debugar.

Código: Selecionar todos
// Estes defines servem somente prá deixar o código mais bonito
#define RESET PIN_B0
#define LATCH PIN_B1
#define CLOCK PIN_B2
#define DATA PIN_B3

// Faz um reset no pino Master Reset, colocando ele em nível baixo e depois mantendo em nivel alto
output_low(RESET);
delay_us(10);
output_high(RESET);

// Inicializo o pino Shift Clock e Latch Clock em nível baixo
output_low(CLOCK);
output_low(LATCH);

// Esta função recebe um valor de 8 bits, e envia bit por bit pelo pino RB3 ao 74595
void envia_595(unsigned char dado)
{
    unsigned char cont;         // Contador que vai de 0 a 7 para enviar os bits          
   unsigned char mascara = 1;   // Mascara que verifica se o bit é 0 ou 1

    for(cont = 0; cont < 8; cont++)
    {
      if(dado & mascara)      // Esta operação AND tem valor 0 se o bit em questão é 0, e tem valor diferente de zero se for 10
         output_high(DATA);   // Se a operação anterior foi diferente de zero, então o bit é 1, coloco a linha DATA em nível alto
      else
         output_low(DATA);   // Caso contrário, o bit em questão é zero, por isso coloco o pino DATA em nível baixo
         
      // Gero uma sequência de clock no pino Shift Clock
      output_high(CLOCK);
      delay_us(5);
      output_low(CLOCK);
      
      mascara = mascara << 1;   // Rotaciono a mascara uma vez para a direita, assim na próxima iteração do laço, pega o próximo bit
   }
   
   // Gero uma sequência de clock no pino Latch Clock]
   output_high(LATCH);
   delay_us(5);
   output_low(LATCH);   
}


Aqueles tempos de delay eu tirei da minha cabeça, eles podem ser muito longos ou muito curtos, dependendo do chip, da forma que você montar o circuito, etc. Mas provavelmente deste jeito funcione.

Qualquer dúvida, poste aqui. Se funcionar, me manda teu endereço prá que eu possa enviar o boleto :)

Re: 74HC595 COM PIC 16F876

MensagemEnviado: 09 Dez 2015 15:21
por eloyfm
OK. Obrigado pela Força Xults.
A dúvida que eu tenho é em relação à posição em que vou deixar acesso os LEDs que devem ficar acesos..
onde fica essa parte do código ?

Um exemplo do que eu preciso entender..

eu tenho um PIC.. ex: 16F876...
ele tem 12 entradas esperando um sinal - cada um tera que acender ou apagar um LED por internedio do 595.
cada IO desses que receber um sinal nivel alto precisa ser representando igualmente lá no outro lado do 595.

a ideia:
uma placa com um PIC 876 com 12 IOs..de input..
controla outra placa com 12 LEDS. somente com 3 ou 4 fios..

Os pinos A-1, A-2 -A-3.. recebem um nivel alto +5V. NO PIC.
Os Pinos A-4, A-5, A-6 recebem um nivel alto nivell zero

Onde no programa irei colocar esses bits para que o SHIFT acenda os leds corrspondentes a essas entras no pic ?

tenho tentado encontrar um livro sobre isso par aprender.. a Idéia não é conseguir o codigo pronto.. é aprender....

abs..

Re: 74HC595 COM PIC 16F876

MensagemEnviado: 09 Dez 2015 16:57
por Red Neck Guy
Tu precisa de uma variável "espelho" do estado dos leds.
Aí faz todas as operações nela, e ciclicamente atualiza ela nos registradores.

Re: 74HC595 COM PIC 16F876

MensagemEnviado: 09 Dez 2015 17:03
por eloyfm
Alguem sabe me dizer como uso essa variável ?

Como comentei, sou novato e não consegui ate agora entender onde esta isso no código..
Já vi codigos para outros fins, mas mesmo assim não consegui degui-lo para aprender, como
fucionaria o meu..

achei que era mais fácil, mas pelo visto não vai ser não..

obrigado

Re: 74HC595 COM PIC 16F876

MensagemEnviado: 09 Dez 2015 18:57
por brasilma
Vou tentar ajudar, vamos partir assim...

Cada bit da variável corresponderá a um LED do seu sistema, "tipo assim" bit 0 corresponde ao LED 0, então para acender o LED 0, você coloca o bit 0 desta variável em 1. O que acontecer com os bits dela serão espelhados automáticamente nos seus LEDs.

Re: 74HC595 COM PIC 16F876

MensagemEnviado: 09 Dez 2015 19:49
por eloyfm
OK. Essa parte eu entendi.

eu sei fazer com um canal de IOs.. tipo.. B.. então teria 8 entradas, mas não sei conseguir mais de
8 entradas e refletir nessa variavel para obter os 12 LEDS acesos..

Outra coisa é a mais importante.. Como usarei essa variavel no codigo ?
onde devo coloca-la...?
grato

Re: 74HC595 COM PIC 16F876

MensagemEnviado: 10 Dez 2015 00:46
por EvandrPic
Um 74HC595 tem apenas 8 saídas. Se você quer 12 saídas terá que usar 2 CIs conectando a última saída do primeiro CI na entrada do segundo CI. Dessa forma terá possibilidade de até 16 saídas.
Você tem que colocar bit a bit, serialmente, dessa variável onde você armazenou a informação de LED aceso ou apagado (0 e 1 pro estado de cada led).
Veja no circuito abaixo que você precisará de apenas 3 pinos para controlar os 8 LEDs do circuito.
Pra controlar os 12 LEDs você também usará os mesmos 3 pinos desse circuito. Você deverá ligar o QH do primeiro CI no Data In do segundo CI e conectar os pinos de Clock e Latch dos 2 CIs.
O Latch serve para habilitar a saída quando você tiver carregado o estado dos 12 LEDs. Deverá ficar desabilitado enquanto você "enfia" serialmente os bits pelo Data In.
Deverá dar um pulso de clock a cada Bit que deseja "enfiar" no pino Data In do 74HC595.

Por razões óbvias, o microcontrolador, você terá que armazenar os estados do LEDs em uma variável com 2 Bytes.
74653.png


Esse Gif ajuda a visualizar o que você precisa fazer na programação:
4jImTIC.gif


Conectando 2 CIs 74HC595 de modo a obter até 16 saídas:
ShftOut_Schm2.gif


eloyfm escreveu:OK. Essa parte eu entendi.

eu sei fazer com um canal de IOs.. tipo.. B.. então teria 8 entradas, mas não sei conseguir mais de
8 entradas e refletir nessa variavel para obter os 12 LEDS acesos..

Outra coisa é a mais importante.. Como usarei essa variavel no codigo ?
onde devo coloca-la...?
grato

Re: 74HC595 COM PIC 16F876

MensagemEnviado: 13 Dez 2015 17:11
por eloyfm
Ok. Obrigado. Eu acho que não me expliquei direito.
Eu tenho esse hardware montado e até consigo testar com um PIC.
O Maximo que consigo fazer no programa é acender um led atras do outro como
um sequencial. Entendo como funciona o hardware e que é possivel adicionar
8 led a cada Shifter adicionado

O Que eu não sei o que fazer é o programa
Eu uso CCS e já tentei de todas as formas fazer com que pelo menos
8 entradas do PIC sejam espelhadas nas saidas do SHifter.

Tenho visto programas muito pequenos, mas não consigo entender
exatamente a função ..

abaixo estou anexando um que tenho , mas não funciona direito..

obrigado...

cpp code
#use delay (clock=8000000)           /*Definição da frequência do cristal para cálculo 
..dos delays*/
#fuses HS, NOWDT, PUT,BROWNOUT, NOLVP //Configuração dos bits de controle
#use fast_io(C)

#DEFINE DATA PIN_C7
#DEFINE CLOCK PIN_C6
#DEFINE SHIFTER PIN_C4
#DEFINE MR PIN_C5

//UNSIGNED CHAR NUM_BIT;

VOID ATUALIZA_SHIFT(UNSIGNED CHAR DADO);

void main()
{

SET_TRIS_C(0B00000000);
while (1) //Loop principal


{
//ATUALIZA_SHIFT(0b00000000);
//DELAY_MS(300);
ATUALIZA_SHIFT(0B00000000);
DELAY_MS(300);
}
}

VOID ATUALIZA_SHIFT(UNSIGNED CHAR DADO)
{

UNSIGNED CHAR NUM_BIT;

FOR(NUM_BIT=128;NUM_BIT<<0;NUM_BIT=NUM_BIT/2)
{
IF((DADO >=1)&& (NUM_BIT==1)) OUTPUT_BIT(DATA,1);
ELSE OUTPUT_BIT(DATA,0);

OUTPUT_BIT(CLOCK,1);
DELAY_MS(100);
OUTPUT_BIT(CLOCK,0);

OUTPUT_BIT(SHIFTER,1);
DELAY_MS(100);
OUTPUT_BIT(SHIFTER,0);

//OUTPUT_BIT(MR,0);
//DELAY_MS(10);
//OUTPUT_BIT(MR,1);

}
}

Re: 74HC595 COM PIC 16F876

MensagemEnviado: 13 Dez 2015 18:15
por EvandrPic
Por que não coloca o circuito aqui?

eloyfm escreveu:Ok. Obrigado. Eu acho que não me expliquei direito.
Eu tenho esse hardware montado e até consigo testar com um PIC.
...

Re: 74HC595 COM PIC 16F876

MensagemEnviado: 13 Dez 2015 20:23
por eloyfm
Preciso fazer um no PC.. Vou ver se consigo..
grato

Re: 74HC595 COM PIC 16F876

MensagemEnviado: 14 Dez 2015 09:07
por brasilma
Creio que também seja o caso de estudar um pouco programação, minha sugestão é pegar algumas apostilas e tutoriais online e ler em paralelo, assim: lê sobre um tema em uma e caso esteja dificil de compreender, ou quiser mais exemplos, vai na outra e vê como trata o assunto;

Depois pegar alguns (muitos) programas simples e que saiba o que fazem e ver como a programação possibilita que isso seja feito;

Também é importante compreender um pouco de lógica e álgebra booleana.

Quando colocamos estas sugestões, algumas pessoas costumam ficar bravas, porem felizmente ou infelizmente o caminho é este mesmo, e é o mesmo para todos...

Re: 74HC595 COM PIC 16F876

MensagemEnviado: 15 Dez 2015 11:30
por ze
Pra te humilhar, vou te dar duas soluções taquigráficas de como outro compilador cuidaria disso...

considerarei dado em PORTB0, clock em 1 e strobe em 2
Código: Selecionar todos
#define dado RB0
#define clock RB1
#define latch RB2
void saida595(unsigned char d)
{
unsigned char i=8;
PORTB=0;
while(i--)
{
dado=d;
clock=1;
asm("nop");
//asm("nop");//acrescente alguns
clock-0;
dado>>=1;
}
latch=1;
asm("nop");
//asm("nop");//acrescente alguns
latch=0;
}


Ou seja, depois que vc entender como funciona o 595 e como seu compilador trata a leitura e escrita em pinos individuais, seus problemas acabaram! (de começar)

A outra é ainda mais taquigraficamente simples: use a interace SPI do chip. Preguiça de ler o datasheet mas seria algo +- assim
Código: Selecionar todos
void saida595(unsigned char dado)
{
while(SSPSTAT.BF);//ou while (BF);
SSBUF=dado;
}

obviamente vc deve ligar coerentemente os pinos SPI SCK,SDO,SS e etc do seu mc nos do 595 e programar corretamente as polaridades dos sinais e etc. Ou seja: sujar um pouco as mãos dando uma olhadela no d.s.
Só pra constar, é só um conceito teórico. Nunca testei
Mas vá com calma mas vá! Enfrente!
Sucessos!