Dac ile volum kontrol

Başlatan onurinci, 08 Mayıs 2014, 02:30:06

onurinci

Hocam selamlar.
yine aldım klavyeyi,DAC 08 yada R2 yöntemi ile basit bir volum kontrol yapmaya çalışıyorum.
Devreyi kısaca izah eder isek.
bir adet basmalı 24 per turn iki bit grey encoder var
artırma azaltma birde ,acil durumlarda encoder butonuna basar isek minimuma dönüyor.
en son konumu eeproma yazıyor.
bredborda kurdum gayet güzel çalıştı pek sevindim.havalara girdim,10 dakika çay molası verdim şuna bir daha enerji vereyim dedim tık yok encoderle oynadım bazen geliyor bazen gelmiyor.
sabırla fault chart yaptım kendimce problemi buldum.encoder yanlışlıkla yada mekaniksel olarak
kararaız bir bölgede bırakılır ise çalışmıyor.sizin yazılarınızda OR'layın ifadenizi okudum bende OR'ladım.
piyasada 3 çeşit encoder buldum,hepsini denedim.1 tanesinde kusursuz çalıştı,fakat bu encoder o kadar sıkı'ki neredeyse komutatör olmuş,hiç tadı yok.sizden ricam encoder rutinini
iyileştirebilirmisiniz ? . saygılar

Not isiste bu saçmalamayı yapmıyor.

Kod epey uzun kusura bakmayın.

@ DEVICE pic16F877A, WDT_OFF, PWRT_ON, PROTECT_OFF, XT_OSC
DEFINE OSC 4

TRISA = %00000000 : PORTA=0
TRISB = %00000111 : PORTB=0
TRISC = %00000000 : PORTC=0
TRISD = %00000000 : PORTD=0
TRISE = %00000000 : PORTE=0

DEFINE LCD_DREG PORTA
DEFINE LCD_DBIT 0
DEFINE LCD_EREG PORTE
DEFINE LCD_EBIT 0
DEFINE LCD_RSREG PORTE
DEFINE LCD_RSBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2

OPTION_REG.7 = 0
ADCON1 = 7
CMCON = 7

SAYI    VAR byte
DEGISTI VAR BIT
'-------------------------------------------------------------------------------
      READ 10,SAYI
IF SAYI = 255 THEN SAYI = 0

Start:
'-------------------------------------------------------------------------------
if  PORTB.0 = 0 then 
DEGISTI = 1
SAYI = SAYI + 1
IF SAYI > 31 THEN SAYI = 31   
    while (PORTB.0 = 0 or PORTB.1 = 0): pause 10 : wend   
    LCDOUT $FE, 1 ' Clear the LCD
      pause 30
endIF   
'-------------------------------------------------------------------------------
IF PORTB.1 = 0 THEN
DEGISTI = 1
SAYI = SAYI - 1
IF SAYI = 255 THEN SAYI = 0
   while (PORTB.0 = 0 or PORTB.1 = 0): pause 10 : wend
   LCDOUT $FE, 1 ' Clear the LCD
      pause 30
endIF
'-------------------------------------------------------------------------------   
IF PORTB.2 = 0 THEN
SAYI = 0      '0  Call init frequency here
DEGISTI = 1
LCDOUT $FE, 1 ' Clear the LCD
ENDIF
'-------------------------------------------------------------------------------
SELECT CASE SAYI
                                      '
      CASE 0
      LCDOUT $FE,$80,"  Volume Min     "        ' Volume Min
      LCDOUT  254,64,24,24,24,24,24,24,24,0    ' Cust Char #0
      LCDOUT $FE,$C0,0
      PORTC = %00000000
      PORTD = %00000000
     
      CASE 1
      LCDOUT $FE,$80,"  Volume  1 dB  "         ' Volume  1
      LCDOUT  254,64,3,3,3,3,3,3,3,0           ' Cust Char #1
      LCDOUT $FE,$C0,0
      PORTC = %00000001
      PORTD = %00000000
'_2     
      CASE 2
      LCDOUT $FE,$80,"  Volume  2 dB  "         ' Volume  2
      LCDOUT  254,64,24,24,24,24,24,24,24,0    ' Cust Char #0
      LCDOUT $FE,$C1,0
      PORTC = %00000010
      PORTD = %00000000
     
      CASE 3
      LCDOUT $FE,$80,"  Volume  3 dB  "         ' Volume  3
      LCDOUT  254,64,3,3,3,3,3,3,3,0           ' Cust Char #1
      LCDOUT $FE,$C1,0
      PORTC = %00000011
      PORTD = %00000000
