tpic6b595 yardım

Başlatan furkan_2210, 31 Temmuz 2014, 18:38:51

furkan_2210

selamlar,,
elimde tpic6b595 entegresi var, her pini 500ma çıkış verdiği için bunu kullanmak istedim.
çalışma mantığı 74hc595'e benziyor yaklaşık olarak.
benim yapmak isteiğim çalışma ise pic'in 3 bacağını kullanarak sınırsız çıkış elde etmek istiyorum, 5 adet entegreyi peşpeşe seri olarak bord üzerinde kurdum ve çalıştırdım bütün pinlerini yakabiliyorum (her bir entegrede 8 çıkış bulunmakta 8x5=40 adet çıkış ) benim yapmak istediğim istediğim entegrelerin istediğim bacaklarının aktif olması ,kodları pbp da yazıyorum. bu konuda yardımca olabilecek arkadaşların yardımlarını bekliyorum.
not: istenirse resim ekleyebilirim devrenin şemasını çizmedim henüz. ETE hocam yardımcı olursanız memnun olurum .
saygılarımla ..

ete

Bu entegre 74hc595 ile aynı mantıkta çalışır arada fark yok. Fark , bacak bağlantılarında , çıkış akım seviyesinde ve birde çıkışın negatif lojik olmasındadır.
Mesajında bütün pinleri kontrol edebildiğini yazmışsın zaten ne gibi bir sorunun var anlamadım. Hangi konuda yardım istedin yada istiyorsun?
Bütün mesele seri olarak entegreleri bağlayacaksın . Birinci entegrenin data girişinden data verecek , clk ve kilit bacaklarını kendi aralarında birleştireceksin. Birincin Q'7 çıkışını bir sonrakinin data bacağına bağlayacaksın . Bu bağlantı ile ilk verdiğin byte birinci entegrede yerleşir tabiiki kilit bacağına bir puls uygularsan. İkinci byte ı verince birincideki ilk verilen byte ikinciye geçer (shift edilir) ve ikinci verilen birincide belirir. Bu şekilde 5 byte verildiği zaman ilk verilen en sondaki entegreye aktarılır en son verilen de ilk entegrede kalır. Temel prensip budur.
Dediğim gibi entegre çıkışları negatif lojik tir. Yani sen değer olarak high versende çıkışlar low olacaktır.. Kısaca bu entegre 74hc595 in peşine uln2803 bağlanmış halidir.

Ete

kartal_0689

#2
Ben cevap yazarken ETE hocam cevap vermiş zaten. Aşağıda benim uyguladığım projenin bir kısmı var.
TPIC6B595 ile yaptığım. Ben kodlarımı MikroPascal ile yazıyorum belki yardımcı olur diye onuda ekledim.


Const       
        NumberTable : array [0..16] of char =(
                   0xEE, // 0
                   0x82, // 1
                   0xDC, // 2
                   0xD6, // 3
                   0xB2, // 4
                   0x76, // 5
                   0x7E, // 6
                   0xC2, // 7
                   0xFE, // 8
                   0xF6, // 9
                   0x10, // -
                   0xFF, // 8.
                   0x2C, // L
                   0x1E, // o
                   0xDE, // a
                   0x9E, // d
                   0x00  // bos
                   
                   );

Var
   HC595_VoltCs              : sbit at RF12_bit;
   HC595_AmperCs             : sbit at RF13_bit;

   HC595_VoltCs_Direction    : sbit at TRISF12_bit;
   HC595_AmperCs_Direction   : sbit at TRISF13_bit;


   Volt_DIG4        : word;
   Volt_DIG3        : word;
   Volt_DIG3a       : word;
   Volt_DIG2        : word;
   Volt_DIG2a       : word;
   Volt_DIG1        : word;
   Amper_DIG4       : word;
   Amper_DIG3       : word;
   Amper_DIG3a      : word;
   Amper_DIG2       : word;
   Amper_DIG2a      : word;
   Amper_DIG1       : word;

