Portb.0 kesmesinde hata nerde ?

Başlatan solidus, 30 Ağustos 2009, 14:42:23

Ruzgarbey

dosyayı indirdim ama açamadım benim isiste belki yüksek versiyon kullanmadığımdandır bilemiyorum.kodlarda nasıl bir sorun yaşadıınızı yazabilirmisiniz.16f876 nın tmr0 kesmesinin hangi bitte olduğunu bilmiyorum.bunu datasheetine bakarak intconda set ediniz.belkide yanlıs biti set ettiğimizden tmr0 kesmesini çalıştıramamısızdır.saygılarımla..
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

solidus

kullandığım proteus versiyonu 7.4sp.3 sorun ise portc.1 e bağlı led simülasyon başlar başlamaz yanıyor 2 sn içinde 1600-1700 arası uyarı geliyor.Hata 0x0053 satırında.
"Stack underflow executing CALL instruction." ve
"Stack underflow executing RETURN instruction." :(
Kimine göre kralım kimine göre yalanım… Herkes rahatına baksın, ben adamına göre adamım..

ilker_32

Bende kendime göre bazı değişikler yaptım. Yeni dosyaları BURADAN indir. Kendine iyi bak Esenciğim, esen kal.  :lol:

'*******************************************************************************
@ DEVICE pic16F876A              ' System Device	
@ DEVICE pic16F876A, WDT_OFF      ' Watchdog Timer
@ DEVICE pic16F876A, PWRT_OFF     ' Power-On Timer
@ DEVICE pic16F876A, BOD_ON      ' Brown-Out Detect
@ DEVICE pic16F876A, LVP_OFF     ' Low-Voltage Programming
@ DEVICE pic16F876A, CPD_OFF     ' Data Memory Code Protect
@ DEVICE pic16F876A, PROTECT_OFF ' Program Code Protection
@ DEVICE pic16F876A, XT_OSC
'*******************************************************************************
Define LCD_DREG      PORTC ' LCD data portunu belirle 
Define LCD_DBIT      4 ' 4 bit'lik veri yolu 
Define LCD_RSREG     PORTC ' LCD register seçme portunu belirle 
Define LCD_RSBIT     2 ' LCD register seçme bitini belirle 
Define LCD_EREG      PORTC ' LCD enable portunu belirle 
Define LCD_EBIT      3 ' LCD enable bitini belirle 
Define LCD_LINES     2 ' LCD'deki satir sayisi
'*******************************************************************************
TRISB=%00001111 : PORTB=0
TRISC=%00000000 : PORTC=0
'*******************************************************************************
ON INTERRUPT GOTO KESME
'*******************************************************************************
OPTION_REG=%10000101   	 
INTCON=%10100000  		 
TMR0=0
'*******************************************************************************
SYMBOL BUTON = PORTB.0
SYMBOL LED = PORTB.7
'*******************************************************************************
SAYAC VAR BYTE
SANIYE VAR BYTE
'*******************************************************************************
CLEAR
'*******************************************************************************  
PAUSE 200
LCDOUT $FE,1
LOW PORTC.1
'*******************************************************************************
SANIYE=0
'******************************************************************************* 
BASLA:
IF BUTON=1 THEN HIGH LED
LCDOUT $FE,$80,"MERHABA"
LCDOUT $FE,$C0,"KESME ILE LCD"
LCDOUT $FE,$94,"AYDINLATIYORUZ"
GOTO BASLA
'*******************************************************************************
DISABLE
KESME:
SAYAC=SAYAC+1  	    
IF SAYAC=61 then  	    
SAYAC=0
SANIYE=SANIYE+1
IF SANIYE=8 THEN ' *****8 SANİYE SONRA ARKA AYDINLATMA SÖNER VE SÜREYİ BURADAN AYARLAYABİLİRSİN*****
PAUSE 5
LOW LED
SANIYE=0
ENDIF
ENDIF
INTCON.2=0        
RESUME
ENABLE
'*******************************************************************************
END
'*******************************************************************************

ilker,

Ruzgarbey

sevgili ilker.sizin kodunuzda eksiklik var.yani yanlış değil şu şekilde.aydınlatmanın rb0 kesmesi oluştuğunda yapılması isteniyor.oysa sizin kodunuzda tmr0 devamlı aktif olduğu için her 8 saniyede bir ledi yakıyor vss.dünkü eklediğiğm kodun çalışmamasının sebebi tmr0 bitini set edemediğimizdendir.
OPTION_REG=%10000101      
INTCON=%10100000  evet incon.2 =1 olursa tmr0 aktif oluyor.ben dünki kodda çevresel kesmeyi aktifleştirmişim.sevgili arkadaşım kodu birde bu şekilde dene.
olmazsa intconda   %10110000  rb0 kesmesinide aktifleştirip başka bişi denyelim.saygılarımla..
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

serdararikan

arkadaşım hiç uğraşma PAUSE ile falan. timer0 veya timer1 i kur keyfine bak.

Ruzgarbey

Alıntı yapılan: "serdararikan"arkadaşım hiç uğraşma PAUSE ile falan. timer0 veya timer1 i kur keyfine bak.
sadece mesaj yazmak için yazılanlara acayip bir şekilde sinir olmaktayım.nedir bu cevap anlamı nedir.?bu konuyu açan arkadaşımıza ne gibi bir faydası olur.yukarıya doğru 4-5 cevabı okurmusun acaba orada neler yazılmıs ve ne yapılmaya çalışılmaktadır.arkadaşlar lütfen sadece gönderilen mesaj sayısını artırabilmek için cevap yazıp konuyu dağıtmayalım.saygılarımla..
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

Ruzgarbey

tekrar merhaba.16f8xx datasheetiniinceledim.yazılan kodlarda zaten RB0 kesmesinin aktif edilmediğini gördüm.timer ve rb0 kesmesinde kontrol sorunu var.yani rb0 kesmesi oluştuğunda kontrol edilebilecek bir flag bulamadım.o yüzden yine botunları rb0 veya herhangi bir pine bağlayıp tmr0 kesmesini programın basından aktif edip devamlı çalıştıracağız.tmr0 kesmesi devamlı aktif olacağı için butonları bağladığımız pini devamlı olarak kontrol edeceğiz.şimdi kodları yazıyorum.

ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
INTCON = %10100000
OPTION_REG=%00010101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.
TMR0=0   
SYMBOL BUTON=PORTB.O



DISABLE
KESME:
if BUTON=1 then 'BUTONA BASILDIMI
z=1 ' rb0 kesmesi oluşmussa
WHILE BUTON=1 :WEND  ' BUTONUN BIRAKILMASI BEKLENIYOR
Led_isik=0 ' her Rb0 kesmesinde Sayacı sıfırla ve 8sn yan
SAYAC=0
Lcdk=0
endif
if z=1 then
if Lcdk=0 then 'Işık daha önce yakıldımı?
LCD_Led=1 ' Aydınlatmayı Yak
Lcdk=1
endif
SAYAC=SAYAC+1 ' rb0 kesmesi oluştuğunda saymaya başla
if SAYAC=61 then ' sayac 61 olduğunda 1 sn
SAYAC=0
Led_isik= Led_isik +1
endif
if Led_isik=8 then ' bu süre içinde başka BUTONA BASILMADI İSE
LCD_LED=0  'IŞIĞI SÖNDÜR.
Led_isik=0
SAYAC=0
Z=0
Lcdk=0
endif
endif
RESUME
ENABLE


umarım kodlar işine yarar.çalışmaması için hiçbir neden bulunmamaktadır.saygılarımla..
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

baddog777

yanlıs bilmiyorsam eger hatam varsa duzeltın lutfen! microbasıc de hardware kesme kullanamıyoruz, proton da bu mumkun. hardware kesme olmadıgı ıcın pause pauseus vb komutlar bıtmeden once  kesınlıkle kesme olusmuyor, mıcrobasıc de software kesme tanımlanabiliyor sadece!..
proton'da hardware interrupt kullanıp kesme ıcınde  bır degıskene 1 degerı verıp kesme dısında soyle bır code ıle ısın gorulebılır..

if kesmevar=1 then
led=1
delayms 1000 ' 1 saniye bekle
led=0
endif

seklınde yaptıgında 1 sanıye dolmadan bile led acıkken yenıden kesme olusması mumkun! proton ıcın gecerlı bu!

RB0 için kesme ornek olarak! 1 yada 0 degerıne gore kesme gerceklesmesı için!

TRISB=%00000000
ON_hardware_interrupt kesme
OPTION_REG.6=1' yukselen kenar ise kes!
OPTION_REG.7=1
INTCON=%10010000
TRISB=%00000001
CMCON=7

solidus

Merhaba,
Devremiz bu: [/URL][/img]
@ilker, kodda sorun var stack hatası yok ama lamba yanmıyor. Şemayı incelermisin ?
@Ruzgarbey,Lamba yanıyor ama ağır şekilde stack hatası var 3 sn simülasyonda 5000 üzerinde hata veriyor..

Arkadaşlar kodlar kesmeden çıkarken hata verdiriyor galiba.. Datasheet den anladığım kadarıyla biz portb.0 kesmesini aktiflemiyoruz. Sorun bu olabilirmi ?
Kimine göre kralım kimine göre yalanım… Herkes rahatına baksın, ben adamına göre adamım..

ilker_32

Sanırım okumadan gitmişsin. Sana verdiğim kodların hemen üzerinde dosyaların linki vardı. Onu görmedin herhalde,

Senin şemanda,

1)pull-up dirençleri yok.
2)led'i RB7'ye koydum.

