avatar_elektro77

Kesmeden çıkmıyor.

Başlatan elektro77, 16 Aralık 2016, 00:25:11

elektro77

Aşağıdaki proton kodlarını pic basic prodan usart kullanımından uyarlayarak yaptım. Simülasyonda kesmeden çıkmadığını zannediyorum. Verici kodları pbp dir. Alıcı kodları protondur. glcd kullanım kolaylığı için protonu seçtim. Projem bittiğinde grafik lcdli olacak.
Vericideki tuşa bastığımda kesme etiketinin altındaki led toggle oluyor fakat tekrar bastığımda veya vericideki diğer tuşa bastığımda led tekrar konum değiştirmiyor. Nerede ne yanlışım var  Proton bilen üstatlarım  bakabilir mi. ve sigorta ayarlarındaki wdt yi on mu yoksa of mu yapmalıyım. çünkü wdt yi on yaparsan vericideki her iki tuştan birine bastığımda alıcıdaki led konum değiştirip 1 veya 2 saniye sonra tekrar eski konumuna dönüyor. Verici osc 4mhz 628A dir. Alıcı osc ise 8Mhz 877A dır. Simülasyon ektedir. Ekin içinde ete hocamın derlediği ve çalışan vericisi de alıcısı da pbp ile yazılmış örnek vardır. Ben buradan uyarlamaya çalıştım.
alıcı
Device = 16F877A
Config HS_OSC,WDT_OFF,PWRTE_ON,BODEN_OFF,LVP_OFF
'''config _BODEN_OFF  & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _HS_OSC
Xtal = 8
TRISA=%00000001
TRISB=0
TRISC=%10000000
TRISD=%00000000
TRISE=0
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0
CMCON=7
ADCON1 = 7
INTCON=%11000000
OPTION_REG.7=1
'---------------------------------------------------------------------------
All_Digital= TRUE                  'ADC PORTLARININ TAMAMI DİJİTAL GİRİŞ VEYA ÇIKIŞ
LCD_DTPort = PORTB                 'GLCD DATA PORTLARI PORTB'YE BAĞLI
LCD_RSPin = PORTC.5                'GLCD RS PİNİ PORTC.5 BAĞLI
LCD_ENPin = PORTC.1                'GLCD ENABLE PİNİ PORTC.1 BAĞLI
LCD_RWPin = PORTC.4                'GLCD RW PİNİ PORTC.4 BAĞLI
LCD_CS1Pin = PORTC.2               'GLCD CS1 PİNİ PORTC.2 BAĞLI
LCD_CS2Pin = PORTC.3               'GLCD CS2 PİNİ PORTC.3 BAĞLI
LCD_Type =  GRAPHIC                'GLCD TİPİ GRAFİK KS0108 128*64B WİNSTAR
Declare LCD_CommandUs 1
Declare LCD_DataUs 1
Declare GLCD_STROBE_DELAY 10
Internal_Font = On                 
Font_Addr = 0
GLCD_EXTERNAL_PRINT = PPRINT
'------------------------------------------------
'HSERIAL_BAUD = 9600        ' Set baud rate to 9600
'HSERIAL_RCSTA = %10010000  ' Enable serial port and continuous receive
'HSERIAL_TXSTA = %00100000  ' Enable transmit and asynchronous mode
'HSERIAL_CLEAR = ON         ' Optionally clear the buffer before receiving

'DECLARE HSERIAL_BAUD 9600
'DECLARE HSERIAL_RCSTA 144
'DECLARE HSERIAL_TXSTA 32
'DECLARE HSERIAL_CLEAR ON

Declare HSER_RCSTA 90h ' Enable serial port & continuous receive
Declare HSER_TXSTA 20h ' Enable transmit, BRGH = 1
Declare HSER_SPBRG 12  ' 9600 Baud @ 8MHz, 0,16%
Declare HSER_CLROERR 1 ' Clear overflow automatically
'-------------------------------------------------------------------------------
Symbol LED   = PORTD.1
Symbol SES1  = PORTA.2
Symbol LOGIC = PORTA.3
Dim TEMP   As Byte
Dim BILGI  As Byte
BILGI=0

Symbol GIE  =INTCON.7   'genel interruptları açıyor
Symbol PEIE =INTCON.6   'peripheralinterruptları açıyor
Symbol RCIE =PIE1.5     'USART Recive interrupt enable bit
Symbol RCIF =PIR1.5     'USART Receive interrupt flag bit

'-------------------------------------------------    
RCIE=1
PEIE=1
GIE=1
On Interrupt GoTo INT
BASLA:
If BILGI=1   Then  LOGIC=1
If BILGI=101 Then  LOGIC=0             

GoTo BASLA

Disable
INT:
Toggle LED
    GIE=0
    HSerIn [Wait("$UM"),BILGI]
    TEMP=RCREG
    GIE=1
    Resume
    Enable
    End


verici
'@ __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOU
@ DEVICE pic16F628A
@ DEVICE pic16F628A, WDT_ON
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16F628A, MCLR_OFF
@ DEVICE pic16F628A, XT_OSC
@ DEVICE pic16F628A, BOD_ON
'@ DEVICE pic16F628A, BOREN_ON
'@ DEVICE pic16F628A, CP_ON
@ DEVICE pic16F628A, LVP_OFF
'@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT
cmcon=7
DEFINE OSC 4
CMCON=7
PORTA=0:portb=0
TRISB=0   
TRISA=%00011100
' -------------- haberlesme define
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 4MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

VERICI VAR BYTE
VERICI=0
symbol LED   =PORTb.0
symbol tus1  =PORTA.2
Symbol tus2  =PORTA.3
SYMBOL SETPIN=PORTA.0
SYMBOL ENPIN =PORTA.1

BASLA:
SETPIN=1
ENPIN=1

        IF tus1=1 THEN 
          VERICI=1
          GOSUB GONDER
          WHILE TUS1=1:WEND
          PAUSE 100
        ENDIF

        IF tus2=1 THEN   
          VERICI=101
          GOSUB GONDER
          WHILE TUS2=1:WEND
          PAUSE 100
        ENDIF
   
        GOTO BASLA

gonder:
toggle led
       HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]'uyandirma sinyali preambl
       HSEROUT ["$","U","M",VERICI,13]
       HSEROUT ["$","U","M",VERICI,13]
       HSEROUT ["$","U","M",VERICI,13]
       return
"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"

Hattuşa

sizin için bir isis şeması ve kod yazayım bitince eklerim

elektro77

"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"

Hattuşa

slm Elektro77 usta;
sizin için hazırladığım isis simüle ve bas dosyaları ektedir, umarım işinize yarar

elektro77

Çok teşekkür ederim ama beni yanlış anlamışsınız. Verici 16f628   alıcı16f877 olmalıydı.
Ayrıca ısıs açılmıyor ve pc yi kitliyor. 64 bit mi kullanıyorsunuz.
Sadece alıcı kodlarını düzenleyiverseydiniz daha hora geçerdi.
Yazdıklarınızdan hiçbir şey anlayamadım.
Yeni öğrenen birine göre karmakarışık.
Çok özür dilerim.
"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"

elektro77

sizden bir şey isteyebilirmiyim pro-TR
elinizde protonun çalışan bir versiyonu varmı. 32bit
Ben flaşh diskte çalışanını kullanıyorum fakat bazı kısıtlamalar var.
"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"

İlyas KAYA

Kesme rutinine pek dikkat etmedim ama ilk gördüğüm olası sorunları düzeltip ekledim. ,Böyle bir deneyin.
WDT Yi açınca resetliyor demişsiniz. Bu aklıma ilk olarak taşmayı getirdi. Bir döngü içinde hiç bekleme yapılmaz ise WDT devreye girer. Bu nenden ile bir döngüde küçükde olsa bir bekleme vermek gerekir.
Örneğin;

BAS:

goto BAS

Böyle bir döngüde WDT açık ise PIC resetleyecektir.

Ayrıca data alınmadığı sürece HSERIN komutunda program kalır. Aynı şekilde SERIN , SERIN2,DEBUGIN komutlarında benzer şekilde dir.

Eğer bir zaman ve etiket verir isek ve bu süre içerisinde veri alınmaz ise belirtilen etiketten belirtilen sürede devam eder.
Deneyin bakalım neler olacak.


Device = 16F877A
Config HS_OSC,WDT_OFF,PWRTE_ON,BODEN_OFF,LVP_OFF
'''config _BODEN_OFF  & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _HS_OSC
Xtal = 8
TRISA=%00000001
TRISB=0
TRISC=%10000000
TRISD=%00000000
TRISE=0
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0
CMCON=7
ADCON1 = 7
INTCON=%11000000
OPTION_REG.7=1
'---------------------------------------------------------------------------
All_Digital= TRUE                  'ADC PORTLARININ TAMAMI DİJİTAL GİRİŞ VEYA ÇIKIŞ
LCD_DTPort = PORTB                 'GLCD DATA PORTLARI PORTB'YE BAĞLI
LCD_RSPin = PORTC.5                'GLCD RS PİNİ PORTC.5 BAĞLI
LCD_ENPin = PORTC.1                'GLCD ENABLE PİNİ PORTC.1 BAĞLI
LCD_RWPin = PORTC.4                'GLCD RW PİNİ PORTC.4 BAĞLI
LCD_CS1Pin = PORTC.2               'GLCD CS1 PİNİ PORTC.2 BAĞLI
LCD_CS2Pin = PORTC.3               'GLCD CS2 PİNİ PORTC.3 BAĞLI
LCD_Type =  GRAPHIC                'GLCD TİPİ GRAFİK KS0108 128*64B WİNSTAR
Declare LCD_CommandUs 1
Declare LCD_DataUs 1
Declare GLCD_STROBE_DELAY 10
Internal_Font = On                 
Font_Addr = 0
GLCD_EXTERNAL_PRINT = PPRINT
'------------------------------------------------
'HSERIAL_BAUD = 9600        ' Set baud rate to 9600
'HSERIAL_RCSTA = %10010000  ' Enable serial port and continuous receive
'HSERIAL_TXSTA = %00100000  ' Enable transmit and asynchronous mode
'HSERIAL_CLEAR = ON         ' Optionally clear the buffer before receiving