//------------------------------------------------------------------------------
Procedure HC_VoltCs_Fnc();
  begin
       HC595_VoltCs := 0;
       Asm Nop End;
       Asm Nop End;
       Asm Nop End;
       HC595_VoltCs := 1;
  end;
//------------------------------------------------------------------------------
Procedure HC_AmperCs_Fnc();
  begin
       HC595_AmperCs := 0;
       Asm Nop End;
       Asm Nop End;
       Asm Nop End;
       HC595_AmperCs := 1;
  end;
//------------------------------------------------------------------------------
Procedure Volt_Write7SegDigit(V_Dig1: Char; V_Dig2: Char; V_Dig3: Char; V_Dig4: Char;);
  begin
       HC_VoltCs_Fnc();

       SPI1_Write(V_Dig1);
       SPI1_Write(V_Dig2);
       SPI1_Write(V_Dig3 or 0x01);  // + dot
       SPI1_Write(V_Dig4);

       HC_VoltCs_Fnc();


  end;
//------------------------------------------------------------------------------
Procedure Amper_Write7SegDigit(A_Dig1: Char; A_Dig2: Char; A_Dig3: Char; A_Dig4: Char;);
  begin
       HC_AmperCs_Fnc();

       SPI1_Write(A_Dig1);
       SPI1_Write(A_Dig2);
       SPI1_Write(A_Dig3 or 0x01 );
       SPI1_Write(A_Dig4);

       HC_AmperCs_Fnc();


  end;
//------------------------------------------------------------------------------
Function DigitSelect(Digit : Char) : byte;
begin
  if ((Digit >= 0) AND (Digit <= 15)) then
    Result := NumberTable[Digit]
  else
    Result := 0;
end;
//------------------------------------------------------------------------------

Procedure ValueDigitSelect(Value_Volt, Value_Amper: Word);
var Volt_Seg1, Volt_Seg2, Amper_Seg1, Amper_Seg2 : word;
  begin

       Volt_DIG4   := Value_Volt mod 10;       //

       Volt_DIG3a  := (Value_Volt mod 100);
       Volt_DIG3   := (Volt_DIG3a div 10);

       Volt_DIG2a  := (Value_Volt mod 1000);
       Volt_Seg2   := Volt_DIG2a div 100;

       Volt_Seg1   := Value_Volt div 1000;


       Amper_DIG4   := Value_Amper mod 10;

       Amper_DIG3a  := (Value_Amper mod 100);
       Amper_DIG3   := (Amper_DIG3a div 10);


       Amper_DIG2a  := (Value_Amper mod 1000);
       Amper_Seg2   := Amper_DIG2a div 100;


       Amper_Seg1   := Value_Amper div 1000;

   end;


