74hc 595 ie devir gösterme

Başlatan adali, 02 Kasım 2014, 21:12:15

adali

slm arkadaslar PIC12F675 32 LED PWM CONTROLLER WITH 74HC595, PIC16F84A AS SEQUENCE LED AND MULTISPEED KNIGHT RIDER   likteki devreyi protonla  yapmaya calıstım. counter komutuyla gelen palsları saydırıp 595 üzerinde cıkıs yapmaya calıstım. bir çeşit devir saati olacaktı fakat  bir türlü beceremedim bana bu konuda yardımcı olabilirmisiniz

yaptıgım bas dosyası ve isis dosyası işyerindeki bilgisayarımda oldugundan buraya koyamadım .
okudugum degeri  595 de bar seklinde nasıl gorterebilirim. birseyler yaptım ama uzun uzuna oldu istediğim gibi değildi.
select  case  komutuyla geleni konrol edip gelen 10 ise bilgi 1=%00001111  bilgi2=%00000000  bilgi3=%00000000  gibi yorumlatıp yapmaya calıstım yani elle değer verdim. ama yapmak istediğim
şey tam olarak bu değildi     gelenhightbyte gelen lowbyte  seklinde yapmak istedim bir turlu beceremedim
bende    shout data ,clock,1,[bilgi1,bilgi2,bilgi3  ] diyerek 595 e cıkıs verdim pwm nasıl yapılırki ?  bilen arkadaslardan yardım bekliyorum .
sitemde 16f877a kullanmayı düşündüm

ete

#1
Bu işi yapmak çok zor değil. Ancak program ve şema olsa daha iyi olurdu. Zira ölçülen bir devir var ve maksimum değeri nedir bilmiyoruz. Bu iş öyle select case gibi komutlarla yapılamaz. Shiftout komutunda 3 değişken kullandığına göre 3x8=24 adet led kullanacaksın. Maksimum deviri vermediğin için ben onu 3000 kabul edeceğim sen keniden göre ayarlarsın vereceğim formülleri.
Devir=3000 ise birim led başına düşen devir adedi=3000/24=125. O halde bu bizim standart bölen sayımız olacaktır.
Led_Sayısı=Devir/125   bu formül ile yanacak led sayısını bulmuş olacağız. 0-24 arası bir sayı çıkacaktır.
Şimdi karşılaştırma komutları ile led sayılarını hesaplayalım.
 IF LED<8 THEN  'led adedi 8 den küçük ise yalnızca ilk 595 sürülecek demektir
        LEDA=LED             'yanacak led adedi hesaplanan LED sayısına eşit olacaktır.
        LEDB=0:VERB=0   'diğerleri sıfır olacak.
        LEDC=0:VERC=0
     ENDIF
                                   
     IF LED>8 AND LED<16 THEN  'hesaplanan led adedi 8 den büyük 16 dan küçük ise
       LEDA=8    'ilk 595 in bütün ledleri yanacak (8 adet led)
       LEDB=LED-LEDA  'ikinci 595 in ise LEDB kadar ledi yanacaktır.
       LEDC=0    'otomatikman LEDC sıfır olacaktır.
      ENDIF

      IF LED>16 THEN 'şayet led adedi 16 dan büyük ise
        LEDA=8 'ilk 595 ile
        LEDB=8 'ikinci 595 de 8 er adet led yanacak
        LEDC=LED-16  'sonuncuda ise LEDC kadar led yanacaktır.
      ENDIF

Yanacak led adetlerini belirledikten sonra bu ledlerin yanması için gereken sayıları hesaplayacağız. Zira 595 de 8 adet led in yanması için ona 255 sayısı verilmelidir. Bunu led adedine göre otomatik hesaplamak için,
     VERA=(DCD LEDA)-1
     VERB=(DCD LEDB)-1
     VERC=(DCD LEDC)-1

