Kesmemi önceliklidir yoksa I2C baglantısımı?

Başlatan dyonizos, 22 Nisan 2012, 21:00:13

dyonizos

Selamlar arkadaşlar
elimdeki bir projede pic in üzerine DS1302 ve DS18B20 baglı bunlar ekrana saat ve ısı degerlerını yazıyor. Ancak aynı zamanda sanıyede yaklasık 1000 defa pals üreten birde encoder var. Buda B0 dış kaynak kesmesıne baglı. Saat ve ısı fonksıyonlarını disable edersem pals sayım hızı artıyor. bunlar aktıfken  daha yavas sayıyor pals lerı. Bu mumkunmudur? yanı dıs kaynak kesmesı olustugunda o anda saat yada termometreden deger beklendıgı ıcın kesmenın pals ı kacırma ıhtımalı varmı?

serhat1990

Eğer kesme içinde diğer kesmeleri algılamaması için global interrupt enable bitini sıfır yapıyorsanız diğer kesmenizi kaçırabilir. İyi çalışmalar dilerim .

muhittin_kaplan


dyonizos

kesme donanımsal kesme hocam.

kesme içinde bir sorun yok zaten saat ve termometre disable edildiğinde hızlı olarak okuyor. Ancak saat ve termometre için gosub ile saat ve termometre degerlerini almak için dallandığı zaman sanırım kesmeleri kaçırıyor.

kesmenın içinde yazan sadece

PulseCount:
Context SAVE

Inc PULSE
Inc PULSELITRE
INTF=0 

Context Restore 
Resume

dyonizos

Ana program ıcınde keypad ıcın yaptıgım tarama kesmenın kacmasına sebep oluyor olabılırmı? Ne olursa olsun donanımsal kesme her durumda pals kacırmadan sayar dıye bılıyordum.

x= InKey
tus= LookUp x, [1,4,7,"*",2,5,8,0,3,6,9,11,20,30,40,50]

serhat1990

Tarama ve herhangi başka bir fonksiyon kesmeyi görmene engel olmaz. Yalnız kullandığın dili bilmiyorum demek istediğim genel kesme biti var bu biti sıfır yapmadığın sürece tüm kesmelerde programın kesmeye uğrayacaktır. Kendi fonksiyonlarında yada kullandığın derleyici kesme içerisinde başka hiç bir işlem yapmamak için genel kesme izin bitini kapatıyorsa bundan dolayı palsleri kaçırıyorsundur.

muhittin_kaplan

#6
donanımsal kesme nin kaçmaması gerek. başka bir problem vardır.

Context SAVE
PulseCount:
Inc PULSE
Inc PULSELITRE
INTF=0 
Context Restore


olarak denermisin

Veli B.

Bu linki inceleyin. Muhtemelen sorun bu.
Kodunuzu koysanız daha fazla ve sağlıklı yardım alırdınız...
https://www.picproje.org/index.php?topic=22975.0

muhittin_kaplan

Hocam protonla Nezaman Donanımsal Kesme Yapmaya çalıştıysam Kesin bir hata ile karşılaştım. Sonrasında Ya asm ile yazdım yada cebelleştim durdum.

Veli B.

Proton kesme yönetimi konusunda kötü değil.
Kullandığım dönemlerde bir hayli proje yaptım ve herhangi bir sorun yaşamadım. Geliştirme aşamasında bazı sorunlar olmuştu elbette ama bu benden kaynaklı idi ve inceledikçe hataları bulup düzeltmiştim ve sorunsuz çalışmışlardı.
Bu arada, kritik projelerde  elbette ISR içerisinde ben de Assembly ile yazıyordum.

dyonizos

aslında kesmeye girmesinde bir sorun yok. yani kesmeye giriyor ve çıkıyor zaten kesmenin içinde birşey yok. Ancak saatten yada termometreden data alırken aptallaşıyor.
Kesme ile saat ve termometre aynı anda kullandınızmı hic?

Veli B.

Evet.
5 farklı kesme(UART+B0+BCHANGE+TMR0+TMR1) +SHT11+DS18B20+GLCD@18F4520... Yeterli mi?
Kesmeye girmesinde bir sorun yok dediğinize göre, sorunu biliyorsunuz demektir!

dyonizos

kodların tamamı burada.
bir problem varmı sizce?

