Illegal Opcode hatası

Başlatan Kefran, 25 Nisan 2013, 00:19:56

ete

Anlamadım ne demek istediğini !.
Yemek yedikten onra belki anlarım.
Ete

ete

Alıntı Yappeki hocam bu devrenin tam tersini düşünsek yani çözücü degilde kodlaycı olarak çalıştırabilirizmiyiz yani bir buzer yada hopörlör koyup dtmf yi okutabilirmiyiz yani pic e tanımladıgımız dtmf yi çıkıştan almak gibi
Bu devre DTMF kodlarını çözer. Sen tersini isteyince rakam girip ondan DTMF kodu üretmek aklıma gelir.
Sen ise hoparlörden falan bahsediyorsun. Hoparlör ile olmaz. Hoparlör analog sinyaldir. Onu birde digitale çevirmen gerekir.
HP den dinlediğin ses yine hattan gelen olmuyormu? bu şekilde yne kod çözmüş olmazmısın. Ne yapmak istediğini anlamadım.
Ete

bygece

sinyal olarakta olabilir  bir devre düşünelim birtane buton olsun butona bastıgımızda pic de belirledigimiz dtmf kodunu sinyal olarak cıksın  yani cıkışında dtmf kodu üretsin gibi

ete

20 Mhz kristal kullanmak şartı ile pic bu sinyalleri üretebilir.
Ete

bygece

tamam kullanabiliriz ama program nasıl olmalı devrede ne kullanmalıyız biraz arastırma yapmam lazım önce bişeydaha sorayım hocam pic ile frekans degiştirmemiz mümkünmü vhf bandında kısa aralıklı frekansı dip siviç ile falan degiştirmemiz mümkünmü acaba

ete

Bana olabilirmi diye sordun cevapladım. DTMFOUT diye bir komut var. İstediğin DTMF bilgisini verir. Onu kullanarak yapılabilir.
Frekans değiştirme işine cavap vermem mümkün değil. Ortada cevap verecek somut bir şey yok neye göre cvaplayayım bunu.
Pic ancak bu amaçla bir PLL entegresi kullanırsan onu kontrol ederek bu işi yapabilir.
Ete


bygece

#36
yok farklı bişey konuşmadık hocam zaten yani bişey istemedim sizden