işlemlerini yapmamız gerekecektir.  DCD komutu (Decoded Value Bit Number )  Bit sayısı (adedinden) dekode edilmiş sayı üretmek amacı ile kullanılır. Örnek vermek gerekirse A=DCD 3=%00001000 şeklinde bize 8 sayısını verir. Bunu bizim amacımı ziçin kullanmış olsa idik yani 3 bit yanacak şeklinde düşünürsek A=(DCD 3)-1 şeklinde vermemiz yeterli olacak idi. Zira 8-1=7 olacak ve 7 nin binary karşılığıda %00000111 şeklinde olacak idi.
Bu durumda "LEDA=8" ise VERA=(DCD '8')-1=256-1=255 olarak hesaplanacaktır. Buda bize bütün bitlerin yanacağını göstermektedir.
Görüldüğü üzere Devir sayısından yola çıkarak 3 adet 595 de kaç adet led yanacağını ve her birinde yanacak ledlerin karşılığı olarak VERA , VERB, VERC gibi sayıları hesaplamış olduk. İstediğin bu idi sanırım.
Sana düşen,
shout data ,clock,1,[VERA,VERB,VERC ] şeklinde komut vererek ilgili ledleri yakmak olacaktır.

Ete


adali

Hocam sağolun en kısa zamanda deneyeceğim

adali

      Device 16F877A
        Xtal 10
        All_Digital 1
    TRISA=%11111:PORTA=0
    TRISB=0:PORTB=0
    TRISC=1:PORTC=0
    TRISD=0:PORTD=0

Declare LCD_Type 0
Declare LCD_DTPin PORTB.4
Declare LCD_RSPin PORTB.3
Declare LCD_ENPin PORTB.2
Declare LCD_Interface 4
Declare LCD_Lines 2

    Dim bolum As Byte
    Dim devir As Word
    Dim vera As Byte
    Dim verb As Byte
    Dim verc As Byte
    Dim Wrd As Word
    Dim led As Byte
    Dim ledc As Byte
    Dim leda As Byte
    Dim ledb As Byte
    Symbol Pin = PORTC.0
     
devir=0


Cls
   basla:
     Wrd = Counter Pin, 500

        Print At 1,1,"d : ",Dec5 wrd*120,

led=(wrd*120)/ 294 'deviri dakika biçimine cevirmek icin --294 ise 7000d/dk / led sayısı 24
If led<8 Then  'led adedi 8 den küçük ise yalnızca ilk 595 sürülecek demektir
        leda=led             'yanacak led adedi hesaplanan LED sayısına eşit olacaktır.
        ledb=0:verb=0   'diğerleri sıfır olacak.
        ledc=0:verc=0
     EndIf
                                   
     If led>8 And led<16 Then  'hesaplanan led adedi 8 den büyük 16 dan küçük ise
       leda=8    'ilk 595 in bütün ledleri yanacak (8 adet led)
       ledb=LED-LEDA  'ikinci 595 in ise LEDB kadar ledi yanacaktır.
       ledc=0    'otomatikman LEDC sıfır olacaktır.
      EndIf

      If led>16 Then 'şayet led adedi 16 dan büyük ise
        leda=8 'ilk 595 ile
        ledb=8 'ikinci 595 de 8 er adet led yanacak
        ledc=LED-16  'sonuncuda ise LEDC kadar led yanacaktır.
      EndIf
       vera=(Dcd leda)-1
     verb=(Dcd ledb)-1
     verc=(Dcd ledc)-1



     gonder:
        SHOut PORTC.5,PORTC.6,1,[vera,verb,verc]
        High PORTC.7: DelayUS 15 :Low PORTC.7
GoTo basla
End

 


bu kodu daha hızlı caıtırmak icin ne yapmalıyım ? counter zamanını kısaltınca hassasıyet azalıyor veya arttırınca bekleme çoğalıyor

ete

#4
Burada sistemi yavaşlatan Counter komutu. Komut prensip olarak belirli bir zaman diliminde programı bloke ederek çalışıyor.
Ancak deviri ledlerle göstermek için kesinlikle uzun zamanlı örnekleme yapmak gerekir. Daha başka bir yöntem deneyeyim diyorsan, iki timer kullanırsın. Birisi kendi giriş pininden giren pulsleri sayar (harici CLK ) diğeride zamanı tutar.
Zaman tutan sayacın kesmesi oluştuğu zaman led bilgilerini yenilersin değilse bilgi aynı kalır.

Bir diğer metod ki belkide en hızlısı budur, gelen pulslerin puls genişliğini ölçmektir.
Önce HIGH puls genişliğini ardından LOW puls genişliğini ölçüp ikisini topladıktan sonra F=1000/Toplam=xxxx Khz şeklinde frekansı hesaplamış olursun.

Ete


Powered by EzPortal