'_3     
      CASE 4
      LCDOUT $FE,$80,"  Volume  4 dB  "         ' Volume  4   
      LCDOUT  254,64,24,24,24,24,24,24,24,0    ' Cust Char #0
      LCDOUT $FE,$C2,0
      PORTC = %00000100
      PORTD = %00000000
     
      CASE 5
      LCDOUT $FE,$80,"  Volume  5 dB  "         ' Volume  5   
      LCDOUT  254,64,3,3,3,3,3,3,3,0           ' Cust Char #1   
      LCDOUT $FE,$C2,0
      PORTC = %00000101
      PORTD = %00000000
'_4     
      CASE 6
      LCDOUT $FE,$80,"  Volume  6 dB  "         ' Volume  6
      LCDOUT  254,64,24,24,24,24,24,24,24,0    ' Cust Char #0
      LCDOUT $FE,$C3,0
      PORTC = %00000110
      PORTD = %00000000
     
      CASE 7
      LCDOUT $FE,$80,"  Volume  7 dB  "         ' Volume  7
      LCDOUT  254,64,3,3,3,3,3,3,3,0           ' Cust Char #1
      LCDOUT $FE,$C3,0
      PORTC = %00000111
      PORTD = %00000000
'_5     
      CASE 8
      LCDOUT $FE,$80,"  Volume  8 dB  "         ' Volume  8
      LCDOUT  254,64,24,24,24,24,24,24,24,0    ' Cust Char #0
      LCDOUT $FE,$C4,0
      PORTC = %00001000
      PORTD = %00000000
     
      CASE 9
      LCDOUT $FE,$80,"  Volume  9 dB  "         ' Volume  9   
      LCDOUT  254,64,3,3,3,3,3,3,3,0           ' Cust Char #1
      LCDOUT $FE,$C4,0
      PORTC = %00001001
      PORTD = %00000000
     
      CASE 10
      LCDOUT $FE,$80,"  Volume 10 dB  "         ' Volume 10
      LCDOUT  254,64,24,24,24,24,24,24,24,0    ' Cust Char #0
      LCDOUT $FE,$C5,0
      PORTC = %00001010
      PORTD = %00000000
     
      CASE 11
      LCDOUT $FE,$80,"  Volume 11 dB  "         ' Volume 11
      LCDOUT  254,64,3,3,3,3,3,3,3,0           ' Cust Char #1
      LCDOUT $FE,$C5,0
      PORTC = %00001011
      PORTD = %00000000
     
      case 12
      LCDOUT $FE,$80,"  Volume 12 dB  "         ' Volume 12
      LCDOUT  254,64,24,24,24,24,24,24,24,0    ' Cust Char #0
      LCDOUT $FE,$C6,0
      PORTC = %00001100
      PORTD = %00000000
     
      case 13
      LCDOUT $FE,$80,"  Volume 13 dB  "         ' Volume 13
      LCDOUT  254,64,3,3,3,3,3,3,3,0           ' Cust Char #1
      LCDOUT $FE,$C6,0
      PORTC = %00001101
      PORTD = %00000000
     
      case 14
      LCDOUT $FE,$80,"  Volume 14 dB  "         ' Volume 14
      LCDOUT  254,64,24,24,24,24,24,24,24,0    ' Cust Char #0
      LCDOUT $FE,$C7,0
      PORTC = %00001110
      PORTD = %00000000
     
      case 15
      LCDOUT $FE,$80,"  Volume 15 dB  "         ' Volume 15
      LCDOUT  254,64,3,3,3,3,3,3,3,0           ' Cust Char #1
      LCDOUT $FE,$C7,0
      PORTC = %00001111
      PORTD = %00000000
     
      case 16
      LCDOUT $FE,$80,"  Volume 16 dB  "         ' Volume 16
      LCDOUT  254,64,24,24,24,24,24,24,24,0    ' Cust Char #0
      LCDOUT $FE,$C8,0
      PORTC = %00010000
      PORTD = %00000000
     
      case 17
      LCDOUT $FE,$80,"  Volume 17 dB  "         ' Volume 17
      LCDOUT  254,64,3,3,3,3,3,3,3,0           ' Cust Char #1
      LCDOUT $FE,$C8,0
      PORTC = %00010001
      PORTD = %00000000
     
      case 18
      LCDOUT $FE,$80,"  Volume 18 dB  "         ' Volume 18
      LCDOUT  254,64,24,24,24,24,24,24,24,0    ' Cust Char #0
      LCDOUT $FE,$C9,0
      PORTC = %00010010
      PORTD = %00000000
     
      case 19
      LCDOUT $FE,$80,"  Volume 19 dB  "         ' Volume 19
      LCDOUT  254,64,3,3,3,3,3,3,3,0           ' Cust Char #1
      LCDOUT $FE,$C9,0
      PORTC = %00010011
      PORTD = %00000000
     
      case 20
      LCDOUT $FE,$80,"  Volume 20 dB  "         ' Volume 20
      LCDOUT  254,64,24,24,24,24,24,24,24,0    ' Cust Char #0
      LCDOUT $FE,$CA,0     
      PORTC = %00010100
      PORTD = %00000000
     
      case 21
      LCDOUT $FE,$80,"  Volume 21 dB  "         ' Volume 21
      LCDOUT  254,64,3,3,3,3,3,3,3,0           ' Cust Char #1
      LCDOUT $FE,$CA,0
      PORTC = %00010101
      PORTD = %00000000
     
      case 22
      LCDOUT $FE,$80,"  Volume 22 dB  "         ' Volume 22
      LCDOUT  254,64,24,24,24,24,24,24,24,0    ' Cust Char #0
      LCDOUT $FE,$CB,0
      PORTC = %00010110
      PORTD = %00000000
     
      case 23
      LCDOUT $FE,$80,"  Volume 23 dB  "         ' Volume 23
      LCDOUT  254,64,3,3,3,3,3,3,3,0           ' Cust Char #1
      LCDOUT $FE,$CB,0
      PORTC = %00010111
      PORTD = %00000000
     
      case 24
      LCDOUT $FE,$80,"  Volume 24 dB  "         ' Volume 24
      LCDOUT  254,64,24,24,24,24,24,24,24,0    ' Cust Char #0
      LCDOUT $FE,$CC,0
      PORTC = %00011000
      PORTD = %00000000
     
      case 25
      LCDOUT $FE,$80,"  Volume 25 dB  "         ' Volume 25
      LCDOUT  254,64,3,3,3,3,3,3,3,0           ' Cust Char #1
      LCDOUT $FE,$CC,0
      PORTC = %00011001
      PORTD = %00000000

      case 26
      LCDOUT $FE,$80,"  Volume 26 dB  "         ' Volume 26
      LCDOUT  254,64,24,24,24,24,24,24,24,0    ' Cust Char #0
      LCDOUT $FE,$CD,0
      PORTC = %00011010
      PORTD = %00000000
     
      case 27
      LCDOUT $FE,$80,"  Volume 27 dB  "         ' Volume 27
      LCDOUT  254,64,3,3,3,3,3,3,3,0           ' Cust Char #1
      LCDOUT $FE,$CD,0
      PORTC = %00011011
      PORTD = %00000000
     
      case 28
      LCDOUT $FE,$80,"  Volume 28 dB  "         ' Volume 28
      LCDOUT  254,64,24,24,24,24,24,24,24,0    ' Cust Char #0
      LCDOUT $FE,$CE,0
      PORTC = %00011100
      PORTD = %00000000
     
      case 29
      LCDOUT $FE,$80,"  Volume 29 dB  "         ' Volume 29
      LCDOUT  254,64,3,3,3,3,3,3,3,0           ' Cust Char #1
      LCDOUT $FE,$CE,0
      PORTC = %00011101
      PORTD = %00000000
     
      case 30
      LCDOUT $FE,$80,"  Volume 30 dB  "         ' Volume 30
      LCDOUT  254,64,24,24,24,24,24,24,24,0    ' Cust Char #0
      LCDOUT $FE,$CF,0
      PORTC = %00011110
      PORTD = %00000000
     
      case 31
      LCDOUT $FE,$80,"  Volume Max     "         ' Volume Max
      LCDOUT  254,64,3,3,3,3,3,3,3,0           ' Cust Char #1
      LCDOUT $FE,$CF,0
      PORTC = %00011101
      PORTD = %00000000
     


 