Device = 18F6620
		
    CONFIG_START

        PWRT = OFF ; PWRT disabled
        BOR = On ; Brown-out Reset enabled in hardware only (SBOREN is disabled)
        WDT = OFF ; HW Disabled - SW Controlled
        LVP = OFF ; Single-Supply ICSP disabled
        WRT0 = OFF ; Block 0 (000800-001FFFh) not write-protected
        WRT1 = OFF ; Block 1 (002000-003FFFh) not write-protected
        WRTB = On ; Boot block (000000-0007FFh) write-protected
        OSC = HS
        EBTR0 = OFF 
        EBTR1 = OFF   
        EBTR2 = OFF      
        EBTR3 = OFF

    CONFIG_END

        XTAL = 20

        Declare ALL_DIGITAL = TRUE	' Set PORTA and PORTE to all digital
        Declare LCD_DTPORT = PORTD 'GLCD DATA PORTLARI PORTD'YE BAĞLI
        Declare LCD_ENPIN = PORTG.0 'GLCD ENABLE PİNİ PORTC.1 BAĞLI
        Declare LCD_RWPIN = PORTG.1 'GLCD RW PİNİ PORTC.4 BAĞLI
        Declare LCD_RSPIN = PORTG.2 'GLCD RS PİNİ PORTC.5 BAĞLI  
        Declare LCD_CS2PIN = PORTG.3 'GLCD CS1 PİNİ PORTC.2 BAĞLI
        Declare LCD_CS1PIN = PORTG.4 'GLCD CS2 PİNİ PORTC.3 BAĞLI
        Declare LCD_TYPE = GRAPHIC 
        Declare INTERNAL_FONT = On 
        Declare FONT_ADDR = 0
        Declare KEYPAD_PORT = PORTE         
        Declare GLCD_CS_INVERT On 
        GLCD_EXTERNAL_PRINT = PPRINT
        ADCON1 = $FF             
        CMCON  = %00000111          
        ADCON2 = %10000110              

TRISA=%00000000
TRISB=%00011111
TRISC=%10100111
TRISD=%00000000
TRISE=%00000000
TRISF=%11111111
TRISG=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTE=0
PORTF=0
PORTG=0
 
           
        Symbol INTF = INTCON.1      'RB0 KESME BARAĞI
        Symbol INTE = INTCON.4      'RB0 KESME YETKG
        Symbol GIE = INTCON.7       'GLOBAL INT. YETKI
        GIE=0                       'tüm kesmeler kapalı
        INTE=1                      'RB0 Kesmesi aktif
        GIE=1                       'Aktif O an Tüm kesmelere Yetki ver  


        Symbol DS18b20 = PORTC.0  
        Symbol RST = PORTC.7
        Symbol IO = PORTB.3
        Symbol SCLK = PORTB.4
  

        Dim PULSE As Word
        Dim x As Byte
        Dim tus As Byte
        Dim a As Byte
        Dim sec As Byte
        Dim mint As Byte
        Dim hour As Byte
        Dim date As Byte
        Dim month As Byte
        Dim day As Byte
        Dim year As Word
        Dim bcd As Byte 
        Dim decimal As Byte
        Dim Temperature As Word
        Dim Dum,DumTh,DumTl,reg As Byte 
        Dim TempRd As Float
        Dim mem As Byte
        Dim sayi As Byte
        Dim ONLAR As Byte
        Dim BIRLER As Byte
        
 

PULSE=0

Low RST   
Low SCLK

On_Hardware_Interrupt GoTo PulseCount 
Cls           
 BASLA:


x= InKey
tus= LookUp x, [1,4,7,"*",2,5,8,0,3,6,9,11,20,30,40,50]
If tus=42 Then Cls : tus=0 : a=0: DelayMS 200:GoTo KODGIR
GoSub GetData
GoSub EKRAN


 GoTo BASLA


EKRAN:
Print Font Arial____8
Print At 1,85,   "P : ", DEC4 PULSE," " 
Print Font Arial____6o75
Print At 55,1, DEC1 TempRd," "
Print At 55,18, " C"
Print At 55,89, DEC2 hour,":",DEC2 mint,":",DEC2 sec," "
Print At 55,35, DEC2 date,".",DEC2 month,".20",DEC2 year
Return


KODGIR:
Print Font Arial____8
Print At 20,20,  "PASS : "
x= InKey
tus= LookUp x, [1,4,7,"*",2,5,8,0,3,6,9,"#",20,30,40,50]
If tus=35 Then Cls : GoTo BASLA

GoTo KODGIR

Include "Arial7.txt"
Include "ARIAL8.txt" 


GetData:
        OWrite DS18b20, 1, [$CC, $44] 
        'While ORead DS18b20, 4 = 0 : Wend 
        OWrite DS18b20, 1, [$CC, $BE]
        ORead DS18b20, 0, [Temperature.LowByte, Temperature.HighByte, DumTh,DumTl,reg,Dum,Dum,Dum,Dum ]
        TempRd = 0.0625 * Temperature

         High RST
         SHOut IO, SCLK, 0, [$BF]
         SHIn IO, SCLK, 1, [sec,mint,hour,date,month,day,year, mem]
         mem=sec
         ONLAR=mem & %01110000
         ONLAR=ONLAR>>4
         BIRLER=mem & %00001111
         sayi=ONLAR*10+BIRLER 
         sec=sayi
         
         mem=mint
         ONLAR=mem & %01110000
         ONLAR=ONLAR>>4
         BIRLER=mem & %00001111
         sayi=ONLAR*10+BIRLER
         mint=sayi
         
         mem=hour
         ONLAR=mem & %01110000
         ONLAR=ONLAR>>4
         BIRLER=mem & %00001111
         sayi=ONLAR*10+BIRLER
         hour=sayi
         
         mem=date
         ONLAR=mem & %01110000
         ONLAR=ONLAR>>4
         BIRLER=mem & %00001111
         sayi=ONLAR*10+BIRLER
         date=sayi
         
         mem=month
         ONLAR=mem & %01110000
         ONLAR=ONLAR>>4
         BIRLER=mem & %00001111
         sayi=ONLAR*10+BIRLER
         month=sayi
         
         mem=year
         ONLAR=mem & %01110000
         ONLAR=ONLAR>>4
         BIRLER=mem & %00001111
         sayi=ONLAR*10+BIRLER
         year=sayi
         
         mem=day
         ONLAR=mem & %01110000
         ONLAR=ONLAR>>4
         BIRLER=mem & %00001111
         sayi=ONLAR*10+BIRLER
         day=sayi
         
         Low RST
         
