avatar_Hattuşa

RB0 KESMESI (YARDIM)

Başlatan Hattuşa, 28 Mart 2013, 23:09:42

Hattuşa

SLM USTA ARKADAŞLAR,
şöyle bir çalışma yapmak istedim, harici bir pulse kaynağından (ortalama 300 hertz) portb.0 kesmesi ile sinyali yakalayıp, yaklaşık 50 adc okuması yapıp portb.0 kesmesini pasif edip elde ettiğim adc değeri ile GLCD ye bazı değerleri print etmek istiyorum,Ancak bırakın portb.0 kesmesini açıp kapatmayı aktif bile edemedim. datasheette bakmadığım yer kalmadı, sonuç olarak beceremedim.
acaba bir yardımcı olabilirmisiniz?
not= kullandığım işlemci 18F4523 ve 18F4550 datasheeti ile aynı ekteki dosyada her ikiside var, şema ve protonda bas dosyasıda ektedir.

kodlarıda buraya ekliyorum, acaba nerde hata var?

Device 18F4523
Config_Start
   OSC = HSPLL ; HS oscillator, PLL enabled (Clock Frequency = 4 x FOSC1)
   FCMEN = OFF ; Fail-Safe Clock Monitor disabled
   IESO = OFF ; Oscillator Switchover mode disabled
   PWRT = OFF ; PWRT disabled
   BOREN = On ;N Brown-out Reset disabled in hardware and software
   WDT = OFF ; WDT disabled (control is placed on the SWDTEN bit)
   MCLRE = On ; MCLR pin enabled; RE3 input pin disabled
   LPT1OSC = OFF ; Timer1 configured for higher power operation
   PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
   CCP2MX = PORTC ; CCP2 input/output is multiplexed with RC1
   STVREN = OFF ; Stack full/underflow will not cause Reset
   LVP = OFF ; Disabled
   XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
   Debug = OFF ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
Config_End
Xtal 10
Declare PLL_Req TRUE '40mhz
Declare All_Digital = FALSE
Declare PortB_Pullups =0
'CMCON =7
'ADCON0 =%00000011                                 
'ADCON1 =%00001011                                 

'Declare Adin_Res = 12 ' 12-bit result required     
'Declare Adin_Tad = 32_FOSC ' RC OSC chosen   
'Declare Adin_Delay = 20 ' Allow 50us sample time 



Declare LCD_Type =GRAPHIC
Declare LCD_DTPort =PORTD
Declare LCD_ENPin =PORTC.4
Declare LCD_RWPin =PORTC.5
Declare LCD_RSPin =PORTC.6
Declare LCD_CS1Pin =PORTB.2
Declare LCD_CS2Pin =PORTB.1
Internal_Font = On
Font_Addr = 0
Declare GLCD_CS_Invert =0
Declare GLCD_STROBE_DELAY = 100
Cls
DelayMS 30

TRISA =%00000000  :PORTA =0                     
TRISB =%00000001 :PORTB =0                     
TRISC =%00000000  :PORTC =0                     
TRISD =%00000000  :PORTD =0                     
TRISE =%00000100  :PORTE =0                     
                         
Symbol GrOuNd =PORTE.2                         
Symbol LaMbA =PORTB.3                         
Input GrOuNd                                                                 
Output LaMbA     
Input PORTB.0                               
'//////////////KESME configrasyonu /////////////////////////// 
Symbol INT0IE =INTCON.4
Symbol INT0IF =INTCON.1   
Symbol GIE = INTCON.7    ' Global Interrupt Enable             
Symbol IPEN = RCON.7    ' Interrupt Priority Enable bit
IPEN    =1
GIE =1
GIE =0
INT0IE =1
INT0IF =1

Dim SaYaC As Byte
SaYaC =0
Print At 3,1,"MERHABA"
GIE =1
On_Hardware_Interrupt GoTo KESME


OnMaIn:
Print At 1,1,Dec SaYaC,"  "
DelayUS 10
GoTo OnMaIn
KESME:
Context Save
       INT0IF=0
        Inc SaYaC
        If SaYaC =250 Then SaYaC =250
        INT0IE=1           
         GIE =1
 