Not : Lcd'nin RW pinini RC1'e koydum. Böylece zamanlamayı daha iyi ayarlarsın.

Şema aşağıdadır.


Kodları kendi şemana göre değiştirmek istiyorsan 5 saniyeni alır.

baddog777



proton basic için codu bu sekılde dene,
iki tip kesmemız var, bırıncısı hangı butona basarısek led yanması ıcın, dıgerı de bellı bır sure sonra ledin kapanması ıcın tmr0 kesmesi , microda olurmu bılmıyorum, kex kodunuda ekde verıyorum..
sayac degerını rasgele 5000 yaptım kac sanıye surer bılmıyorum hesaplamadım xtal 4 ve prescala 1/64 için hesaplaman gerek..
linkde proteus cızımı ve derlenmıs hex varr
http://s2.dosya.tc/lcdaydnlat.rar.html


       Device 16F876
        Config WDT_OFF ' watch dog off
		LCD_DTPIN = PORTC.7	
		LCD_RSPIN = PORTC.2
		LCD_ENPIN = PORTC.3
		LCD_INTERFACE = 4	' 4-bit Interface
		LCD_LINES = 2
		LCD_TYPE = 0
		LCD_COMMANDUS = 2000
		LCD_DATAUS = 50
       Dim sayac As Word
       Dim kesmevar As Byte
        XTAL 4