aradıgım konulardan birine ulaştım sayılır pll vhf alcı devresi idi http://etepic.com/index.php?topic=234.0
bu konu iyi geldi ardından nette arastırırken bu konuya rastladım
http://www.picproje.org/index.php?topic=28581.0 bu konuda
bu kodla
'****************************************************************
'* Name : MB1502.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 02.01.2008 *
'* Version : 1.0 *
'* Notes :MB1502 PLL SÜRÜCÜ *
'* : *
'******************** TANIMLAR ******************************
Device=16F628A 'Alet PIC16F628A Olacak.
XTAL 4 '4 MHz lik kristal kullanılacak
Config INTRC_OSC_NOCLKOUT ,WDT_OFF , PWRTE_OFF , BODEN_OFF , LVP_OFF , CP_OFF , MCLRE_OFF
Declare LCD_DTPIN PORTB.4 'DATA girişi PORTB'nin 4. ucundan bağlayacak
Declare LCD_ENPIN PORTB.3 'LCD'nin ENable ucu
Declare LCD_RSPIN PORTB.2 'LCD'nin Register Select ucu
Declare LCD_INTERFACE 4 'LCD veri yolu 4 bit olacak
Declare LCD_LINES 2
'*********************** DEĞİŞKEN VE SABİTLER ******************
Dim AR As PORTA.3
Dim EK As PORTA.4
Dim TM As PORTB.1
Dim DTT As PORTA.0 'DATA Pin'i porta.0 ucunda.
Dim CL As PORTA.1 'clock Pin'i porta.1 ucunda.
Dim LE As PORTA.2 'Load Enable Pin'i porta.2 ucunda.
Dim REF As Word 'referens bölücü değişkeni 16 bittir.
Dim SW As Bit 'önbölücü değişkeni 1 bittir.
Dim N As Word 'N bölücü değişkeni word tipinde(16 Bit).
Dim A As Byte 'A bölücü değişkeni byte tipinde(8 Bit).
Dim TEMP As Float '"TEMP" değişkeni ondalıklı sayı
'*********************** AYARLAR ********************************
CMCON=7 'komperator Girişleri iptal. 
PORTB_PULLUPS=1 'portb dahili çekme dirençleri etkin. 
'*********************** GİRİŞ ÇIKIŞ AYARLARI *******************
TRISA=%11111000 'PortA'nın 0,1,2 no'lu pinleri çıkış,diğerleri giriş
TRISB=%00000011 'PortA'nın 0 ve 1 no'lu pinleri giriş, diğerleri çıkış
'******************* DEĞER ATAMASI ******************************
SW=1 'Prescaler değeri 64 seçildi.
'SW=0 'Prescaler değeri 128 seçildi.
REF=160 '4 MHz Xtal ile karşılaştırma frekansı 25 KHz seçildi.
'REF=400 '10 MHz Xtal ile karşılaştırma frekansı 25 KHz seçildi.
N=114 '184,625MHz frekansına göre "N" değeri
A=89 ''184,625MHz frekansına göre "A" değeri
'******************* PROGRAM ANA BÖLÜM ***************************
BASLA:
GoSub HESAP
GoSub GOSTER
GoSub GONDER
'DelayMS 100
GoTo BASLA
'************************* HESAP *********************************
HESAP:
TEMP=((64*N)+A)
TEMP=TEMP/40
Return
'************************* LCD ***********************************
GOSTER:
Print $FE,128,"FR=",DEC3 TEMP," MHz"
Print $FE,192,"N=",#N," , A=",#A
DelayMS 100
Return 
'******************* PLL ENTEGRESİNE VERİ GÖNDER (ara program) ****
GONDER:
DTT=0:CL=0:LE=0 'Data,clock ve enable pinlerini low yapalım.
SHOut DTT,CL,1,[SW\1,REF\13,1\1] 'sırasıyla belirtilen bit adedi kadar msb ilk olacak şekilde kaydır.
PulsOut LE,10
DelayMS 10 'ilk posta veri gönderimi tamamlandı.
SHOut DTT,CL,1,[N\11,A\7,0\1] 'ikinci posta veri kaydırılıyor.
PulsOut LE,10 'ikinci posta veri gönderimi tamamlandı.
DelayMS 10
DTT=%0:CL=%0:LE=%0 'Data,clock ve enable pinlerini tekrar low yapalım.(İşi garantiye bağlıyoruz.)
Return 'Geldiğin (çağrıldığın) yere geri dön.

End
173.900 bandında bir frekansa klitlenme yapılmış sanırım birde antrakın sitesinde pll kontrollu picle yapılmıs bir devre vardı alıcı devresi onu bulup çalışıp çalışmaycagını kontrol etmem lazım ama benim sordugum bu degildi

edit: buldum devreyi
http://antrak.org.tr/blog/dual-bant-vhf-al%C4%B1c%C4%B1/

bu devreyi yaptıgımda yukarıda verdgim kodla uyum saglarmı bilmiyorum denemek lazım


Ferdi20

Alıntı yapılan: ete - 07 Haziran 2016, 12:36:09O iki satır önemsiz. Birsi PORTA yı komple sıfırlıyor. Diğeri PORTB.0 pininden HIGH çıkartıyor.

Ama en önemlisi 4 digit şifre yerine 3 digit kullanman ve bunu en sonda söylemen.
Program 4 digiti tek tek isteyecek şekilde düzenlenmiş.
3 dgiti girdikten sonra 4 digit gelmesi için bir müddet bekliyor gelmemiş ise önceki girişlerini iptal edip yeniden şifre girmeye gidiyor. Senin sorunu burada.
Şayet 3 digit şifre ile çalışmak istiyorsan aşağıdaki değişikliği yapman gerekiyor;
Şu satırları bul;
DECODER3:	
            Q1=E1		
    		Q2=E2
    		Q3=E3
    		Q4=E4
     		c3 =  Q1 + 2*Q2 + 4*Q3 +  8*Q4 	
            GOTO DTMF4 
Bu satırlarda yer alan  GOTO DTMF4 komut satırını silip yerine, GOTO SIFRE yazman gerekiyor.
Bundan sonra sistem 3 digit ile çalışabilir. Zaten SİFRE kısmında 4. digit bölümünü çıkarmışsın sanırım.

Ete