'DECLARE HSERIAL_BAUD 9600
'DECLARE HSERIAL_RCSTA 144
'DECLARE HSERIAL_TXSTA 32
'DECLARE HSERIAL_CLEAR ON

Declare HSER_RCSTA 90h ' Enable serial port & continuous receive
Declare HSER_TXSTA 20h ' Enable transmit, BRGH = 1
Declare HSER_SPBRG 12  ' 9600 Baud @ 8MHz, 0,16%
Declare HSER_CLROERR 1 ' Clear overflow automatically
'-------------------------------------------------------------------------------
Symbol LED   = PORTD.1
Symbol SES1  = PORTA.2
Symbol LOGIC = PORTA.3
Dim TEMP   As Byte
Dim BILGI  As Byte
BILGI=0

Symbol GIE  =INTCON.7   'genel interruptları açıyor
Symbol PEIE =INTCON.6   'peripheralinterruptları açıyor
Symbol RCIE =PIE1.5     'USART Recive interrupt enable bit
Symbol RCIF =PIR1.5     'USART Receive interrupt flag bit

'-------------------------------------------------    
RCIE=1
PEIE=1
GIE=1
On Interrupt GoTo INT
BASLA:
If BILGI=1   Then  LOGIC=1
If BILGI=101 Then  LOGIC=0             

