16f628a

Başlatan coco, 24 Aralık 2025, 20:34:51

coco

Sony tv uzaktan kumandası alıcı 16f628 ile çalıştırıken beslemeyi kesip vermeden düzgün çalışmıyor
Programda düzeltmem gerekenler nelerdir?
	@ DEVICE PIC16F628A                       'işlemci PIC16F628A                                
	@ DEVICE PIC16F628A, WDT_OFF              'Watch Dog timer açık
	@ DEVICE PIC16F628A, PWRT_OFF             'Power on timer açık
	@ DEVICE PIC16F628A, PROTECT_OFF          'Kod Protek kapalı
	@ DEVICE PIC16F628A, MCLR_OFF             'MCLR pini kullanılıyor.
	@ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT   'Dahili osilatör kullanılacak 
	@ DEVICE PIC16F628A, CPD_OFF              'Eeprom Protek kapalı
	@ DEVICE PIC16F628A, BOD_OFF              'Boden kapalı
	 
	 
	DEFINE OSC 4
	 
	TRISB=%00000001   'PortB.0 giriş diğerleri çıkış yapıldı.
	TRISA=%00000000   'A portu tamamı çıkış yapıldı.
	 
	CMCON=7                  'Komparator kapalı
	  
	SYMBOL LED1= PORTB.4      ' PORTB.4 pinine sembol ismi olarak LED1 adı verildi.
	SYMBOL LED2= PORTB.5      ' PORTB.5 pinine sembol ismi olarak LED2 adı verildi.
	symbol IR_Goz= PORTB.0   ' PORTB.0 pinine sembol ismi olarak IR_Goz adı verıldi.
	POZ  VAR  BIT
	 
	Paket var word 56
	IR_AL var word (12)
	 
	Tus  Var Byte 82
	Cihaz Var Byte 83
	I    var Byte
	Z    var BYTE
	Led  var bit
	            
	BASLA:   
              GOSUB TUSGIR 
 
	      IF TUS=18 THEN                'VOLUME +
	        LED1=1 
	        PAUSE 100
	        ELSE
	        LED1=0    
	      ENDIF 
	      GOTO BASLA

'-------------------------ALT PROGRAM------------------------------------------------------------
	          
	TUSGIR:
	      TUS=0:CIHAZ=0
	      PuLSIN IR_Goz,0,PAKET
	      if PAKET<200 OR PAKET>270 then  RETURN
	 
	      for I=0 to 11
	      pulsin IR_Goz,0,IR_AL(I)
	      next            
	      Tus=127
	      
	AYIKLA:
	      For I=0 to 6
	        if IR_AL(I)<80 then Tus.bit0[I]=0
	      next
	 
	      Cihaz=%00011111
	      for I=0 to 4
	        IF IR_AL(7+I)<80 then Cihaz.Bit0[I]=0
	      next
	      RETURN
	 
	    
	END

ete

programda muhtemelen stack taşması hatası oluşuyor.
Çünkü gosub ile gidilmesi gereken alt programa (TUSGIR) sen direk geçiyorsun ama oradan çıkarken RETURN ile çıkmaya çalışıyorsun.Hep söylüyorum. ALt programlara GOSUB ile gidilir ve oradan RETURN ile dönülür. GOSUB ile gidip Goto ile dönersen programında Stack taşması olur ve kilitlenir.
Yada tersini düşünerek bir alt programın en altında RETURN var ise o alt programa GOSUB ile gidilmelidir. Sende olan eksiklik bu idi.

Programın düzeltilmesi gereken yeri BASLA satırının hemen altına GOSUB TUSGIR eklenmeli ve hemen altındaki IF satırlarından sonra gelen ENDIF altınada GOTO BASLA yazılmalıdır.
Bu düzeltmeyi yaptım ve senin programın üzerine yazdım. Direk oradan kopyala ve onu kullan.

Bu arada işlemcinin 16F628A olmasına dikkat et. 16F628 de olabilir. İkisi arasında Koparatör farkı vardır. Şayet 16F628 kullanıyor isen programın baş taraflarında yer alan CMCON=7 komutunu silmen gerekir. Şayet 16f628A kullanıyor isen o satır yerinde kalmalıdır.

Ete

coco

#2
düzeltiyorum....ir port kablosu çıkmış

ete

ELindeki ilk program çalışıyor ise bununda çalışması gerekirdi.
Çalışıyor demiştin. Programın kod okuma kısmına dokunmadık.

Ete


aRci

Merhaba dizi tanımlamasında ve dizi değişkenleri ile işlem yaparken köşeli prantez kullanılmalıdır. derlemede hata almadım.


