avatar_Mastercodex

Pic 18F2550 Kesme KUllanımı

Başlatan Mastercodex, 18 Eylül 2012, 21:18:17

Mastercodex

Arkadaşlar Merhaba,

Aşağıda yazmış olduğum kodlar ile hesaplamalarıma göre 1200 Hz = 1.2 Khz sinyal almam gerekiyor ama ISIS te 1121 Hz olarak ölçüm alıyorum.Acaba bir hesap hatasımı yapıyorum.

Hesaplarıma göre 48Mhz OSC frekansı ile  ,

Komut süresi 0,083us x (65535-60535) x Prescaler 1  = 416,67us

İşlemci  : 18F2550
FOSC    : 48 Mhz
Prescaler : 1/1

'**********************************
'*  Name    : Mastercode Sigmake              *
'*  Author  : Mastercodex                           *
'*  Version : 1.0                                          *
'**********************************
asm
__CONFIG _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L
__CONFIG _CONFIG1H, _FOSC_HSPLL_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
__CONFIG _CONFIG2L, _PWRT_ON_2L & _BOR_OFF_2L & _VREGEN_OFF_2L
__CONFIG _CONFIG2H, _WDT_OFF_2H
__CONFIG _CONFIG3H, _MCLRE_ON_3H & _LPT1OSC_OFF_3H & _PBADEN_OFF_3H & _CCP2MX_OFF_3H
__CONFIG _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L &_XINST_OFF_4L  & _DEBUG_OFF_4L
__CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
__CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
__CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
__CONFIG _CONFIG6H, _WRTB_OFF_6H & _WRTC_OFF_6H  & _WRTD_OFF_6H
__CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
__CONFIG _CONFIG7H, _EBTRB_OFF_7H
endasm
DEFINE OSC 48
'-------------------------------------------------------------------------------
CMCON=7                     ' COMPORATOR PİNLERİ İPTAL
ADCON1=15                   ' TÜM GİRİŞLER DİJİTAL
TRISA=%00000000 : PORTA=0   ' PORTA PIN I/O SEÇİMLERİ
TRISB=%00000000 : PORTB=0   ' PORTb PIN I/O SEÇİMLERİ
'-------------------------------------------------------------------------------
DF VAR WORD : DF=60535      ' TIMER1 KESME DEĞİŞKENİ
SYMBOL SGN1=PORTA.0         ' KANAL 1 ÇIKIŞI
TMR1H=DF/256                ' TIMER1 KESME HIGH REGISTERI
TMR1L=DF-(TMR1H*256)        ' TIMER1 KESME LOW REGISTERI
T1CON.7=1                   ' 16 BİT OKUMA / YAZMA AKTİF
T1CON.5=0                   ' TMR1 PRESCALE
T1CON.4=0                   ' TMR1 PRESCALE 1:1
T1CON.3=0                   ' TMR1 OSİLATÖR AÇIK
T1CON.1=0                   ' TMR1 SAAT KAYNAĞI / Fosc/4
T1CON.0=1                   ' TMR1 KESMESİ AKTİF
'-------------------------------------------------------------------------------
MASTER:
    IF PIR1.0=1 THEN        ' TIMER1 KESME BAYRAK KONTROLÜ
        SGN1=1-SGN1         ' ÇIKIŞ SİNYALİ 1
        PIR1.0=0            ' TIMER1 KESME BAYRAĞI SIFIRLANDI
        TMR1H=DF/256        ' TIMER1 KESME HIGH REGISTERI
        TMR1L=DF-(TMR1H*256)' TIMER1 KESME LOW REGISTERI
    ENDIF       
goto MASTER
End

Mastercodex® 3D Teknoloji
----------------------------------
http://www.mastercodex.com
info@mastercodex.com

ete

Programı bu hali ile derleyince yaklaşık 286 byte yer kaplıyor.
Komut gecikmeleri istediğin frekansın çıkmasını engelliyor.
TMR1H=DF/256
TMR1L=DF-(TMR1H*256)
satırlarını aşağıdakiler ile değiştirince bak bakalım neler oluyor.
TMR1H=DF.Byte1
TMR1L=DF.Byte0

Program 100 byte seviyesine düşüyor ve çalıştırdığın zaman ise 1200 hz' çok yakın bir değere ulaşabilirsin. (1.198Hz) Hatta  SGN1'=1-SGN1  komut satırınıda  TOGGLE SGN1 şeklinde değiştirirsen program 90 byte'a düşer ve daha kesin sonuç alırsın.

Ete

Mastercodex

Hocam ilginiz için teşekkür ederim.

Aynen dediğiniz gibi komut gecikmelerinin olduğu doğru ve sizin dediğiniz gbi denedim ve aşağıdaki kodları deiştirmem rağmen 1198 Hz frekansında sinyal hızı çıkardı.

TMR1H=DF.BYTE1
TMR1L=DF.BYTE0
TOGGLE SGN1

Bende şu şeklde bir ilave yaptığımda tam 1200 Hz frekansı yakaladım. O zaman şöyle diyebilirmiyim , TMR1L registerına 4 ilave ederek 4 kesme süresi daha hz eklemiş oluyorum.Yani komut gecikmelerim 4 * 0,0833 us oluyor.Hangi frekansı elde etmek istersem isteyeyim bu komut gecikmesini ilave etemem yeterli olacak.Bu anlattıklarım doğrumudur.Yanlış bir kavrama yapmak istemiyorum.