pause 10

GoTo BASLA

Disable
INT:
Toggle LED
    GIE=0
    HSerIn 100,devam, [Wait("$UM"),BILGI]
devam:   
TEMP=RCREG
    GIE=1
    Resume
    Enable
   

End
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

elektro77

çok teşekkür ederim İlyas bey şu an çalışıyor. Emeğinize sağlık.
fakat IF BILGI=1 THEN logıc=1 şartını neden yerine getirmiyor olabilir.
"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"

Hattuşa

#8
Alıntı yapılan: elektro77 - 16 Aralık 2016, 02:29:45
Çok teşekkür ederim ama beni yanlış anlamışsınız. Verici 16f628   alıcı16f877 olmalıydı.
Ayrıca ısıs açılmıyor ve pc yi kitliyor. 64 bit mi kullanıyorsunuz.
Sadece alıcı kodlarını düzenleyiverseydiniz daha hora geçerdi.
Yazdıklarınızdan hiçbir şey anlayamadım.
Yeni öğrenen birine göre karmakarışık.
Çok özür dilerim.

elektro usta pc 64 bit isisin açmaması bu yüzdendir. verici yada alıcının hangisi olduğu önemli değil, eğer siz vermiş olduğum isisi açmış olsaydınız hem 628a nın hemde 877A nın hem alıcı hem verici olarak çalıştığını görmüş olacaktınız. o şemada yaptığım 877A ile okuduğum adc değerini 628A daki 16x2 ekranında gösterirken, 628A daki word tipi değişkeni 877A daki grafik ekranda, 877a daki word tipi değişkenide 628A daki lcd de görmüş olacaktınız.

