26 Temmuz 2015 Pazar

74HC595 Kullanımı






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