Yardımınız için tekrar teşekkürler.

Mastercodex® 3D Teknoloji
----------------------------------
http://www.mastercodex.com
info@mastercodex.com

ete

Komutların her zaman kendi işlenme süreleri vardır.
MAntığını çalıştırırsan,
Program kesme etiketine gelince hiç bir şey yapmadan yalnızca TOGGLE SGN1 komutunu işletse ve bu komutun gecikmesini ihmal etmiş olsak çıkan sinyal kesme oluşturma süresi*2 peryoduna sahip olacak idi. Ama maalesef Timer'a ön yükleme değeri vermek ve daha sonrada SGN1 bitini ters çevirmek , 48 Mhz de bile az da olsa zaman almaktadır.

Dolayısıyla komut gecikmelerini TMR1 süresine ekleyerek kesme oluşturma süresini kısaltmış oluyorsun. Ama komut gecikmeleri ile birlikte bu süre senin istediğin seviyeye gelerek çıkan sinyalin 1200 Hz olmasını sağlıyor. Hepsi bu.
Kavrama doğru yani.

Ete

erdoganacun

ete  hocam  benim  saat  projem  var   18F2550    pahalı olduğu  için   yeni  18  serisinde  daha  ucuz  olan  18F25K22   kullanmak istiyorum. microbasıc de yazılmış  bir  programım    new  dosyası  açtım   18F25K22   yeniden derledim   sigorta  ayarlarıyla  bir  çok  denemeler  yaptım fakat  ne  yaptıysam  çalışmadı  bu konuda  yardımcı  olurmusunuz. saygılarımla

ete

#35
Microbasic den anlamam maalesef. Şimdiye kadar microbasic le yazılmış program bile görmedim nasıl yardımcı olmamı bekliyorsun?
Şunu anlayın artık ben PBP ile çalışırım. Onun haricindeki program ve derleyicilerle ilgili yardımcı olmam mümkün değil maalesef.

Ete

erdoganacun

yok hocam yanlış  anlaşıldı galiba  ben microbasıc  ilgili yardım istemiyorum ete hocam  ben 18F2550  yerine   18F25K22   kullanmak istiyorum  bu konuda  yardımcı  olabilirmisiniz.

ete

Benim kullandığım sigorta ayarları şöyle
ASM
    __CONFIG _CONFIG1H, _FOSC_INTIO67_1H & _PLLCFG_OFF_1H & _PRICLKEN_ON_1H & _FCMEN_OFF_1H & _IESO_OFF_1H       
    __CONFIG _CONFIG2L, _PWRTEN_ON_2L & _BOREN_OFF_2L & _BORV_285_2L
    __CONFIG _CONFIG2H, _WDTEN_OFF_2H & _WDTPS_32_2H                                                                                     
;    __CONFIG _CONFIG3H, _CCP2MX_PORTB3_3H & _PBADEN_OFF_3H & _CCP3MX_PORTE0_3H & _HFOFST_OFF_3H & _T3CMX_PORTB5_3H & _P2BMX_PORTC0_3H & _MCLRE_INTMCLR_3H
     __CONFIG _CONFIG3H, _PBADEN_OFF_3H & _HFOFST_OFF_3H & _T3CMX_PORTB5_3H & _P2BMX_PORTC0_3H & _MCLRE_INTMCLR_3H
    __CONFIG _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
    __CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L   
    __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H 
    __CONFIG _CONFIG6L, _WRT0_ON_6L & _WRT1_ON_6L
    __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
    __CONFIG _CONFIG7L, _EBTR0_ON_7L & _EBTR1_ON_7L
    __CONFIG _CONFIG7H, _EBTRB_ON_7H
endasm

Bu ilemcide bütün portlar analog olabiliyor o nedenle ; ANSELA=0:ANSELB=0:ANSELC=0 regsiterlerini kullanman gerek
B portunda dahili pullup var ve aktivasyon için INTCON2.7=0 'pullups (B) aktif
WPUB registeri kullanılıyor.
IPR1=%00100000
OSCCON =%01111100  16 Mhz için bu ayar var diğerleri için data sheete bakman gerek.
OSCCON2=%00000000
OSCTUNE=%10000000
CCP1CON=0:CCP2CON=0:CCP3CON=0  'PWM ler iptal ediliyor.
Hepsi bu kadar birde Porta yazarken LATX registerini PORTU okurken PORTX registerini kullanman gerekiyor. Yeni nesiller artık bu şekilde.
Umarım bir faydası dokunur bu bilgilerin.
Ete


dexta64

#38
Programcılığın mantığını ve disiplinini biliyorsanız, bir dilde yazılan programı başka bir dile çevirebilirsiniz.
Microbasic ile niye uğraşıyorsunuz ki kendi bildiğiniz dile çevirin.
Proton Basic olabilir. Proton bazı pic'ler için kullanması bedava. ör.18F452, 16F877A

PBP ile Protonbasic arasında birkaç komutun kullanılması dışında bir fark yok. Birinde Define birinde Declare. Onuda zaten help'e bakınca halloluyor.

Protonbasic son versiyonda PortX.4'den LCD data uçları bağlama şartını kaldırdı.Şiddetle tavsiye ederim.
Kararlı bir dil. Debug için cof dosyası oluşturmaya gerek yok.(istenirse oluşturulabilir komutla) Proteus direk bas dosyasından debug mod çalıştırıyor.

Powered by EzPortal