END SELECT

'-------------------------------------------------------------------------------
IF DEGISTI = 1 THEN
      WRITE 10,SAYI
      PAUSE 30
DEGISTI = 0
ENDIF
'-------------------------------------------------------------------------------     
      GOTO Start
  END


Simulasyon dosyası ektedir.
http://www.dosya.tc/server29/MiqEWc/EncoderVolume3.rar.html

sonmoikan

#1
select case yerine kodlarını şu şekilde kısaltabilirsin


Ses_Ekran:
      LCDOUT $FE,$80,"   Volume : ",dec2 sayi
      LCDOUT $FE,$C0,rep "|"\(sayi/2)
      ;REP KAREKTER\UZUNLUGU (karekteri uzunluk kadar tekrar yazar)
      PORTC=PORTC+1
return
ABDULLAH

ete

#2
Programda bir sürü lüzumsuz satır mevcut. Hala çözemediğim lcd komutları var. Neden yazıldığı belli değil çünki hiç bir fonksiyonları yok.

Her neyse encoder pot kullanımıda hatalı bence. simulasyonda en güzel encoder kullanımı Motor-Encoder ile oluyor. Birebir aynısıdır normal encoderin. Tek kusuru motorla döndüğü için bir momenti oluyor ve sen bıraksan da o biraz daha dönüyor. Ama sonuçta nasıl çalışacağının güzel bir göstergesi bu . Bu nedenle devreyi değiştirdim. Programıda epeyce sadeleştirdim.
İlişiktedir.
Devrede yer alan butonlarla senin koyduğun butonların alakası yok. Ben yalnızca motoru çevirmek için buton koydum. Gerçek devrede encoder el ile çvrildiği için röle ve butonlar yer almayacaktır elbette. Buton kontrolüde koyacaksan başka bir pine bağlaman daha doğru olur.