Context Restore
Stop



End
Include "FONT.INC"



dosya upload adresi;
http://s3.dosya.tc/server2/r5nMCM/18f4523.rar.html

ete

Zor bir işlemci seçmişsin. Kesmeleri doğru açmışsın ama bir şeyi göz ardı etmişsin gibime geliyor.
Bu işlemcilerin ikisinde de B portu aynı zamanda analog olarak çalışır ve muhtemelen default olarak Analog açılırlar.
Sen programın başında ,
Declare All_Digital = FALSE
komutunu vererek pinlerin analog çalışacağını kabul etmişsin. Sanırım bazıları analog bazıları digital çalışacak.
O halde ya protonda bunu yapacak bir komut bulman yada direk ilgili registerleri set ederek bunu yapman lazım.
Bu işlemcide B portunu analog çalıştırmak için;
ADCON1=%00001111 komutunu vermen gerekiyor. Bu komut bütün pinleri digital yapar.  Kısaca FALSE yaptıuğın komutu TRUE yaparsan bu komutu vermiş olursun.
İstediğin bir pinin Analog olmasını istersen data sheet de ADCON1 register tablosuna bakman gerekir. Diyelimki yalnız PORTB0 pinini digital yapacaksın diğerleri analog olacak o zaman ADCON1=%00000011 komutunu vermen gerekiyor. Bende tabloya bakarak bunu yazıyorum.
Kesme kısmında
If SaYaC =250 Then SaYaC =250  şeklinde bir komut görüyorum. Böyle komut olmaz. Zaten 250 olan bir şeyi yine 250 ye eşitlemek anlamsız. IF SAYAC>250 then SAYAC=250 desen bir anlamaı var ama senin yazdığının yok maalesef.

Ete


Hattuşa

slm ETE hocam
ilginiz için tşk ederim.
öncelikle IF sayac =250 then sayac =250 işlemi gözümden kaçmış zira ben sayacı sıfırlayacaktım ama yanlışlıkla 250 değerini yüklemişim, sanırım çok fazla inat etmek iyi değil, zira dün gece 2-3 saat kesmeyle uğraştım becerememiştim, şimdi sizin uyarılarınızı dikkate alarak tekrar SET değerlerini kontrol ettim kesme çalışıyor, adc yi de okuttum ama, istediğim kesmenin içinde yapabilmekti ADC okuma işlemini ama stack taşması hatası veriyor, beceremedim, sanırım biraz daha tiyo almam gerekiyor sizden  ;D

çalışır kod şu şekilde ;
Device 18F4523
Config_Start
   OSC = HSPLL ; HS oscillator, PLL enabled (Clock Frequency = 4 x FOSC1)
   FCMEN = OFF ; Fail-Safe Clock Monitor disabled
   IESO = OFF ; Oscillator Switchover mode disabled
   PWRT = On ; PWRT disabled
   BOREN = On ;N Brown-out Reset disabled in hardware and software
   WDT = OFF ; WDT disabled (control is placed on the SWDTEN bit)
   MCLRE = On ; MCLR pin enabled; RE3 input pin disabled
   LPT1OSC = OFF ; Timer1 configured for higher power operation
   PBADEN = On ; PORTB<4:0> pins are configured as digital I/O on Reset
   CCP2MX = PORTC ; CCP2 input/output is multiplexed with RC1
   STVREN = OFF ; Stack full/underflow will not cause Reset
   LVP = OFF ; Disabled
   XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
   Debug = OFF ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
Config_End
Xtal 10
Declare PLL_Req TRUE '40mhz

CMCON =7
' Declare All_Digital =TRUE
Declare PortB_Pullups =0

Declare LCD_Type =GRAPHIC
Declare LCD_DTPort =PORTD
Declare LCD_ENPin =PORTC.4
Declare LCD_RWPin =PORTC.5
Declare LCD_RSPin =PORTC.6
Declare LCD_CS1Pin =PORTB.2
Declare LCD_CS2Pin =PORTB.1
Internal_Font = On
Font_Addr = 0
Declare GLCD_CS_Invert =0
Declare GLCD_STROBE_DELAY = 100
Cls
DelayMS 30