Slm hocam konuyu hortlatıyorum kusura bakmayın bu devreyi birkaç yıl önce yaptım çalışıyor sorun yok ama bir komut daha eklemek istiyorum ama proğramdan pek anlamıyorum yardımınıza ihtiyacım var dtmf devresini vhf alıcı kartta kullanıyorum açma sinyali geliyor role çekiyor kapatma sinyali alamadığında role sürekli açık kalıyor bu hatayı düzeltmek istiyorum porta.0 yayın varken low olsa yayın kesilince high olunca 5 saniye sonra role kapansın istiyorum tabi kapatma şifresi alınca normal kapanacak ama olaki kapanmadı yayın kesilince otomatik 5 sn sonra kendi kapansın nasıl bir kod yazarız bi örnek verirmisiniz iyi geceler


Ferdi20

Slm hocam konuyu hortlatıyorum kusura bakmayın bu devreyi birkaç yıl önce yaptım çalışıyor sorun yok ama bir komut daha eklemek istiyorum ama proğramdan pek anlamıyorum yardımınıza ihtiyacım var dtmf devresini vhf alıcı kartta kullanıyorum açma sinyali geliyor role çekiyor kapatma sinyali alamadığında role sürekli açık kalıyor bu hatayı düzeltmek istiyorum porta.0 yayın varken low olsa yayın kesilince high olunca 5 saniye sonra role kapansın istiyorum tabi kapatma şifresi alınca normal kapanacak ama olaki kapanmadı yayın kesilince otomatik 5 sn sonra kendi kapansın nasıl bir kod yazarız bi örnek verirmisiniz iyi geceler

ete

İp ucun sanırım PORTA.0=1 olması. Bu durumda her bir kesmesi 500 ms olan TMR1 sayacı kesmesi kullanarak 10 defa kesme oluşturup dönersin.
Örnek aşağıda,
IF PORTA.0=1 THEN GOSUB SURE_SAY
...
...
..


SURE_SAY: 'BURADA 5 SN SAYACI İÇİN TİMER KULLANACAĞIM 4mHZ OSC FREKANSINA GÖRE ÖRNEK VERİYORUM
T1CON=%00110001 :KES=10 'her bir kesme 500ms olacağı için kes=10 aldık bu 5 sn edecek.
SURE_BIR:
           TMR1H=$0B:TMR1L=$DC:PIR1.0=0      
           while PIR1.0=0
           'BU ARAYA GEREKİRSE KONTROL EDECEĞİN BAZI KODLAR EKLEYEBİLİRSİN
           WEND 'KESME OLUŞUNCAYA KADAR BEKLE         
           KES=KES-1:IF KES>0 THEN SURE_BIR
           ROLE=0
           RETURN '5 SN DOLDU GERİ DÖN

ete

Ferdi20

#40
hocam beceremedim bi yardım ederseniz
@ DEVICE pic16F628A                                                   
@ DEVICE pic16F628A, WDT_OFF              
@ DEVICE pic16F628A, PWRT_ON 
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT              
@ DEVICE pic16F628A, PROTECT_ON         
  
  TRISB=%11111111
  TRISA=%00000000
  PORTA=0
  PORTB=0
  
  CMCON=7             
  
  STD var  PORTB.0    '1 STD  8870)TONE enable
  E1  var  PORTB.4    'Q1 du 8870
  E2  var  PORTB.3    'Q2 du 8870
  E3  var  PORTB.2    'Q3 du 8870
  E4  var  PORTB.1   'Q4 du 8870
 
  SIFRE_1 var  PORTA.2    ' 
  
  b1 VAR BYTE
  b2 VAR BYTE
  b3 VAR BYTE
  b1=0
  b2=0
  b3=0
      
  c1  var BYTE   '1° code DTMF
  c2  var BYTE   '2° code DTMF
  c3  var BYTE   '3° code DTMF
  c4  var BYTE   '4° code DTMF
  Q1  var BIT
  Q2  var BIT
  Q3  var BIT
  Q4  var BIT
 
BASLA:
DTMF1:    
            BUTTON STD,1,255,0,b1,1,DECODER1	
            PAUSE 20
    		BUTTON STD,0,255,0,b2,1,RAZ          
           	GOTO DTMF1
DECODER1:	
            Q1=E1		
    		Q2=E2
    		Q3=E3
    		Q4=E4
     		c1 =  Q1 + 2*Q2 + 4*Q3 +  8*Q4 	
            GOTO DTMF2
           
DTMF2: 	
            b3=0
            WHILE b3<75	
    		BUTTON STD,1,255,0,b1,1,DECODER2	
       	    PAUSE 20
        	b3=b3+1
            WEND
            GOTO DTMF1
DECODER2:	
            Q1=E1		
    		Q2=E2
    		Q3=E3
    		Q4=E4
     		c2 =  Q1 + 2*Q2 + 4*Q3 +  8*Q4 	
      	    GOTO DTMF3
        
