74 HC 595 entegresi piyasada çok sık kullanılan entegrelerden biridir. Bu entegre seri olarak girilen verinin veya datanın paralele dönüştürmesini sağlar. [1] Bu entegre, 8-bit seri giriş, paralel çıkış ve 8-bit D tipi flip-floba (latch) sahiptir. Bu entegre 8-bit seri olarak verdiğimiz dataları içinde depolar sonra onları biz istediğimiz zaman parelele dönüştürür. Yani 75HC595 entegresinin DS pinine bir mikrodenetleyici tarafından 8-bit veri gönderilir ve sonra onlar Q1’den Q7 kadar o seri bit çıkışta gösterilir. Tabi bunlar benim böyle anlattığım gibi direk olmuyor. Bazı kurallar var onlara göre yapmak gerekir.
Özellikleri:
- İşlem yapması için gerekli çalışma gerilimi minimum 2V, maksimum 6V olamalıdır.
- Maksimum çekeceği akım bu entegrenin 80 uA’dir.
- Kaskad bağlama özelliğine sahiptir. 74HC595’in 9.pini yardımıyla bir başka 74HC595 ile kaskad bağlanabilir.
- Kaydırma frekansı 100Mhz.
Yukarıda 74HC595 hakkında pin açıklamaları verilmiştir.
Gayet açık bir şekilde her bir pinin ne işe yaradığını belirtiyor tablo.
Bizimyapmamız gereken şey, DS pinine seri olarak datalarımızı göndermek ama
bunu yaparken her data için bir clock gerekiyor. Clock SH_CP pinine uygulanır.
Her yükselen kenar clock’unda seri
olarak gönderdiğimiz datalar 74HC595 kabul eder. Sonra 8-bit data seri olarak
gönderildikten sonra ST_CP lojik 1 durumuna çıkarılır çıkışlar gönderdiğimiz
datalara göre aktif olur. Şunu unutmamız gerekir, datalar seri olarak
gönderilmeye başladığında ST_CP lojik 0, dataların hepsi gönderildikten sonra
lojik 1 yapılır.
Bu entegrenin kullanım amaçları şunlar; Kullandığınız
mikrodenetliyice pin sıkıntısı sorunu varsa siz bu entegreyi kullanarak o
sorunu çözebilirsiniz. Yani, mikrodenetleyicinizin minimum üç pini
kullaranak siz 74HC595 yardımıyla 8 pine çıkarabilirsiniz.
Mikrodenetleyicilerde satır LCD ekran sürmek için çok fazla pine ihtiyaç vardır
ama bu entegre yardımıyla satır LCD
ekran sürebilirsiniz. Led uygulamalarında kullanılabilir, örneğin dot matrixli
uygulamalarda.
Ben bu çalışmamda mikrodenetliyici olarak st firmasının
ürettiği STM32F429-DISCOVERY kullanacağım ve yapacağım çalışma
mikrodenetleyicinin sadece üç pinini kullanarak 74HC595 ile 8 adet led süreceğim. Bunları yaparken SPI(Serial Peripheral
Interface) donanımında yararlanacağım.
Bu donanımdan stm32f429 altı tane SPI’a sahiptir.
Kısaca devre şeması aşağıdaki gibi oluyor.
Yazılım Keil uVision5 ile yazılmıştır. SPI modu kullanılarak
yazılımıştır.
#include "stm32f4xx.h"
#include "defines.h"
#include "tm_stm32f4_delay.h"
#define KIRMIZI_LED_YAK GPIO_SetBits(GPIOG,GPIO_Pin_14)
#define YESIL_LED_YAK GPIO_SetBits(GPIOG,GPIO_Pin_13)
void gpio_config(void);
void spi_config(void);
void send_byte(uint8_t val);
uint8_t say=0;
int main() {
SystemInit();
TM_DELAY_Init();
gpio_config();
spi_config();
while(1){
KIRMIZI_LED_YAK
;
send_byte(say);
YESIL_LED_YAK;
say++;
Delayms(100);
if(say==256)
say=0;
}
}
void gpio_config(void){
GPIO_InitTypeDef
GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,
ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,
ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,
ENABLE);
/*PG13
VE PG14 CIKIS YAPILDI*/
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOG,&GPIO_InitStructure);
/*PB0
CIKIS YAPILID*/
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_7;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
/*PA5
VE PA7 SCK VE MOSI YAPILDI*/
GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_SPI1);
}
void spi_config(void){
SPI_InitTypeDef SPI_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4;
SPI_InitStruct.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStruct.SPI_Mode=SPI_Mode_Master;
SPI_InitStruct.SPI_Direction=SPI_Direction_1Line_Tx;
SPI_InitStruct.SPI_CPOL=SPI_CPOL_High;
SPI_InitStruct.SPI_CPHA=SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS=SPI_NSS_Sof;
SPI_Init(SPI1,&SPI_InitStruct);
SPI_Cmd(SPI1,ENABLE);
}
void send_byte(uint8_t val){
GPIO_ResetBits(GPIOB, GPIO_Pin_0); // ST_CP low
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_SendData(SPI1, val);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
GPIO_SetBits(GPIOB, GPIO_Pin_0); // ST_CP high
}
Bu kod, say değişkeni
100ms aralıkla 0’dan 255 kadar sayıp onları ledlerle ifade ediyor. Örnegin,
eğer say 255 eşit olduğunda bütünledler yanar veya say 1 eşit olduğunda sadece
QA’ya bağlı led yanar veya 2’ye eşit olduğunda
QB yanar.
ÇALIŞMA VİDEOSU
HAKAN AYDIN
Kaynaklar
[1].PIC PROGRAMLAMA TEKNIKLERI VE PIC16F877A, ALTAŞ
YAYINCILIK
4.
https://github.com/devthrash/STM32F4-examples/blob/master/SPI/main.c