Guia CNC Brasil - Tudo sobre CNC, Router, Laser, Torno e 3D Print
ELETRÔNICA / ELÉTRICA => Eletrônica Básica => Microcontroladores => Tópico iniciado por: lucasi em 05 de Abril de 2010, 23:30
-
Alguem já utilizou um 74HC595 ou um 74HC594 para expandir saídas de um PIC (usando C)?
-
Sim, mas não usando C.
O que quer saber exatamente ?
-
Na verdade estava querendo expandir mais 16 saídas para um pic 16F877A... eu sei que ele tem mais de 30 portas... hehehe mas como nunca tinha feito isso decidi fazer e encontrei alguns obstaculos por desconhecimento de como interfacear utilizando SPI.
Como no Rio tá tudo parado devido as chuvas... começei a fuçar e saiu esse código
#include <16F877A.h> // seleciona o PIC16F877A
#define EXP_OUT_ENABLE PIN_B0 //RCK - Pino 12 do 74HC595(1) & Pino 12 do 74HC595(2)
#define EXP_OUT_CLOCK PIN_B1 //SCK - Pino 11 do 74HC595(1) & Pino 11 do 74HC595(2)
#define EXP_OUT_DO PIN_B2 //SER - Pino 14 do 74HC595(1)
///////////////////////////////////////////////////////////////////////////
//// O DS do 74HC595(2) é alimentado pelo Q7' do 74HC595(1) ////
//// ////
#fuses HS,NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP
#use delay (clock=4000000)
#ZERO_RAM
Byte data1 = 0b00000011;
Byte data2 = 0b10101011;
//------ 74HC595 serial chip --------------
void outSerial(int8 chip1,int8 chip2)
{
int8 i;
int16 data;
data = chip2;
data = data<<8;
data = data | chip1;
// Output to serial line
for(i=0; i<16; i++)
{
if(data & 0x8000)
{output_high(EXP_OUT_DO);}
else
{output_low(EXP_OUT_DO);}
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 main()
{
setup_adc_ports(NO_ANALOGS); // nao usaremos nenhum porta analogica
setup_adc(ADC_OFF); // desligamos o conversor AD
setup_psp(PSP_DISABLED); // nao utiizamos a porta PSP
setup_spi(FALSE); // nao utilizamos a porta SPI
setup_counters(RTCC_INTERNAL,RTCC_DIV_2); //configuracao TMR0 DEFAULT
setup_timer_1(T1_DISABLED); // desabilitarmos o TMR1
setup_timer_2(T2_DISABLED,0,1); // desabilitamos o TMR2
setup_comparator(NC_NC_NC_NC); // desabilitamos os comparadores
setup_vref(FALSE); // desabilitamos a tens?o de referencia
outSerial(data1,data2);
}
Coloquei 2 74HC595 em cascata... e está funcionando direitinho...
Talvez ficasse melhor se eu colocasse os dois Bytes juntos 0b0000001110101011 prá passar como parametro ao invés de passar separado.
Mas o que importa... está funcionando...
Abs
Lucasi
-
Apesar de atrasada a resposta, espero que possa ajudar.
SPI não vai funcionar, porque esse integrado não é SPI. Eu acho que eu até já ví um circuito usando SPI, mas, não sei onde.
Vai ser preciso fazer na mão.
A sequência de transmissão é a seguinte:
Clock em low.
Limpa o buffer serial -> Pulso negativo em SRCLR.
Habilita o buffer serial -> Nível High em SRCLR.
Transmite os dados bit-a-bit.
Pulso positivo em RCLK para transferir o dado que está no buffer serial, para as saídas do integrado.
Habilita a saída do dado com OE em low.
Pronto.
Se vc for expandir pra 16 portas, precisa ligar a saída QH do primeiro shift-register, na entrada SER do segundo shift.
Todos os outros sinais podem ser ligados em comum (SRCLK, OE, SRCLR, RCLK).
Não conheço PICs.
Abs.
PS: Achei o documento. É o link da primeira mensagem. Dá uma olhada, lá:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=76399&start=0