Return


PulseCount:
Context SAVE
SYSTEM_SAVE MACRO-
ASM-
; Context SAVE the essential registers
movff STATUS,_RAM_END ; Save the STATUS register
movff WREG,_RAM_END - 1 ; Save the WREG
movff BSR,_RAM_END - 2 ; Save the bank select register
movff FSR0L,_RAM_END - 3 ; Save low byte of FSR0
movff FSR0H,_RAM_END - 4 ; Save high byte of FSR0
movff FSR1L,_RAM_END - 5 ; Save low byte of FSR1
movff FSR1H,_RAM_END - 6 ; Save high byte of FSR1
movff FSR2L,_RAM_END - 7 ; Save low byte of FSR2
movff FSR2H,_RAM_END - 8 ; Save high byte of FSR2
movff PRODL,_RAM_END - 9 ; Save the multiply registers
movff PRODH,_RAM_END - 10 ; These require saving because the compiler uses them regularly.
movff TBLPTRL,_RAM_END - 11 ; Save the Table Pointer registers
movff TBLPTRH,_RAM_END - 12 ; These require saving because the compiler uses them regularly.
movff TABLAT,_RAM_END - 13 ; Save the code memory access register

; Save the compiler's SYSTEM variables
lfsr 0,_RAM_END - 14 ; Point FSR0 to the next available piece of memory in high RAM
lfsr 1,_SYSTEM_VARIABLE_COUNT - 1 ; Point FSR1 to the end of the SYSTEM variables in Access RAM
movlw _SYSTEM_VARIABLE_COUNT ; Form a loop for the amount of system variables used
movff POSTDEC1,POSTDEC0 ; Move the compiler's SYSTEM variables from Access RAM into high memory
decfsz WREG,F ; Decrement and skip if zero the variable counter
bra $ - 6 ; Keep placing variables until all done
VARIABLE _RAM_POINTER = (_RAM_END - 14) - _SYSTEM_VARIABLE_COUNT ; Point to the finishing point of the variable save
movlb 0  ; Reset BANK
ENDASM-
ENDM

Inc PULSE
INTF=0 
     

SYSTEM_RESTORE MACRO-
ASM-
; Restore the compiler's SYSTEM variables
lfsr 0,_RAM_END - 14 ; Point FSR0 to the start of the system variables stored in high memory
lfsr 1,_SYSTEM_VARIABLE_COUNT - 1 ; Point FSR1 to the end of the SYSTEM variables in Access RAM
movlw _SYSTEM_VARIABLE_COUNT ; Form a loop for the amount of system variables used
movff POSTDEC0,POSTDEC1 ; Move the compiler's SYSTEM variables from high memory into Access RAM
decfsz WREG,F ; Decrement and skip if zero the variable counter
bra $ - 6 ; Keep placing variables until all done

; Context RESTORE the essential registers and exit the interrupt
movff _RAM_END - 13,TABLAT ; Restore the TABLAT register
movff _RAM_END - 12,TBLPTRH ; Restore high byte of TBLPTR
movff _RAM_END - 11,TBLPTRL ; Restore low byte of TBLPTR
movff _RAM_END - 10,PRODH ; Restore high byte of PROD
movff _RAM_END - 9,PRODL ; Restore low byte of PROD
movff _RAM_END - 8,FSR2H ; Restore high byte of FSR2
movff _RAM_END - 7,FSR2L ; Restore low byte of FSR2
movff _RAM_END - 6,FSR1H ; Restore high byte of FSR1
movff _RAM_END - 5,FSR1L ; Restore low byte of FSR1
movff _RAM_END - 4,FSR0H ; Restore high byte of FSR0
movff _RAM_END - 3,FSR0L ; Restore low byte of FSR0
movff _RAM_END - 2,BSR ; Restore the bank select register
movff _RAM_END - 1,WREG ; Restore the WREG
movff _RAM_END,STATUS ; Restore the STATUS register
movlb 0               ; Reset BANK
ENDASM-
ENDM
 
Context Restore 
End

dyonizos

ptoteusta denediğim zamanda aynı şekilde yavaşlıyor saymalar.  Bu kodlarda bir sorun gorunuyormu arkadaslar. Lutfen bır bakarmısınız?

Maxim

sizin gordugunuz bu yavaslama ekrandami oluyor?
yani glcd de gosterim yavasliyor olmasin?