TRISC=%00000000
ON_hardware_interrupt GoTo kesme 
OPTION_REG.6=1 ' yukselen kenar ise kes
OPTION_REG.7=1 ' direncler iptal

''''' tmr için ksme tanımı
OPTION_REG.5=0 ' dahili osc
OPTION_REG.1=1  '
OPTION_REG.2=0'
OPTION_REG.3=1   ' son 3 bit 101   bolme 1/64

'INTCON=%10010000 sadece rbo için
INTCON=%10110000  ' 6 nci bit 1 tmr kesme ıcın
INTCON.5=1 ' tmr0 aktif
TMR0=0
TRISB=%00001111
sayac=0

 DelayMS 500
LCDOUT $FE,$80,"Lcd Acildi"
basla:
DelayMS 200

GoTo basla
Disable
kesme:
Context SAVE
If INTCON.1=0 And kesmevar=1 Then  ' kesme tmro dan olduysa ve daha once led acıldıysa led kapat
sayac=sayac+1
If sayac=5000 Then 
PORTC.1=0
LCDOUT $FE,1
TMR0=0
sayac=0
kesmevar=0
EndIf
EndIf
If INTCON.2=0 Then ' kesme rbo dan olduysa
LCDOUT $FE,$80,"kesme var"
PORTC.1=1
kesmevar=1
EndIf
INTCON.1=0
INTCON.2=0

Context Restore
Enable



hex codu::
:10000000000000308A00A228FF0003088301FE00E0
:100010000408FC000A08FD0000308A00CD28AC006E
:10002000871107118316871107110F308705831277
:100030002C08A01839283E30A600803089203330A3
:10004000AB004D201330A600883089204D2064304D
:1000500088204D20643088202230AB004D2028308D
:1000600038200C30382006303820A0142C083928CD
:100070002014AB00201C47280711033C031C4C280C
:100080004C200730A600D03089200314080020142B
:10009000FE3C03195A280715201C201087150F3025
:1000A00087052B08F03987048711AB0E20184D28DF
:1000B000323088202C089D28A11B0F280800A3009F
:1000C000A201230803178D000313240803178F00D0
:1000D000722003199D285C20A30A0319A40AA20F09
:1000E00061289D28831603178C170C14000000004C
:1000F00083120C089D28A801A700FF30A707031C46
:10010000A807031C9D280330A600DF3089207D2826
:10011000A601E83EA500A609FC30031C9228A5070D
:1001200003188F28A5070000A60F8F2825189828E8
:10013000A51C9C2800009C2808008313831203132D
:1001400000000800A00183168701011781178112A2
:10015000811401118115B0308B008B16831281013F
:100160000F30831686008312B001AF010130A80062
:10017000F4308A017C20FE308A010F2080308A0111
:100180000F208030A1000130A40011308A015F20CF
:10019000C8308A017B208A01C82801308B180301EE
:1001A000AE00013031020130031D00302E058A11EE
:1001B0000A120319F228AF0A0319B00A3008133AD9
:1001C000883003192F068A110A12031DF22887109E
:1001D000FE308A010F2001308A010F208101B00119
:1001E000AF01B1018A110A120B190629FE308A01EA
:1001F0000F2080308A010F208030A1000130A40040
:100200001C308A015F2087140130B1008B100B1164
:100210007D088A007C0884007E088300FF0E7F0E24
:1002200009004C0063006400200041006300690085
:100230006C006400690000006B00650073006D00D5
:0C024000650020007600610072000000E4
:02400E00FB3F76
:00000001FF

baddog777

hatta kesme içini su sekilde duzenlersen led yanık kaldıgı sure zarfında rb0 kesmesıne ıhtıyac duymayacagın ıcın kesme cakısması yasamazsın :) dıgerınde ara ara tusa basınca led yanmıyordu bu sekılde sorun yok

kesme:
Context SAVE
If kesmevar=1 Then  ' kesme tmro dan olduysa ve daha once led acıldıysa led kapat
sayac=sayac+1
If sayac=10000 Then 
Low PORTC.1
LCDOUT $FE,1
TMR0=0
sayac=0
kesmevar=0
INTCON.1=0
EndIf
EndIf
If kesmevar=0 And INTCON.1=1 Then ' kesme rbo dan olduysa ve led kapalıysa
LCDOUT $FE,$80,"kesme var"
High PORTC.1
kesmevar=1
EndIf
INTCON.2=0
Context Restore
Enable


hex...
:10000000000000308A00A228FF0003088301FE00E0
:100010000408FC000A08FD0000308A00CD28AC006E
:10002000871107118316871107110F308705831277
:100030002C08A01839283E30A600803089203330A3
:10004000AB004D201330A600883089204D2064304D
:1000500088204D20643088202230AB004D2028308D
:1000600038200C30382006303820A0142C083928CD
:100070002014AB00201C47280711033C031C4C280C
:100080004C200730A600D03089200314080020142B
:10009000FE3C03195A280715201C201087150F3025
:1000A00087052B08F03987048711AB0E20184D28DF
:1000B000323088202C089D28A11B0F280800A3009F
:1000C000A201230803178D000313240803178F00D0
:1000D000722003199D285C20A30A0319A40AA20F09
:1000E00061289D28831603178C170C14000000004C
:1000F00083120C089D28A801A700FF30A707031C46
:10010000A807031C9D280330A600DF3089207D2826
:10011000A601E83EA500A609FC30031C9228A5070D
:1001200003188F28A5070000A60F8F2825189828E8
:10013000A51C9C2800009C2808008313831203132D
:1001400000000800A00183168701011781178112A2
:10015000811401118115B0308B008B16831281013F
:100160000F30831686008312B001AF010130A80062
:10017000F4308A017C20FE308A010F2080308A0111
:100180000F208030A1000130A40018308A015F20C8
:10019000C8308A017B208A01C828013031028A11C7
:1001A0000A12031DEE28AF0A0319B00A3008753A87
:1001B000303003192F068A110A12031DEE28831608
:1001C000871083128710FE308A010F2001308A01C8
:1001D0000F208101B001AF01B1018B100130B108D6
:1001E000031D0030AE0003018B1801302E058A116B
:1001F0000A1203190E29FE308A010F2080308A016D
:100200000F208030A1000130A40023308A015F203C
:1002100083168710831287140130B1000B117D08FB
:100220008A007C0884007E088300FF0E7F0E090090
:100230004C006300640020004100630069006C0012
:100240006400690000006B00650073006D006500CC
:0A025000200076006100720000003B
:02400E00FB3F76
:00000001FF

solidus

@ilker_32 ve @baddog777 ilginize teşekkür ederim. iki kodda çalışıyor.
Kimine göre kralım kimine göre yalanım… Herkes rahatına baksın, ben adamına göre adamım..