8 bit tmr0 kesmesi sorunu?

Başlatan transistor, 30 Ekim 2023, 03:00:22

transistor

İyi geceler, ayarlarım doğru olmasına rağmen kristal osilatörü 4mhz'den, 20mhz'e çektiğimde lcd ekranda saat hızlanıyor nerede hata yapıyorum. 4mhz'de herşey normal. Bu bproblem proteus ile ilgili mi yoksa?

nasıl çalıştığını gif resmi olarak görebilirsiniz.
https://gifyu.com/image/S8vSZ






ete

Kod örneği verirken resim şeklinde vermeyin. Ayrıca kodun tamamını verin
Bu tür mesajlara cevap da yazmayacağım bundan sonra.
Ne olur yani resim şeklinde versek demeyin. O kodu alıp incelemem ve gerekn yerlere düzeltmeleri koymam gerekirse bütün kodu yeniden yazmam gerekiyor. Burada olduğu gibi.

Her neyse,
Kesme kısmında bazı anlamsız şeyler var onları açıklamak ve düzeltmek isterim.
SYC=SYC+1
IF SYC=61 THEN
  IF SYC<61 THEN CIK
Her kesmede SYC deeri bir artırılıyor ve değer 61 olur ise program bir alt satıra geçiyor. Yani
IF SYC<61 THEN CIK satırına.
SYC=61 iken SYC nin 61 den küçük olabilme ihtimali varmıdır sence???? Bence imkansız bir şey.
SYC nin 61 den küçük olma ihtimali, SYC=SYC+1 satırından sonraki satırda olabilir. Ama orada bunu test etmiyorsun aslında test etmeye de gerek yok. Binary düşüncede iki alternatif vardır. Doğru veya yanlış. Bunun rakamsal karşılığı ise 1 ve 0 dır.Doğru ise 1 yanlış ise sıfırdır. SYC=61 ise aynı anda SYC nin 61 den küçük olma ihtimali olamaz.

Kesme kısmına ait kodların doğru şeklini vereyim.
KESME:
SYC=SYC+1
IF SYC=61 THEN
  SN=SN+1
  SYC=0
  IF SN=60 THEN
     SN=0
     DAK=DAK+1
     IF DAK=60 THEN
        DAK=0
        ST=ST+1
        IF ST=24 THEN
          ST=0
        ENDIF
      ENDIF
   ENDIF     
ENDIF
INTCON.2=0  
RESUME 
ENABLE
SYC değeri bir artırılınca şayet değeri 61 değil ise program doğruca INTCON.2=0 satırına atlar otomatikman.

Gelelim programın hızlanmasına. Buraya kadar anlattıklarım bu hızlanmaya sebap olmaz diye düşünüyorum. Bunu verdiğim yeni kodu deneyince anlayacağız. Sorunun bize vermediğin kod parçasında olabileceği düşüncesindeyim.
Bu arada saat sayarken 0-59 sistemi ile sayar. Sayaclardan birisi 60 olunca otomatikman sıfırlanır. Hiç bir zaman SN>=60 şeklinde test edilmez SN=60 şeklinde test edilir. 60 olunca sıfırlanması gerekir.Sıfır dahil 59 da sayarsa 60 defa saymış olur çünki.

Ete





transistor

Merhabalar öncelikle hatalarımdan dolayı özür diliyorum. Tekrar bu şekilde yapmam. Ayrıca yardımınız için teşekkür ederim. Kodlarımda sadece lcd çıktısı var asıl problem ise bu hız sorununu çözemediğim. Bu arada gerçekte devreyi yapma fırsatı buldum aynı simülasyonda olduğu gibi orada da hızlı bir şekilde çalışıyor. Yani proteus programından şüphe ediyordum ancak sorun o değilmiş. Sonsuz döngü etiketi altında lcd çıktısının hemen sonrasına "pause 10" gibi bir değer ekleyince saat yavaşlıyor. Verdiğiniz bilgilere dayalı kodlarımı düzelttim ancak kodların içinde kesme etiketinin hemen üzerinde ki "disable"  komutunu koymadığım zaman da lcd'de görüntü alamıyorum. Ben sadece yaptığım hatanın kaynağının ne olduğunu çözme çabasındayım.

#CONFIG
cfg = _HS_OSC                ; HS oscillator
cfg&= _WDT_ON                ; WDT enabled
cfg&= _PWRTE_ON              ; PWRT enabled
cfg&= _BODEN_OFF              ; BOR disabled
cfg&= _LVP_OFF                ; RB3 is digital I/O, HV on MCLR must be used for programming
cfg&= _CPD_OFF                ; Data EEPROM code protection off
cfg&= _WRT_OFF                ; Write protection off; all program memory may be written to by EECON control
cfg&= _DEBUG_OFF              ; In-Circuit Debugger disabled, RB6 and RB7 are general purpose I/O pins
cfg&= _CP_ON                  ; Code protection on
__CONFIG cfg
#ENDCONFIG
'-------------------------------------------------------------------------------
DEFINE OSC 20

TRISB = %00000000 : TRISC = %00000000 : TRISD = %00001111
                    PORTC = %00000000 : PORTD = %0000