DTMF3: 	
            b3=0
            WHILE b3<75	
    		BUTTON STD,1,255,0,b1,1,DECODER3	
         	PAUSE 20
	        b3=b3+1
            WEND
            GOTO DTMF1
DECODER3:	
            Q1=E1		
    		Q2=E2
    		Q3=E3
    		Q4=E4
     		c3 =  Q1 + 2*Q2 + 4*Q3 +  8*Q4 	
            GOTO DTMF4      	
            
DTMF4: 
            
			b3=0
            WHILE b3<75	
    		BUTTON STD,1,255,0,b1,1,DECODER4	
            PAUSE 20
 	        b3=b3+1
            WEND
            GOTO DTMF1
DECODER4:	
            Q1=E1		 
            Q2=E2
    		Q3=E3
    		Q4=E4
     		c4 =  Q1 + 2*Q2 + 4*Q3 +  8*Q4 	
 	        GOTO SIFRE
              
RAZ:  
	  
        	Q1=0
        	Q2=0
		    Q3=0
		    Q4=0
       	    GOTO DTMF1
            END
SIFRE:	
           PAUSE 10	
  	       IF c1=12 AND c2=3 AND c3=6 AND c4=3 THEN   
           SIFRE_1=1  
           ENDIF
           IF c1=12 AND c2=3 AND c3=6 AND c4=5 THEN   
           SIFRE_1=0
           ENDIF		   
	         
		  c1=0	
          c2=0
          c3=0
   	      c4=0
          GOTO DTMF1     
      
          IF PORTA.0=1 THEN GOSUB SURE_SAY

 
SURE_SAY: 'BURADA 5 SN SAYACI İÇİN TİMER KULLANACAĞIM 4mHZ OSC FREKANSINA GÖRE ÖRNEK VERİYORUM
T1CON=%00110001 :KES=10 'her bir kesme 500ms olacağı için kes=10 aldık bu 5 sn edecek.
SURE_BIR:
           TMR1H=$0B:TMR1L=$DC:PIR1.0=0      
           while PIR1.0=0
           'BU ARAYA GEREKİRSE KONTROL EDECEĞİN BAZI KODLAR EKLEYEBİLİRSİN
           WEND 'KESME OLUŞUNCAYA KADAR BEKLE         
           KES=KES-1:IF KES>0 THEN SURE_BIR
           ROLE=0
           RETURN '5 SN DOLDU GERİ DÖN

ete

#41
Alakasız bir yere koyulmuş gibi duruyor o yazdığın kodlar.
Aşağıdaki iki satıra dikkat et. Sifre etiketi altında yer alıyor bu satırlar.
              GOTO DTMF1     
          
              IF PORTA.0=1 THEN GOSUB SURE_SAY

Programlar satır takip eder. Sifre kısmına mı yazılması gerekiyor bu kodların emin değilim.
Program satır takip ederek GOTO DTMF1 komutuna gelir ve bu komutun emrettiği şekilde direk olarak DTMF1 etiketine atlar.
Bu durumda bu program hiç bir zaman bir sonraki satır olan IF PORTA.0=1 THEN GOSUB SURE_SAY
komut satırına gelmeyecek demektir. Nasıl çalışsın bu durumda senin süre saydırma komutların???
Elbette çalışmayacaktır.
Burada kritik nokta IF PORTA.0=1 ile başlayan komut satırının nereye yerleştirileceğidir.
Ben bu programa hakim değilim. Dolayısıyla nereye koyulacağına karar veremem.
PORTA.0=1 olma ihtimali ne zaman başlıyor yada hangi konumda başlıyor o noktayı bul ve oraya yerleştir sistem çalışacaktır.
Şayet şifre girişinin yapıldığı yerde bu iş olacak ise o zaman en azından IF PORTA.0=1 diye başlayan satırı, GOTO DTMF1 satırından bir evvelki konuma yaz o zaman çalışır o kodlar

Ete


Ferdi20

uzun uğraşlar sonucu acemice şu kodlarla istediğim sonuca ulaştım hocam
DTMF1:    
            IF PORTA.1=1 THEN GOTO saniye

saniye:
         For elektroinfo=1 TO 50 step 1 'SQL zamanı 5 saniye sessizse kapat.
         Pause 100                    
                                 
         if porta.1=0 then goto basla  'Kontrol edilen pin.   
         Next 

         SIFRE_1=0  
         GoTo DTMF1

Powered by EzPortal