şöyle yapabiliriz. isis şemanın jpg dosyasını buradan ekleyeyim sizde o şemayı kendi versiyonunuza uygun isise göre tekrar çizip verdiğim bas ve hex dosyalarını simüle edebilirsiniz. yazdığım kod oldukça basit elbette ki anlamadığınız yerler olabilir. onlarıda buradan sorarsanız cevaplarız.

elektro77

Hocam anlattıklarınız kulağa çok hoş geliyor. Çok memnun olurum. Saygılarımla.
"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"

elektro77

sayın pro TR benim kodlardaki alıcıda ki ıf şartını yerine getirmiyor neden olabilir bi bakabilirmisiniz.
"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"

Hattuşa

#11
Alıntı yapılan: elektro77 - 16 Aralık 2016, 03:08:51
sayın pro TR benim kodlardaki alıcıda ki ıf şartını yerine getirmiyor neden olabilir bi bakabilirmisiniz.


elektro usta;
alıcıdaki kodları inceledim. şimdi protonda iki tip kesme vardır.bunlar hardware kesmesi ve software kesmesidir. software kesmesi zaman zaman oluşmayabilir. size yazdığım örnekte hardware kesmesidir ki hata oranı diğerine göre düşüktür. protonda neden iki tip kesme var derseniz aynı kodda birden fazla kesme etiketi oluşturmada kullanılmak içindir. bence hardware kesmesi kullanmanız gerekir.

INT:
Toggle LED
    GIE=0
    HSerIn [Wait("$UM"),BILGI]
    TEMP=RCREG
    GIE=1
    Resume
    Enable



burada kulandığınız Hserin komutunun bekleme süresi kısıtlı değil bu nedenle hserin komutu işlemeye başladığı zaman işlemci bir kesmeye girip hserinde takılabilir. makul bir değerde bekleme yapmanız iyi olacaktır. kodu şu şekilde yaparsanız daha sağlıklı çalışır.

INT:
Toggle LED
    GIE=0
    HSerIn 100,atla,[Wait("$UM"),BILGI]

  atla:
    TEMP=RCREG
    GIE=1
    Resume
    Enable


yani usarttan bilgi alma işlemini 100 ms süreyle bekle eğer alınan data hala ulaşmadıysa atla etiketine git. bu arada vericide neden 2-3 kez datayı yollarız? oluşan data alım hatalarını gidermek için. alıcıda ki alma hatalarını da giderebilmek için alınan dataların data alma beklemesini kısıtlamalıyız ki programımız çakmasın.


birde  ;
gonder:
toggle led
       HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]'uyandirma sinyali preambl
       HSEROUT ["$","U","M",VERICI,13]
       HSEROUT ["$","U","M",VERICI,13]
       HSEROUT ["$","U","M",VERICI,13]
       return


verici datasından sonra 13 rakamını yollamışsınız. peki alıcıda bu 13 rakamının karşılığı varmı? yani vericiden şifre haric 2 data yollarken alıcıdan neden tek data okuması yapıyorsunuz?

son olarakta ve en önemlisi;

Declare HSER_RCSTA 90h ' Enable serial port & continuous receive
Declare HSER_TXSTA 20h ' Enable transmit, BRGH = 1
Declare HSER_SPBRG 12  ' 9600 Baud @ 8MHz, 0,16%
Declare HSER_CLROERR 1 ' Clear overflow automatically


Declare HSER_SPBRG 12  ' de değer 12 değil 51 olması lazım. spbrg calcilator kullanmıyormusunuz? o hesaplayıcıda BRGH =1 ise SPBRG =51 olmalı
bu şekilde düzeltmeleri yaparsanız çalışmaması için hiç bir neden olmaması lazım


sonuç olarak;
BASLA:
If BILGI=1   Then  LOGIC=1
If BILGI=101 Then  LOGIC=0             

GoTo BASLA


if kıomutunda BILGI değişkenine usarttan bir bilgi ulaşmadığı için çallışmıyor. yani ana döngüde hata yok belki daha farklı yazılabilirdi ama bu şekilde hatalı değil. Ve sorunu arayacağımız yer. usart ve onun configrasyonudur

kolay gelsin....


elektro77

#12
sayın Pro_tr
gönderdiğiniz örneği  ısıs 32 bitte düzenledim fakat aşağıdaki hatayı veriyor.
"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"

Hattuşa

elektron ustam isis neden hata verdi bilmiyorum. bendeki simülasyon çalışıyor. size yazdığım son iletideki konulara dikkat ettinizmi yani o şekilde düzelmedi mi

https://youtu.be/cm0NspvzbZU

elektro77

"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