Ete

edit: her sayı değiştiğinde PORTC=SAYI şeklinde komut da vermek gerekiyor sanırım. Şemada PortC de bir şey bağlı olmayınca onu atlamışım. Ama senin programında sayının her değeri PortC ye verilmiş.  BU nedenle,
IF DEGISTI=0... satırından bir önceki satıra,
PORTC=SAYI
komut satırını ilave etmen gerekir.


onurinci

hocam saygılar.
sizin tasarladığınız harika olmuş.fakat benim sadece encoder rutinleri^nin gelişmesine ihtiyacım var.Case mantığı olduğu gibi kalmasını istiyorum.

http://www.darreltaylor.com/files/CustChar.htm
adresinden 5x7 matris için 2 adet Custom character. oluşturdum.
sizin gibi bargraph yapmaktı amacım bazı yerlerde ekran titredi vazgeçtm.tek tek gitmesine razı oldum.
encoder ve buton rutinlerine LCD clear verdim çünki bazen geri döndüğümde ekranda istenmeyen karakterler kalıyordu.bunları mecburiyetten kullandım.

bu case mantığı ,yazılım bilen yazılıma hakim olan kişilerce benim yazdıklarım uzun gelebilir,ama ben atmışına merdiven dayadım ve bu işi amatörce yapıyorum sizler kadar zeki değilim..amacım programı kısaltmak değil .zaten bu programda sizin desteğiniz sayesinde oluştu varolun.
hcam mini bir ricam programdan vazgeçmek istemiyorum benim için kemik program sayılır,çok rahat geliştirebiliyorum.bu halideki programın encoder rutinlerine bir kez daha bakabilirmisiniz ?.
sorun bence , 2 bitlik gray kodu dışında illegal bir konumda kalıyorsa LCD falan başlamıyor.dün akşam uğratım encoder yerine button mantığı yerleştirdim o program kusursuzca çalıştı.sorun encoder okuma mantığında kolaylıklar dilerim.

ete

Encoder okuma kısmını bir alt program şeklinde verdim. Onu direk alıp kendi programına monte edebilirsin.
Senin encoder okuma amntığın buton kontrolu gibi düşünülmüş. Bu şekilde encoder okunması mümkün değil maalesef.
Bu konuda elimden başka bir şey gelmez.

Ete

onurinci

hocam çok uğraştım sizin mantığı benim programa adapte edemedim.

boş bir zaman bulduğunuzda ilgilenir iseniz sevinirim.kalın sağlıcakla.

ete

Adapte edilmiş hali ilişiktedir.

Ete


onurinci

hocam takılma yok,olmuş gibi. bar saçmalıyor stabil değil,görsel şölen idi ondan vazgeçebilirim.fakat sorun şu ki her enerji verdiğimde kendiliğinden bir sayı artıyor.
örnegin ilk çalıştırdınız ekranda 1 var kapatıp açtığınızda ekran 2 oluyor,biraz uğraşayım bakayım çözebilecekmiyim.kalın sağlıcakla.

Powered by EzPortal