Procedure StartRegister_Config;
  begin

       PLLFBD := 58;
       CLKDIV := 0x0001;

       Delay_ms(10); // 10ms Duration

       // Analog pin select
            //    5432109876543210
       ANSELA := %0000000000000000;
       ANSELB := %0000000000000001;
       ANSELC := %0000000000000110;
       ANSELD := %0000000000000000;
       ANSELE := %0000000000000000;
       ANSELG := %0000000000000000;
       // Analog pin select

       Delay_ms(10); // 10ms Duration

       // Input/Output Pin Configuration all pins inputs select
            //    5432109876543210
       TRISA  := %1111111111111111;
       TRISB  := %1111111111111111;
       TRISC  := %1111111111111111;
       TRISD  := %1111111111111111;
       TRISE  := %1111111111111111;
       TRISF  := %1111111111111111;
       TRISG  := %1111111111111111;
       // Input/Output Pin Configuration all pins inputs select

       Delay_ms(10); // 10ms Duration

       // Input/Output Pin Configuration other pins output
            //    5432109876543210
       TRISA  := %1111111111111111;
       TRISB  := %1111111111111111;
       TRISC  := %1111111111111111;
       TRISD  := %1111111111111111;
       TRISE  := %1111111111111010;
       TRISF  := %1100111111101111;
       TRISG  := %1001111110111100;
       // Input/Output Pin Configuration other pins output

       Delay_ms(10); // 10ms Duration

       // PORTs idle Status
       PORTA  := 0x0000;
       PORTB  := 0x0000;
       PORTC  := 0x0000;
       PORTD  := 0x0000;
       PORTE  := 0x0000;
       PORTF  := 0x0000;
       PORTG  := 0x0000;
       // PORTs idle Status

       ADC1_Init_Advanced(_ADC_12bit, _ADC_INTERNAL_REF); // Sets ADC Module in 12-bit Resolution
       Delay_ms(10); // 10ms Duration                        Mode With Internal Reference Used

       
       // Peripheral Pin Select
       PPS_Mapping(104, _OUTPUT, _SDO1);
       PPS_Mapping(79, _OUTPUT, _SCK1OUT);

       
       // SPI init
       SPI1_Init_Advanced(_SPI_MASTER,
                     _SPI_8_BIT,
                     _SPI_PRESCALE_SEC_4,
                     _SPI_PRESCALE_PRI_4,
                     _SPI_SS_DISABLE,
                     _SPI_DATA_SAMPLE_MIDDLE,
                     _SPI_CLK_IDLE_LOW,
                     _SPI_ACTIVE_2_IDLE);

       Delay_ms(10);
       
       HC595_VoltCs     := 1;
       HC595_AmperCs    := 1;



       Volt_DIG4        := 0;
       Volt_DIG3        := 0;
       Volt_DIG3a       := 0;
       Volt_DIG2        := 0;
       Volt_DIG2a       := 0;
       Volt_DIG1        := 0;
       Amper_DIG4       := 0;
       Amper_DIG3       := 0;
       Amper_DIG3a      := 0;
       Amper_DIG2       := 0;
       Amper_DIG2a      := 0;
       Amper_DIG1       := 0;


begin

  Delay_ms(100);

  StartRegister_Config;


   While (TRUE) Do
     begin
                 ValueDigitSelect(1234, 9876);

                 Volt_Write7SegDigit(DigitSelect(Volt_DIG1),
                             DigitSelect(Volt_DIG2),
                             DigitSelect(Volt_DIG3),
                             DigitSelect(Volt_DIG4));
 
                 Amper_Write7SegDigit(DigitSelect(Amper_DIG1),
                              DigitSelect(Amper_DIG2),
                              DigitSelect(Amper_DIG3),
                              DigitSelect(Amper_DIG4)); 
                  Delay_ms(100);
     end;





end;



TURKEY/ANK

furkan_2210

selamlar,
öncelikle kartal_0689 ve ete  hocam ikinizede teşekkür ederim vermiş olduğunuz  cevaplardan ötürü.
Fakat ben  yapmak istediğimi saanırım tam anlatamamışım kusura bakmayın..
Benim istediğim 30 adet tpic6b595 entegresini [8x30=240 adet çıkış yapar] seri olarak  birbirine  bağlayıp , bunların örnek veriyorum 12. entegrenin 7. bacağının çıkış vermesini istiyorum veya 24. entegrenin 4. pininin çıkış vermesini istiyorum gibi bir uygulama yapmaya çalışıyorum..
şu anda breadbord üzerinde 5 adet entegre ile deneme  yapıyorum pic olarak 16f628a kullanıyorum ve ledleri karaşimşek gibi yakıp söndürmeyi başardım ama sıralı şekilde yanarak gidiyor benim istediğim kesinlikle bu değil.
Bu arada  seri haberleşme üzerinde çalışıyorum tam olarak yapmak istediğim seri olarak pic'e gönderdiğim verinin ( örn:4 ) 595'e göndererek bu işi yapmak istiyorum yani pice 4 geldi ise ilk 595 in 4. bacağı aktif olucak 221 geldi ise 221. bacağın aktif olmasını istiyorum  tabi bu rakamlar sadece birer örnek, bin-dec-hex karakterlerden hangisi 595lere yazılıyorsa onuda kullanabilriz..