'-------------------------------------------------------------------------------                    
CMCON=7
OPTION_REG=%10000101        'Pull up dirençleri İPTAL- Bölme oranı 1/64.
INTCON=$A0                  'TMR0 VE TÜM KESMELER AKTİF INTCON=%10100000
TMR0=0                      'TMR0 8BIT KULLANILACAK
ON INTERRUPT GOTO KESME    'KESME OLUŞTUĞUNDA BU ADRESE GİT                    
'-------------------------------------------------------------------------------
DEFINE LCD_DREG PORTB        'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 4            'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG PORTB        'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT    3            'LCD Enable Bacağı Hangi bite bağlı ?
define LCD RWREG PORTB      'LCD R/W Bacağı Hangi Porta bağlı?
define LCD_RWBIT 2          'LCD R/W Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG PORTB        'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 1            'LCD RS bacağı Hangi Bite bağlı  ?
DEFINE LCD_BITS    4            'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 4            'LCD 4 satir
'-------------------------------------------------------------------------------
SN VAR BYTE : DK VAR BYTE : ST VAR BYTE : SYC  VAR BYTE 
'-------------------------------------------------------------------------------  
BASLA:

    LCDOUT $FE,$81,DEC2 ST,":",DEC2 DK,":",DEC2 SN
                                        
GOTO BASLA
'-------------------------------------------------------------------------------
'------------------------------------------------------------------------------- 
disable
KESME:    
SYC=SYC+1
 IF SYC = 61 THEN
SN=SN+1
 SYC=0 
 IF SN=60 THEN
 SN = 0
DK=DK+1
 IF DK=60 THEN        
  DK=0
ST=ST+1
 IF ST=24 THEN        
 ST=0
ENDIF
 endif
  ENDIF
  endif
INTCON.2 = 0                
RESUME
ENABLE
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
end




mehmet

Zaman kesmesi konfigürasyonunu, her kristale
göre yeniden hesaplamanız gerekmez mi?
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr

transistor

#4
Alıntı yapılan: mehmet - 30 Ekim 2023, 18:11:42Zaman kesmesi konfigürasyonunu, her kristale
göre yeniden hesaplamanız gerekmez mi?
Muhtemelen 8bit prescaler(1/64) değerinden söz ediyorsunuz. Benimde bildiğim bazı şeyler var ancak seni aydınlatmaya yetmez diye düşünüyorum. Benim anlamadığım konu saatin hızını geçtim. "pause 3000" 3sn aralıkla yakıp söndürdüğüm led bile 1sn den daha az bir sürede tekrarlıyor.

mehmet

#5
Alıntı yapılan: transistor - 30 Ekim 2023, 18:24:14Muhtemelen 8bit prescaler(1/64) değerinden söz ediyorsunuz. Benimde bildiğim bazı şeyler var ancak seni aydınlatmaya yetmez diye düşünüyorum. Benim anlamadığım konu saatin hızını geçtim. "pause 3000" 3sn aralıkla yakıp söndürdüğüm led bile 1sn den daha az bir sürede tekrarlıyor.

4MHz kristalde 1/64 ve TMR0 = 0 iken
kesme 61,04Hz(16,384ms).
Yine aynı şekilde 20MHz için kesme
305,18Hz(3,2768ms).

Dolayısıyla 20MHz kristalde; ~60Hz kesme
yapabilmek için TMR1 kesmesini kullanmanız
daha doğru olacaktır.

http://eng-serve.com/pic/pic_timer.html
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr

ete

Sonunda benim göremediğimi Mehmet gördü. Elbette timer sayaclarının tamamı için geçerli olan husus şudur. Sayacın yaratacağı gecikme yada süre OSC frekansına göre belirlenmelidir. OSC frekansı 20Mhz ise 1/64 bölme oranı ile TMR0 sayacının yaratacağı gecikme süresi şöyle hesaplanır.
Ön yükleme değeri sıfır alınmış O halde sayac sıfırdan başlayıp 255 e kadar yani 256 adım sayacak demektir. 20 Mhz de her komut çevrimi 20/4= 5 ve 1/5=0,2 us olacaktır. Bu dururumda süre hesabı;
256 * 0,2 * 64 =3.276,8 buda yaklaşık 3,28 ms lik süreye tekabül edecektir. Bundan 61 tanesi bir araya gelince toplam süre 200 ms civarında bir değer olarak hesaplanacaktır. İşte senin saatin, 1000 ms de bir sn değiştireceğine her 200 ms de bir sn değiştirmekte ve dolayısıyla normalden hızlı çalışmaktadır.
Yapılacak iş şu;
- Timer0 sayacını illaki kullanmak istersen onu her 10 ms de bir kesme yaratacak şekilde kurman gerekir. Bunun için, TMR= ön yükleme değerin 60 olmalı, Bölme oranın ise 1/256 olmalı. SYC sayacın ise 100 adet kesme sayarak toplamda 1000 ms lik süreyi yakalayacaktır.
- İkinci alternatifin ise Timer-1 sayacını kullanmak olurdu. Bu sayacı 1/8 bölme oranı ile ve sayaca $0BDC ön yükleme değerini vererek saydırman ve bu şekilde 100 ms lik bir gecikme elde etmen gerekiyor. Böylece bu gecikmelerden 10 tanesini saydığın zaman 1000 ms lik süreye erişebilirsin.

Ete


transistor

Verdiğiniz bilgiler için teşekkür ederim sayenizde problemi çözdüm.

OPTION_REG=%10000111        'Pull up dirençleri İPTAL- Bölme oranı 1/256.

Powered by EzPortal