@ DEVICE PIC16F628A                      'işlemci PIC16F628A                                
    @ DEVICE PIC16F628A, WDT_OFF              'Watch Dog timer açık
    @ DEVICE PIC16F628A, PWRT_OFF            'Power on timer açık
    @ DEVICE PIC16F628A, PROTECT_OFF          'Kod Protek kapalı
    @ DEVICE PIC16F628A, MCLR_OFF            'MCLR pini kullanılıyor.
    @ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 
    @ DEVICE PIC16F628A, CPD_OFF              'Eeprom Protek kapalı
    @ DEVICE PIC16F628A, BOD_OFF              'Boden kapalı

    DEFINE OSC 4
    
    TRISB=%00000001  'PortB.0 giriş diğerleri çıkış yapıldı.
    TRISA=%00000000  'A portu tamamı çıkış yapıldı.
    
    CMCON=7                  'Komparator kapalı
      
    SYMBOL LED1= PORTB.4      ' PORTB.4 pinine sembol ismi olarak LED1 adı verildi.
    SYMBOL LED2= PORTB.5      ' PORTB.5 pinine sembol ismi olarak LED2 adı verildi.
    symbol IR_Goz= PORTB.0  ' PORTB.0 pinine sembol ismi olarak IR_Goz adı verıldi.
    POZ  VAR  BIT
    
    Paket var word 56
    IR_AL var word [12]
    
    Tus  Var Byte 82
    Cihaz Var Byte 83
    I    var Byte
    Z    var BYTE
    Led  var bit
                
    BASLA:  
              GOSUB TUSGIR 
 
          IF TUS=18 THEN                'VOLUME +
            LED1=1 
            PAUSE 100
            ELSE
            LED1=0    
          ENDIF 
          GOTO BASLA
 
'-------------------------ALT PROGRAM------------------------------------------------------------
              
    TUSGIR:
          TUS=0:CIHAZ=0
          PuLSIN  IR_Goz,0,PAKET
          if PAKET<200 OR PAKET>270 then  RETURN
    
          for I=0 to 11
          pulsin  IR_Goz,0,IR_AL[I]
          next            
          Tus=127
          
    AYIKLA:
          For I=0 to 6
            if IR_AL[I]<80 then Tus.bit0[I]=0
          next
    
          Cihaz=%00011111
          for I=0 to 4
            IF IR_AL[7+I]<80 then Cihaz.Bit0[I]=0
          next
          RETURN
    
        
    END

coco

Ete hoca çalıştırdım ir port girişi çıkmış yerinden.Sağolun

Şimdi tv kumandasının iki butonuna ayrı ayrı basınca iki ayrı ledin sabit yanmasın̈ı istiyorum

ete

Bunun için bastığın tuş kodunu bilmen gerekiyor.
Gerisinin örneği zaten programda var.
Ete

ete

Normal şartlarda Sony tuş kodları bu sistem açıklamalarında yer alıyor.
Örneğin senn kullandığın Volume+ tuşu kodu 18 olarak verilmiş. Bir kaç tanesini bende vereyim.
0-9 rakam tuşları direk kendi tuş kodunu kullanır. Yani 1 nolu tuş kodu 1 dir.
Kanal+   16
Kanal-   17
Ses+     18
Ses-     19
Mute     20
Açma     21  (muhtemelen on/off tuşudur)

Kullanacağın tuş bunların arasında yok ise hangisi olduğunu söylersen belki kodu bulabiliriz.

Kod bulmanın diğer bir yöntemide mevcut programı kullanmaktır.
Programa bir kod ekleyerek basılan her tuşun sıralı olarak eproma kayıt edilmesini sağlarsın. Daha sonra epromu programlama arayüzü üzerinden okuyarak tuş kodlarını bir yere yazarsın.
Programa eklenecek kod şöyle olabilir.
SIRA VAR BYTE 'önce bir kayıt sırası değişkeni tanımlarsın
...
...
SIRA=1
BASLA:
      GOSUB TUSGIR
      IF TUS>0 THEN
         WRITE SIRA,TUS:PAUSE 10
         SIRA=SIRA+1
      ENDIF    
      GOTO BASLA
Bu kod basılan her tuşu epromun 1 nolu adresinden itibaren kayıt edecektir.
Sen bastığın her tuşu bu sıra numarası ile kayıt edersin ve tuşun adını sıra numarası yanına yazarsın. Sonra epromu okuyarak tuş kodlarını 1 nolu adresten itibaren listene eklersin.

Gelelim 2 ci ledin nasıl yaktıralacağı meselesine.
Bu konuda diyelimki tuş kodlarından kodu 21 olan açma tuşunu kullanacaksın. Buna göre programın ilave edilecek kısmını yazalım.
SYMBOL LED2=PORTX.y 'burada o ledi bağlayacağın PORT X oluyor. Portun hangi bitine bağlayacak isen oda y oluyor.
...
...
BASLA:
      IF TUS=21 THEN
        LED2=1
        PAUSE 100
      ELSE
        LED2=0
      ENDIF
Hepsi bu kadar. Tabiiki eski tuş kontrol kodlarını silmiyorsun sadece yukarıkileri ekliyorsun.

Ete

coco

Volume 18 ve 19 düzgün çalışıyor
ama tuş seçiminde 1 yazınca kumandadan da 2 butonu ile işlem yapıyor bu diğer 3,4,5,6 butonlarıylada aynı

coco

#9
.

ete

Sanırım senin TV de rakam tuşları aşağıdaki şekilde kodlanmış.

Kumanda da 1 tuşuna basılınca yollanan kod =0
Kumanda da 2 tuşuna basılınca yollanan kod =1
Kumanda da 3 tuşuna basılınca yollanan kod =2
Kumanda da 4 tuşuna basılınca yollanan kod =3
..
..
Kumanda da 9 tuşuna basılınca yollanan kod =0
Bu durumda şayet okunan kod<10 ise TUS=TUS+1 yaptırılmasında fayda vardır.
Böylece rakam tuşları kendi kodlarına ulaşır ve tus=10 ise rakam sıfır demektir.

Ete

Powered by EzPortal
▲