yardımlarınızı bekliyorum umarım açıklayıcı olmuşumdur saygılarımla...

furkan_2210

yazdığım programı ekliyorum..
ETE hocam sizin  yazdığınız bir programı indirmiştim onun üzerinde oynayarak çalıştım. size yabancı gelmemesi için bunu ekledim .. eksiklerim konusunda yardımcı olursanız sevinirim ..




'****************************************************************
'*  Name    : COKCIKIS.BAS                                       *
'*  Author  : [ETE]                                                    *
'*  Notice  : Copyright (c) 2005 [ERO]                          *
'*          : All Rights Reserved                                    *
'*  Date    : 01.08.2014                                             *
'*  Version : 1.0                                                        *
'*  Notes   :                                                             *
'*          :                                                                *
'****************************************************************
define pic 16f628a
define osc 4
@ DEVICE pic16F628a                      'işlemci 16F628a                               
@ DEVICE pic16F628a, WDT_OFF             'Watch Dog timer kapalı
@ DEVICE pic16F628a, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628a, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628a, MCLR_off            'MCLR pini kullanılmıyor.
@ DEVICE pic16F628a, XT_OSC              'harici osilatör kullanılacak

'-----------------------------------------------------------------
porta=0
portb=0
TRISB=%00000000  'PortB tamamı çıkış yapıldı.
TRISA=%00000000  'A portu tamamı çıkış yapıldı.

'-----------------------------------------------------------------
CMCON=7
symbol CLK=PortA.0
SYMBOL DTA=PORTA.1
SYMBOL AKTAR=PORTA.2
bilgi1 VAR byte
bilgi2 var byte
bilgi3 var byte
bilgi4 var byte
bilgi5 var byte

PORTA=0

'-----------------------------------------------------------------

BASLA: 
       
        SHIFTOUT DTA,CLK,1,[1,2,4,8,16]
        pulsout aktar,1
        toggle portb.4
        pause 1
        toggle portb.5
        pause 1
        toggle portb.6
        pause 1
        toggle portb.7
        pause 1
        GOTO BASLA
        end
       

ete

Anlattıklarını yanlış anlamamışım.benim açıklamam da bu iş üzerine zaten.
5 li gurup üzerinden konuşursak 2 nci entegrenin 4 bitini set yapmak ve dğerlerinden çıkış vermemek için o entegreye ait değerin 4. Bitini set edecek diğerlerini etmeyeceksin.
Entegrelere bir,iki.uc,dort,bes diye register isimleri verirsek anlaşılması daha kolay olacaktır.
Bir=o, iki=16, uc=0, dort=0, bes=0
Shiftout clk,dta,1,[bes,dort,uc,iki,bir]
Pulsout kilit,1
Şeklindeki komut dizisi istediğini yapacaktır.

Ete

furkan_2210

INCLUDE "modedefs.bas"

define pic 16f628a
define osc 4
@ DEVICE pic16F628a                      'işlemci 16F628a                               
@ DEVICE pic16F628a, WDT_OFF             'Watch Dog timer kapalı
@ DEVICE pic16F628a, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628a, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628a, MCLR_off            'MCLR pini kullanılmıyor.
@ DEVICE pic16F628a, XT_OSC              'harici osilatör kullanılacak

'-----------------------------------------------------------------
porta=0
portb=0
TRISB=%00000000  'PortB tamamı çıkış yapıldı.
TRISA=%00000000  'A portu tamamı çıkış yapıldı.

'-----------------------------------------------------------------
CMCON=7
symbol CLK=PortA.2
SYMBOL DTA=PORTA.3
SYMBOL AKTAR=PORTA.4

bilgi1 VAR byte
bilgi2 var byte
bilgi3 var byte
bilgi4 var byte
bilgi5 var byte

symbol bir=bilgi1
symbol iki=bilgi2
symbol uc=bilgi3
symbol dort=bilgi4
symbol bes=bilgi5
PORTA=0