TRISA =%00000001  :PORTA =0                     
TRISB =%00000001 :PORTB =0                     
TRISC =%00000000  :PORTC =0                     
TRISD =%00000000  :PORTD =0                     
TRISE =%00000100  :PORTE =0                     
                         
Symbol GrOuNd =PORTE.2                         
Symbol LaMbA =PORTB.3                         
Input GrOuNd                                                                 
Output LaMbA     
Input PORTB.0 
ADCON0 =%00000011                                 
ADCON1 =%00001110
ADCON2.7 =1                               

Declare Adin_Res = 12 ' 12-bit result required     
Declare Adin_Tad_32_FOSC ' RC OSC chosen   
Declare Adin_Delay =50 ' Allow 50us sample time 
                             
'//////////////KESME configrasyonu /////////////////////////// 
Symbol INT0IE =INTCON.4
Symbol INT0IF =INTCON.1   
Symbol GIE = INTCON.7    ' Global Interrupt Enable             
GIE =1
GIE =0
INT0IE =1
INT0IF =1
STKPTR =%11000000



Dim SaYaC As Byte
SaYaC =0
Dim AdC As Word

Print At 3,1,"MERHABA"
Print At 5,1,"ADC="
'GIE =1
On_Hardware_Interrupt GoTo KESME
GoTo OnMaIn
KESME:
Context Save
       INT0IF=0
       GIE =0
        Inc SaYaC
        If SaYaC >=250 Then SaYaC =0
             
         GIE =1
 
Context Restore
Stop

OnMaIn:
ADCON0 =%00000011
         AdC = ADIn 0
         While ADCON0.1 ==1 :Wend 

Print At 1,1,Dec SaYaC,"  "
Print At 5,6,Dec AdC," "
If GrOuNd =0 Then
GIE =1
Else
GIE =0
EndIf


DelayUS 10
GoTo OnMaIn




End
Include "FONT.INC"

ete

Kesme oluşuyor ancak kesmeden çıkmada sanki resume kullanman gerekiyor gibime geliyor.
Proton da iyi değilim. Bazı ince noktaları iyi bilmiyorum. Manual'e göre gerekmiyor.
Bir kesme oluştuğunda program hemen olduğu yerden ayrılır. Ayrılırken adresi stack a aatr. Kesmeden çıkarken aynı adresi stack dan alır ve geldiği yere geri döner. Şayet uygun komut vermez isen program stack dan adresi almaz ve rastgele bir yere gider. Bu ise her kesme oluştuğunda stack dan bir adresk eksilecek anlamına gelir. Tekrar aynı adresi oradan almaz isen sonunda stack taşması meydana gelir. Programında stack taşması yaratacak Gosub komutu olmadığına göre sorun bu olsa gerek.
Stack şöyle çalışır,
Gosub gördün yada kesme gördün git (Stack_Adres-1)
Return gördün yada kesmeden doğru şekilde çıktın geldiğin yere dön (Stack_Adres+1)
gördüğün gibi ayrılırken stackdan 1 adres kullanıyorsun. Geri döndüğün zaman o adresi yerine koymuş oluyorsun. Stack i bir sayı gibi düşünürsen ve stack=10 ise , ayrılırken StacK=10-1=9 , geri döndüğünde Stack=9+1=10 olur ama gosub ile gidip goto ile dönersen , Giderken Stack=10-1=9 , dönerken Stack=9+0=9 yeniden ayrılırsan Stack=9-1=8 aynı şekilde dönersen hep stack eksilir ve sonunda kullanılabilir adres sayısı sıfıra düşünce de taşma meydana gelir.
Proton açıklamalarına bakılırsa hardware kesmede Context Restore komutu bu işlemi otomatik yapıyor zaten.
Bu durumda geriye yalnızca bir tek konu kalıyor. Komutların Büyük harfle yazılması. Sen küçük harf kullanmışsın. Etkilimidir değilmidir bilemem. Ama bence dene istersen .

