32 ve 64 LED ADC Bar

Başlatan onurinci, 25 Nisan 2024, 03:44:19

onurinci

Hocam selam.
Elektro77 'nin yürüyen ledlerini görünce heveslendim, alıntı yaparak kendime uyarlamaya çalıştım.

16F877A aşırı pahalı elimde bir kaç 12F675 vardı ona uyarlamaya çalıştım.

aksak bir şekilde çalıştırmayı başardım..

elimde 595 ile yapılmış iki ayrı bord var biri 4 adet 595 32 LED'e sahip diğeri 8 595 entegre ve 64 LED'e sahip amacım bunlara can verebilmek idi..

mevcut yazılım 48 LED ile çalıştı. artırayım dedim [SAYAC[7] [SAYAC[5] gibi ilaveler yapayım dedim derlenmedi.

ikinci bir sorum ise SURE isimli değişkeni kullanmadığım için siliyorum .sistem sapıtıyor fazladan Led'ler yakıyor , bir anlam veremedim.

32 ve 64 çalışırsa güzel bir uygulama olacak bir sürü yerde kullanabilirim. ama asıl hayalim bunların Bargraph gitmesi görsel şölen olur. yorumlarınıza açığım ,

''*  Notes   : 48 LED Single Step ADC Walking

DEFINE OSC 4
DEFINE OSCCAL_1K 1
#CONFIG
#LIST_12F675
 __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BODEN_OFF
#ENDCONFIG

TRISIO= %00000001 : GPIO= 0 : CMCON= 7 : VRCON.7= 0 : ANSEL= %00100001 : ADCON0= %10000000
OPTION_REG.7= 1 : WPU= 0

DEFINE ADC_BITS 10            ' 10-bit ADC used
DEFINE ADC_CLOCK 3            ' Internal clock used
DEFINE ADC_SAMPLEUS 50        ' Sample timing

'--------------------------------------------------------------------
SYMBOL SHCP  =GPIO.2      ' Shift Register Clock Input
SYMBOL DS    =GPIO.4      ' Serial Data Input
SYMBOL STCP  =GPIO.5      ' Storage Register Clock Input 'ÇIKIŞA GÖNDER 
SHCP=0 : DS=0 : STCP=0    ' temizlik


SAYAC  VAR Byte ' [6]56
HAM    VAR WORD
SURE   VAR WORD '70
SAY    VAR BYTE '62
INDEX  VAR BYTE '63
YAK    VAR BYTE 65
ADET   VAR BYTE

PAUSE 200 : sayac=0: SAY=0 : INDEX=0 : ADET=0

PAUSE 200

BASLA:

  GOTO POT_YAK

'-------------------------------------------------------------------------------
HESAPLA:
    SAYAC[INDEX]=0 
    INDEX=ADET/8         
    say=DCD((adet-INDEX*8)-1)
    
 IF ADET//8=0 THEN
       INDEX=INDEX-1                        
       SAY=128
 ENDIF
       
    SAYAC[INDEX]=SAY
    GOSUB AKTAR
    RETURN        
'-------------------------------------------------------------------------------
AKTAR:
    SHIFTOUT DS,SHCP,1,[SAYAC[5],SAYAC[4],SAYAC[3],SAYAC[2],SAYAC[1],SAYAC[0]]
    STCP=1 : PAUSEUS 10 : STCP=0     
RETURN
'-------------------------------------------------------------------------------

POTOKU:
        ADCIN 0,HAM               ' Potla yakman işleminde ham değer
        YAK=(HAM*/121)/10         ' 0-48 ARASINA TEKABÜL EDER
RETURN
'-------------------------------------------------------------------------------

POT_YAK: 'Potun aldığı 0-1023 arası değere göre 48 ledden ilgili olanı yakan kısım

    ADET=YAK
    GOSUB HESAPLA                  
    GOSUB POTOKU

    goto basla

elektro77

#1
32 ve 64 ledli olan kodları aşağıya ekleyiverdim. @ete Hocam BAR olarak yanma konusunda yardımcı olur umarım. Bende nasıl olacağını çok merak ettim doğrusu.
''*  Notes  : 64 LED Single Step ADC Walking

DEFINE OSC 4
DEFINE OSCCAL_1K 1
#CONFIG
#LIST_12F675
 __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BODEN_OFF
#ENDCONFIG

TRISIO= %00000001 : GPIO= 0 : CMCON= 7 : VRCON.7= 0 : ANSEL= %00100001 : ADCON0= %10000000
OPTION_REG.7= 1 : WPU= 0

DEFINE ADC_BITS 10            ' 10-bit ADC used
DEFINE ADC_CLOCK 3            ' Internal clock used
DEFINE ADC_SAMPLEUS 50        ' Sample timing

'--------------------------------------------------------------------
SYMBOL SHCP  =GPIO.2      ' Shift Register Clock Input
SYMBOL DS    =GPIO.4      ' Serial Data Input
SYMBOL STCP  =GPIO.5      ' Storage Register Clock Input 'ÇIKIŞA GÖNDER 
SHCP=0 : DS=0 : STCP=0    ' temizlik


SAYAC  VAR Byte ' [6]56
HAM    VAR WORD
SURE  VAR WORD '70
SAY    VAR BYTE '62
INDEX  VAR BYTE '63
YAK    VAR BYTE 65
ADET  VAR BYTE

PAUSE 200 : sayac=0: SAY=0 : INDEX=0 : ADET=0

PAUSE 200

BASLA:

  GOTO POT_YAK

'-------------------------------------------------------------------------------
HESAPLA:
    SAYAC[INDEX]=0 
    INDEX=ADET/8        
    say=DCD((adet-INDEX*8)-1)
    
 IF ADET//8=0 THEN
      INDEX=INDEX-1                        
      SAY=128
 ENDIF
      
    SAYAC[INDEX]=SAY
    GOSUB AKTAR
    RETURN        
'-------------------------------------------------------------------------------
AKTAR:
    SHIFTOUT DS,SHCP,1,[SAYAC[7],SAYAC[6],SAYAC[5],SAYAC[4],SAYAC[3],SAYAC[2],SAYAC[1],SAYAC[0]]
    STCP=1 : PAUSEUS 10 : STCP=0    
RETURN
'-------------------------------------------------------------------------------

POTOKU:
        ADCIN 0,HAM              ' Potla yakman işleminde ham değer
        YAK=(HAM*/161)/10        ' 0-64 ARASINA TEKABÜL EDER
RETURN
'-------------------------------------------------------------------------------

POT_YAK: 'Potun aldığı 0-1023 arası değere göre 64 ledden ilgili olanı yakan kısım

    ADET=YAK
    GOSUB HESAPLA                  
    GOSUB POTOKU

    goto basla

Bu da 32 ledli olan kod.
''*  Notes  : 32 LED Single Step ADC Walking

DEFINE OSC 4
DEFINE OSCCAL_1K 1
#CONFIG
#LIST_12F675
 __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BODEN_OFF
#ENDCONFIG

TRISIO= %00000001 : GPIO= 0 : CMCON= 7 : VRCON.7= 0 : ANSEL= %00100001 : ADCON0= %10000000
OPTION_REG.7= 1 : WPU= 0

DEFINE ADC_BITS 10            ' 10-bit ADC used
DEFINE ADC_CLOCK 3            ' Internal clock used
DEFINE ADC_SAMPLEUS 50        ' Sample timing

'--------------------------------------------------------------------
SYMBOL SHCP  =GPIO.2      ' Shift Register Clock Input
SYMBOL DS    =GPIO.4      ' Serial Data Input
SYMBOL STCP  =GPIO.5      ' Storage Register Clock Input 'ÇIKIŞA GÖNDER 
SHCP=0 : DS=0 : STCP=0    ' temizlik


SAYAC  VAR Byte ' [6]56
HAM    VAR WORD
SURE  VAR WORD '70
SAY    VAR BYTE '62
INDEX  VAR BYTE '63
YAK    VAR BYTE 65
ADET  VAR BYTE

PAUSE 200 : sayac=0: SAY=0 : INDEX=0 : ADET=0

PAUSE 200

BASLA:

  GOTO POT_YAK

'-------------------------------------------------------------------------------
HESAPLA:
    SAYAC[INDEX]=0 
    INDEX=ADET/8        
    say=DCD((adet-INDEX*8)-1)
    
 IF ADET//8=0 THEN
      INDEX=INDEX-1                        
      SAY=128
 ENDIF
      
    SAYAC[INDEX]=SAY
    GOSUB AKTAR
    RETURN        
'-------------------------------------------------------------------------------
AKTAR:
    SHIFTOUT DS,SHCP,1,[SAYAC[3],SAYAC[2],SAYAC[1],SAYAC[0]]
    STCP=1 : PAUSEUS 10 : STCP=0    
RETURN
'-------------------------------------------------------------------------------

POTOKU:
        ADCIN 0,HAM              ' Potla yakman işleminde ham değer
        YAK=(HAM*/81)/10        ' 0-32 ARASINA TEKABÜL EDER
RETURN
'-------------------------------------------------------------------------------

POT_YAK: 'Potun aldığı 0-1023 arası değere göre 32 ledden ilgili olanı yakan kısım

    ADET=YAK
    GOSUB HESAPLA                  
    GOSUB POTOKU

    goto basla
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

İlk lede 1 verip sonraki led sayısını 2 ile çarparak giderseniz her seferinde tek led yanar.
1. 1
2. 2*1=2
3. 2*2=4
4. 4*2=8
5. 8*2=16
..
7. 64*2=128
dikkat ederseniz bu sayılar 8 bitlik sayının her bir bitinin HIGH olması konumuna denk gelmektedir.

Peki 1-3-7-15-31-63-127-255 şeklinde gitmesi için ne yapılmalı?
(1*2)+1=3
(3*2)+1=7
(7*2)+1=15
şeklinde bir hesap eklerseniz bu şekil sıralamayı yakalamış olursunuz.
Bu bilgi belki bir yerlerde yazmıyor ama sayıları önünüze koyunca nasıl bir hesapla bunları elde edeceğinize dair bilgide kafanızda şekilleniveriyor.

Geriye gitme değişmiyor. Hesap bunu gösteriyor.
örnek vermek gerekir ise;
15-7-3-1 sıralaması için ;
15/2=7
7/2=3
3/2=1

Ete


onurinci

@elektro77
 çok teşekkür ederim .

@ete hocam benim bunu koda entegre etmem mümkün değil , ilginize teşekkür ederim....

ete

#4
12f675 İÇİN 8X8=64 ledli sistem kodu aşağıdadır. Deneyin bakalım.
Aslında 32 led için yapılması gereken iki satırdaki değişiklikleride ekledim.
Birisi SAYAC VAR BYTE  tanımlamasında [4] ve [8] olarak led sayısına göre değişecek.

Diğeri POT okumada


''*  Notes  : 64 LED Single Step ADC Walking
     
DEFINE OSC 4
DEFINE OSCCAL_1K 1
#CONFIG
 __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BODEN_OFF
#ENDCONFIG
 
TRISIO= %00000001 : GPIO= 0 : CMCON= 7 : VRCON.7= 0 : ANSEL= %00100001 : ADCON0= %10000000
OPTION_REG.7= 1 : WPU= 0
 
DEFINE ADC_BITS 10            ' 10-bit ADC used
DEFINE ADC_CLOCK 3            ' Internal clock used
DEFINE ADC_SAMPLEUS 50        ' Sample timing
 
'--------------------------------------------------------------------
SYMBOL SHCP  =GPIO.2      ' Shift Register Clock Input
SYMBOL DS    =GPIO.4      ' Serial Data Input
SYMBOL STCP  =GPIO.5      ' Storage Register Clock Input 'ÇIKIŞA GÖNDER 
SHCP=0 : DS=0 : STCP=0    ' temizlik
 
 
SAYAC  VAR BYTE [8]56     '64 LED İÇİN BU SATIR AÇILACAK ALTTAKİ KAPANACAK
'SAYAC  VAR BYTE [4]56     '32 LED İÇİN BU SATIR AÇILACAK ÜSTTEKİ KAPANACAK
HAM    VAR WORD
SURE   VAR WORD 70
SAY    VAR BYTE 72
INDEX  VAR BYTE 73
YAK    VAR BYTE 74
I      var byte
 
PAUSE 200 : sayac=0: SAY=0 : INDEX=0 :' ADET=0
 
PAUSE 200
 
BASLA:
 
  GOTO POT_YAK
 
'-------------------------------------------------------------------------------
HESAPLA:
    SAYAC[INDEX]=0 
    INDEX=(yak/8)  
     
          
    IF (YAK//8)>0 THEN
      say=DCD(yak-INDEX*8)-1
    ELSE
      SAY=255:IF INDEX>0 THEN INDEX=INDEX-1
      IF YAK=0 THEN SAY=0
    ENDIF    
    
HESAP_BIR  
    FOR I=0 TO 7:sayac[I]=0:NEXT
    for I=0 to INDEX:SAYAC[I]=255:NEXT
    SAYAC[INDEX]=SAY
    GOSUB AKTAR
    RETURN      
'-------------------------------------------------------------------------------
AKTAR:
SHIFTOUT DS,SHCP,1,[SAYAC[7],SAYAC[6],SAYAC[5],SAYAC[4],SAYAC[3],SAYAC[2],SAYAC[1],SAYAC[0]]
'SHIFTOUT DS,SHCP,1,SAYAC[3],SAYAC[2],SAYAC[1],SAYAC[0]]    '32 led için bu açık olmalı ütteki kapanacak.
STCP=1 : PAUSEUS 10 : STCP=0    
RETURN
'-------------------------------------------------------------------------------
 
POTOKU:
        ADCIN 0,HAM              ' Potla yakman işleminde ham değer
        YAK=(HAM*/161)/10        ' 64 LED İÇİN BU SATIR AÇILACAK ALTTAKİ KAPANACAK.
'        YAK=(HAM*/81]/10         ' 32 LED İÇİN BU SATIR AÇILACAK ÜSTTEKİ KAPANACAK 
RETURN
'-------------------------------------------------------------------------------
 
POT_YAK: 'Potun aldığı 0-1023 arası değere göre 64 ledden ilgili olanı yakan kısım
    GOSUB POTOKU
    GOSUB HESAPLA                       
    goto basla


elektro77

#5
Hocam. Siz çok iyisiniz. Söyleyecek söz bulamıyorum artık.
Bir ek te ben yapayım.
Eğer 64 led bir vu-metre gibi kullanılmak istenirse;
YAK=(HAM*/800)/10
kodu bu şekilde değiştirilerek adc den okunan 0-1 volt arası gerilim ile tüm ledlerin yanması sağlanabilir.
32 led için ise bu formülün YAK=(HAM*/400)/10 olması gerekli.
 
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Aynı şeyi düşündüm ve pot'u çok hızlı hareket ettirince bazen üst kısımda yanık led bırakıyor sistem. Bunu engellemek için HESAP_BIR etiketi altını biraz değiştirdim.
Yükleyenler yeniden yüklesin. Yada aşıdaki kodla değiştirsin.

HESAP_BIR  
    for I=0 TO 7:sayac[I]=0:NEXT
    for I=0 to INDEX::SAYAC[I]=255:NEXT
    SAYAC[INDEX]=SAY
    GOSUB AKTAR
    RETURN
Ete

elektro77

#7
675 in dahili osilatörü en fazla kaç MHz idi hocam. Belki sese tepkisi düşük kalabilir diye düşünüyorum. Bu nedenle 20 MHz bir işlemci seçilebilir.
Yada adc ayarları ne yapılmalı.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Dahili OSC 4 Mhz ve bence yeterli.
Simulede bile tepkisi epeyce hızlı.   
Ete

ete

Bu arada bir şeyi atlamışım. 32 led ile çalışınca AKTAR isimli etiket altında yer alan SHIFT komutunda da değişiklik olmalı ve etiket aşağıdaki şekilde değiştirilmeli.
AKTAR:
SHIFTOUT DS,SHCP,1,[SAYAC[7],SAYAC[6],SAYAC[5],SAYAC[4],SAYAC[3],SAYAC[2],SAYAC[1],SAYAC[0]]
'SHIFTOUT DS,SHCP,1,SAYAC[3],SAYAC[2],SAYAC[1],SAYAC[0]]    '32 led için bu açık olmalı ütteki kapanacak.
STCP=1 : PAUSEUS 10 : STCP=0    
RETURN

elektro77

Alıntı yapılan: ete - 25 Nisan 2024, 20:07:27Bu arada bir şeyi atlamışım. 32 led ile çalışınca AKTAR isimli etiket altında yer alan SHIFT komutunda da değişiklik olmalı ve etiket aşağıdaki şekilde değiştirilmeli.
AKTAR:
SHIFTOUT DS,SHCP,1,[SAYAC[7],SAYAC[6],SAYAC[5],SAYAC[4],SAYAC[3],SAYAC[2],SAYAC[1],SAYAC[0]]
'SHIFTOUT DS,SHCP,1,SAYAC[3],SAYAC[2],SAYAC[1],SAYAC[0]]    '32 led için bu açık olmalı ütteki kapanacak.
STCP=1 : PAUSEUS 10 : STCP=0    
RETURN
Hocam hiç bir fark göremiyorum. Sadece köşeli parantez "açma" eksikti ben derlerken koymuştum. Burada yine eksik. Onumu kastediyorsunuz...
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

onurinci

@ete hocam ve @elektro77 tekrar tekrar teşekkür ederim.

hocam 64 LED Bargraph kusursuz derlenirken 32 LED derlemeye kalkınca ilgili uyarılar yönergesini takip etmeme rağmen derlenmiyor ShiftOut kısmında takılıyor. bir eksik köşeli parantez görüp onardım ama nafile..
''*  Notes  : 64 LED Single Step ADC Walking
     
DEFINE OSC 4
DEFINE OSCCAL_1K 1
#CONFIG
 __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BODEN_OFF
#ENDCONFIG
 
TRISIO= %00000001 : GPIO= 0 : CMCON= 7 : VRCON.7= 0 : ANSEL= %00100001 : ADCON0= %10000000
OPTION_REG.7= 1 : WPU= 0
 
DEFINE ADC_BITS 10            ' 10-bit ADC used
DEFINE ADC_CLOCK 3            ' Internal clock used
DEFINE ADC_SAMPLEUS 50        ' Sample timing
 
'--------------------------------------------------------------------
SYMBOL SHCP  =GPIO.2      ' Shift Register Clock Input
SYMBOL DS    =GPIO.4      ' Serial Data Input
SYMBOL STCP  =GPIO.5      ' Storage Register Clock Input 'ÇIKIŞA GÖNDER 
SHCP=0 : DS=0 : STCP=0    ' temizlik
 
 
'SAYAC  VAR BYTE [8]56     '64 LED İÇİN BU SATIR AÇILACAK ALTTAKİ KAPANACAK
SAYAC  VAR BYTE [4]56     '32 LED İÇİN BU SATIR AÇILACAK ÜSTTEKİ KAPANACAK
HAM    VAR WORD
SURE   VAR WORD 70
SAY    VAR BYTE 72
INDEX  VAR BYTE 73
YAK    VAR BYTE 74
I      var byte
 
PAUSE 200 : sayac=0: SAY=0 : INDEX=0 :' ADET=0
 
PAUSE 200
 
BASLA:
 
  GOTO POT_YAK
 
'-------------------------------------------------------------------------------
HESAPLA:
    SAYAC[INDEX]=0 
    INDEX=(yak/8)  
    
    IF YAK<8 THEN
      INDEX=0:SAY=DCD(YAK)-1
      FOR I=0 TO 7
        SAYAC[I]=0
      NEXT
      SAYAC[INDEX]=SAY
      GOSUB AKTAR
      RETURN
    ENDIF    
          
    IF (YAK//8)>0 THEN
      say=DCD(yak-INDEX*8)-1
    ELSE
      SAY=255:IF INDEX>0 THEN INDEX=INDEX-1
    ENDIF    
    
HESAP_BIR  
    for I=0 TO 7:sayac[I]=0:NEXT
    for I=0 to INDEX:SAYAC[I]=255:NEXT
    SAYAC[INDEX]=SAY
    GOSUB AKTAR
    RETURN      
'-------------------------------------------------------------------------------
AKTAR:
'SHIFTOUT DS,SHCP,1,[SAYAC[7],SAYAC[6],SAYAC[5],SAYAC[4],SAYAC[3],SAYAC[2],SAYAC[1],SAYAC[0]]
SHIFTOUT DS,SHCP,1,[SAYAC[3],SAYAC[2],SAYAC[1],SAYAC[0]]    '32 led için bu açık olmalı ütteki kapanacak.
STCP=1 : PAUSEUS 10 : STCP=0    
RETURN
'-------------------------------------------------------------------------------
 
POTOKU:
        ADCIN 0,HAM              ' Potla yakman işleminde ham değer
'       YAK=(HAM*/161)/10        ' 64 LED İÇİN BU SATIR AÇILACAK ALTTAKİ KAPANACAK.
        YAK=(HAM*/81]/10         ' 32 LED İÇİN BU SATIR AÇILACAK ÜSTTEKİ KAPANACAK 
RETURN
'-------------------------------------------------------------------------------
 
POT_YAK: 'Potun aldığı 0-1023 arası değere göre 64 ledden ilgili olanı yakan kısım
    GOSUB POTOKU
    GOSUB HESAPLA                       
    goto basla

elektro77

#12
YAK=(HAM*/81]/10
buradaki köşeli parantezi düzelt
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

onurinci

evet o kadar dikkatli bakmama rağmen onu düzeltmiştim. ama yanlış parantez koymuşum.

fakat yine aynı ShiftOut satırına takıldı. tek tek kompare ettim hiç bir hata yok.

bende https://text-compare.com/ 'dan yardım almaya karar verdim.

bu satırları 64 ve 32 olarak oraya yapıştırdım.

ve evet arada olmayan bir karakter çıktı ve uyumsuz dedi.

bende el ile mevcut satırları komple silip tek tek yazdım ve kusursuz derlendi.

yani bu HTML kopyalama hala güvensiz sanırım..

ilginize tekrar teşekkür ederim . sorunum çözüldü..  banada Supertex HV5222 entegresine yaptığım evulasyon bordunda bu kodları denemek kaldı..

elektro77

Code tag ın sağ üst köşesindeki kopyala ikonundan kopyalaman gerek.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

Powered by EzPortal