Bir=0
iki=16
uc=0
dort=0
bes=0

'-----------------------------------------------------------------

BASLA: 
       
        SHIFTOUT DTA,CLK,1,[bir,iki,uc,dort,bes]
        pulsout aktar,1
       
        toggle portb.4
       
        GOTO BASLA
        end


ETE hocam bu şekilde bir deneme  yaptım fakat  bir sonuç alamadım .. nerede yanlış yapıyorum ..

ete

#7
Yanlışlık yaptığın yer bağlantı şeklinde olmalı. Anlamak için şema görmemiz gerekiyor.
Maalesef isis de TPIC6B595 yok ama onu 1 adet 74HC595 ve peşine bağlanan ULN2803 ile yapmak mümkün oluyor.

Bağlantı şemanı buraya koyarsan sorunu bulabiliriz.
Programa bakınca kilit pini ni PORTA.4 pinine bağlamışsın. Bu pin open Collector dür. Yani sen HIGH PORTA.4 de desen PIC, o çıkışı HIGH yapamaz. Bu nedenle O pine bir Pullup direnci (1K) takman gerekir.
Bu direnç bağlımıdır?

Ete

furkan_2210

pullup direnci bağlı değil , kilit pininin yerini değiştirebilirim .. bu arada 595 bağlantısını bu şekilde yaptım..resmini koyuyorum:

ete

Şeman teorik olarak doğru. Bu durumda muhtemelen sorun, Kilit pinini bağladığın PORTA.4 pinine bağlamayı unuttuğun Pullup direnci olmalı.

Ete

furkan_2210

http://s3.dosya.tc/server26/DVDAMH/tpic6b595.rar.html


hocam yukarıya breadbor üzerindeki çektiğim resimlerin rar. linkini ekledim  bakabilirseniz sevinirim ..  bu arada  pullup direncinide koydum  fakat yinede bir sonuç alamadım ..

furkan_2210

ETE hocam,
devrenin resimlerini 1024 kb dan daha fazla olduğu için siteye rar olarak yüklemek zorunda kaldım.. entegreyi çalıştırmayı başardım fakat 4 saniye sonra aktif oluyor ledler  neyse onuda geçtim . rs232 ile devreye bilgi yolluyorum fakat devrede hiç hareket yok güç kaynağından  bakıyorum amper de çekmiyor.. acaba nerede hata yapıor olabilirim  ,,  kodları aşşağıda veriyorum rica etsem bakar mısınız .. teşekkürler...


@ DEVICE pic16F628a                      'işlemci 16F628a                               
@ DEVICE pic16F628a, WDT_OFF             'Watch Dog timer kapalı
@ DEVICE pic16F628a, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628a, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628a, MCLR_off            'MCLR pini kullanılmıyor.
@ DEVICE pic16F628a, INTRC_OSC_NOCLKOUT  'dahili osilatör kullanılacak

DEFINE HSER_RCSTA 90h      '(alma yazmacının Enable edilmesi)
DEFINE HSER_TXSTA 24h      '(gönderme yazmacının Enable edilmesi)
DEFINE HSER_BAUD 9600      '(Haberlesme hızının belirlenmesi)
DEFINE HSER_CLROERR 1      ' Auto clear over-run errors
DEFINE HSER_SPBRG 25
RCSTA = $90                ' SPEN & CREN = 1 Enable serial port and continuous receive           
TXSTA = $24                ' TXEN & BRGH = 1 Enable transmit and asynchronous mode



TRISB=%00000110  'PortB.1,2 harici hepsi çıkış yapıldı.
TRISA=%00000000  'A portu tamamı çıkış yapıldı.
porta=0
portb=0


CMCON=7
symbol CLK=PortA.2
SYMBOL DTA=PORTA.3
SYMBOL AKTAR=PORTB.5

bilgi VAR byte
gelen var byte


BASLA: 
        hserin 200,timeout,[GELEN]
        pause 10
       
        gelen=bilgi
       
        SHIFTOUT DTA,CLK,1,[bilgi]
        pulsout aktar,1
       
        toggle portb.4