Ete

Hattuşa

slm hocam sayenizde yapmak istediğimi sonunda yaptım sanırım, kodu paylaşıyorum belki benzer projede kodlar yardımcı olur diye....

Device 18F4523
Config_Start
   OSC = HSPLL ; HS oscillator, PLL enabled (Clock Frequency = 4 x FOSC1)
   FCMEN = OFF ; Fail-Safe Clock Monitor disabled
   IESO = OFF ; Oscillator Switchover mode disabled
   PWRT = On ; PWRT disabled
   BOREN = On ;N Brown-out Reset disabled in hardware and software
   WDT = On ; WDT disabled (control is placed on the SWDTEN bit)
   MCLRE = On ; MCLR pin enabled; RE3 input pin disabled
   LPT1OSC = OFF ; Timer1 configured for higher power operation
   PBADEN = On ; PORTB<4:0> pins are configured as digital I/O on Reset
   CCP2MX = PORTC ; CCP2 input/output is multiplexed with RC1
   STVREN = On ; Stack full/underflow will not cause Reset
   LVP = OFF ; Disabled
   XINST = On ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
   Debug = OFF ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
Config_End
Xtal 10
Declare PLL_Req TRUE '40mhz
Declare All_Digital =On
Declare PortB_Pullups =0
Declare FSR_Context_Save = On
CMCON =7
ADCON0 =%00000011                                 
ADCON1 =%00001110
ADCON2.7 =1                                 

Declare Adin_Res = 12 ' 12-bit result required     
Declare Adin_Tad = 32_FOSC ' RC OSC chosen   
Declare Adin_Delay = 20 ' Allow 50us sample time 



Declare LCD_Type =GRAPHIC
Declare LCD_DTPort =PORTD
Declare LCD_ENPin =PORTC.4
Declare LCD_RWPin =PORTC.5
Declare LCD_RSPin =PORTC.6
Declare LCD_CS1Pin =PORTB.2
Declare LCD_CS2Pin =PORTB.1
Internal_Font = On
Font_Addr = 0
Declare GLCD_CS_Invert =0
Declare GLCD_STROBE_DELAY = 100
Cls
DelayMS 30

TRISA =%00000001  :PORTA =0                     
TRISB =%00000001 :PORTB =0                     
TRISC =%00000000  :PORTC =0                     
TRISD =%00000000  :PORTD =0                     
TRISE =%00000100  :PORTE =0                     
                         
Symbol GrOuNd =PORTE.2                         
Symbol LaMbA =PORTB.3                         
Input GrOuNd                                                                 
Output LaMbA     
Input PORTB.0                               
'//////////////KESME configrasyonu /////////////////////////// 
Symbol INT0IE =INTCON.4
Symbol INT0IF =INTCON.1   
Symbol GIE = INTCON.7    ' Global Interrupt Enable             

GIE =1
GIE =0
INT0IE =1
INT0IF =1

Dim SaYaC As Byte
SaYaC =0
Dim AdC[10] As Word
Dim ADC_tOpLaM As Word
ADC_tOpLaM =0
Print At 3,1,"MERHABA"
On_Hardware_Interrupt GoTo KESME


OnMaIn:
If GrOuNd =0 Then
GIE =1
Else
GIE =0
EndIf
Print At 1,1,Dec SaYaC,"  "
Print At 2,1, Dec ADC_tOpLaM,"  "
DelayUS 10
GoTo OnMaIn
High_Int_Sub_Start
KESME:
Context Save
       INT0IF=0
        Inc SaYaC
        If SaYaC =10 Then SaYaC =0
        DelayUS 100
        ADCON0 =%00000011
        AdC[SaYaC] =ADIn 0
        DelayUS 30
        ADC_tOpLaM =(ADC_tOpLaM +AdC[SaYaC]) /2
       
        INT0IE=1           
         GIE =1
 
Context Restore
High_Int_Sub_End
Resume
Stop



End
Include "FONT.INC"

Powered by EzPortal