timeout:
        GOTO BASLA
        end
       

ete

Önce çalışmayan entegreyi nasıl çalıştırdın onu bilmek isterim.
Sistemin çalışmamasının sebebi bir çok şey olabilir.
Ancak gördüğüm önemli hata usart pinlerinin ikisinide giriş olarak ayarlamışsın. Rx pini giriş Tx pini çıkış olmalıdır.

Bunu düzelttikten sonra hserin komutu altındaki pause 10 komutunu sil. Bütün senkronu bozar bu komut.
Daha sonra hserin komutundaki 200 olan timeout değerini 10 yap. Hatta 5 olarakda deneyebilirsin.

Bu sistemin doğru çalışması ancak usart kesmesi ile mümkün olur ama programda pek fazla komut yok belki dedşklerimi yaparsan çalışabilir. Tabiiki yolladığın bilgininde doğru gelip gelmediğini bilemiyoruz. Ondan nasıl emin olacağız?

Ete

furkan_2210

merhaba ete hocam ,
şu ana kadar vermiş olduğunuz bilgilere teşekkür ederim ..
gelen bilginin doğruluğunu device monitör adlı bir programdan görebiliyorum , sadece mikrodenetleyici kullanarak yani pinlerini çıkış yaparak bir çok deneme yaptım, onunla ilgili bir problemim yok  gibi görünüyor.
bu arada  muhtemelen daha önceden  kurduğum ve yazdığım devrelerde muhtemelen çalışıyordu 595 olarak fakat bilgilerde gecikme var yani enerjiyi verdiğimde ledler 3-4 saniye sonra yanıyor, ben elektronik olarak düşündüğüm için hemen çıkış vermesini beklediğim için  3-4  saniye beklemeden  enerjiyi kesiyordum son yazdığım programda "toggle portb.4" komutunu ekledim ve buraya bir tane led bağladım işlemcinin çalıştığından emin olmak için, bu arada komutları tekrardan incelerken gözüme çarptı
"gelen=bilgi" satırı sizce doğru mu  "bilgi=gelen" olması gerekmez mi, bunuda denemem gerekiyo sanırım.
rs232 ile bağlantıyı kurabilirsem size bir kaç sorum daha  olucak , cevaplarsanız çok memnun olurum.
Saygılarımla...

furkan_2210

slmlar,
ETE Hocam, bağlantıyı kurdum ve data göndermeyi başardım çıkış alabiliyorum fakat işine geldiği gibi davranıyor sanıyordum başlarda 595 fakat aklıma ascii  tablo geldi oradan  bilgi gönderdim decimal olarak 1-9 arası değerleri yolluyorum  ve karakter olarak  büyük küçük harf gönderdiğimde de onların binary karşılığını veriyor bana  ben  sadece decimal olarak değer almak istiyorum bunun için;

hserin 10,timeout,[dec gelen]
gelenin başına dec yazarak komutu kullandım fakat yine sonuç alamadım, yanlış bir şey mi var anlayamadım..

bir sorum daha olacak ben  30 adet 595 kullanıcam  bunun için sanırım şöyle bir komut kullanmam  gerekiyor ;

shiftout dta,clk,1,[giden1,giden2,giden3,...,giden30]
PULSOUT aktar,1

fakat bütün 595ler aynı mantıkla çalışıyor ve 65535 gönderince olunca tüm bacakları  çıkış oluyor, yani maksimum sayı 65535 ben bunu 5. entegreye göndermek istesem nasıl olucak 30 tane de gelen mi tanımlamam  gerekiyor yani "gelen var byte" yada şöyle düşünüyorum "1 ≥ 8 ise giden1'e at 9 ≥ 16 ise giden2'ye at " gibi bir şey yapabilir miyiz.. basit olarak nasıl yapılabilir..

yardımlarınız için şimdiden teşekkür ederim,
SAYGILARIMLA...

Powered by EzPortal