PIC18F452 delay_ms() problemi

Başlatan ziyaretci, 01 Haziran 2017, 23:39:12

ziyaretci

  Merhaba, 18F452-40MHz kullandığım bir projede timer hesabı yapıp istediğim süreye ulaşabiliyorum. Fakat derleyicinin kendi fonksiyonu olan delay_ms() fonksiyonu 25 ms 'de bile  3-4 katı bir gecikme oluşuyor. Hani 25ms 'yi vurgulamamın nedeni belki derleyici 40MHz için 1000 ms'yi hesaplayamaz diye. Çünkü programın başlangıcında bir kaç tane de 1000 ms gecikme var. LCD 'de ürün tanıtımı vs. için.
 
20MHz'de sorun yok. (20MHz taktığımda timer hesaplarını ona göre düzenliyorum.)

İlk defa böyle bir durumla karşılaştım. Sorun ne olabilir?

Projede;
  #use delay(clock=40M)
  #fuses HS //tanımlı.


  Denediklerim;
- Farklı derleyici sürümü ile denedim.
- Farklı bilgisayarlarda denedim.
- Derleyiciyi <close all> yapıp, kapatıp tekrar açtım.

sadogan

Delay_ms(); bir problem yok.
Pll i aktif etmeniz gerekiyor  #fuses HS tanımlaması ile kristal frekansını kullanıyorsunuz.
40mhz için 10Mhz kristal takıp  #fuses H4 tanımlayın.

omereliusuk

#include <18F452.h>
#device ADC=10

#FUSES OSCSEN                   //Oscillator switching is enabled
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTC                   //Configuration registers not write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads

#use delay(clock=40MHz,crystal=10MHz)

                                               

ziyaretci

Hocalarım, timer hesabını taktığım kristalin 1/4 ü için yapıyorum. 40MHz'lik kristal takılı denetleyiciye. OSCEN' i denedikten sonra yazarım.


Hani daha önceden 16F877 ile yaptığım işlerde 20MHz kristal bağlayıp, sigortayıda HS bırakıp, delay fonksiyonundan da yaklaşık faydalanabiliyordum.



sadogan

40Mhz kristal takılamıyor.  En çok 20 Mhz. 18F452 de PLL ünitesi var , 877 benzemez.
10Mhz i 4 ile çarpıp kendisi 40Mhz yapıyor.

ziyaretci

Hocam, tercih mi edilmiyor? Sakıncası mı var?

mehmet

Kristal en fazla 20MHz takılabilir. Ancak mcu da
en fazla 40MHz de çalışmaktadır. 40MHz sadece
PLL ile mümkündür.

Dolayısıyla 10MHz kristal takıp PLL ile 4 ile çarpılır.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

ziyaretci

#7
Hocam verdiğiniz bilgiler için teşekkür ederim.

Fakat şuanda 40MHz takılı olmasına rağmen zamanlayıcılar düzgün çalışıyor. 40MHz takılamıyorsa neden 40MHz 'de zamanlayıcılarda ve diğer donanım birimlerinde sorun çıkmıyor da çalışıyor? Tek problemi delay_ms fonksiyonunda yaşıyorum.

***40MHz taktığımda hesapları 10MHz göre yapıyorum.***

Denetleyicinin içinde neler dönüyor, bu konuda da aydınlatabilir misiniz?

omereliusuk

#8
Delay_ms(int16 değer);
bu kadar.
Başka bir ayara gerek yok. Bir de kesme içinde delay fonksiyonunu kullanmamaya riayet edin.

ziyaretci

#9
Delay_ms' de 16 bite dikkat ediyorum. Kesme içerisinde delay kullanılmayacak bilgisine sahibim. Konunun başında program ilk çalışırken lcd ile tanıtım yazısı basmak için kullandığımı belirttim.  20MHz'de sorun olmadığını söyledim. Vs. Vs. Vs.

Kısacası ben ne soruyorum, ne cevap geliyor.

Düzenleme 1:
- Bir bitmediniz, yahu! 

Düzenleme 2:
- Bakalım kimler hücum edecek.

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

ziyaretci

Kristal 4MHz olsa timer hesaplarımda şaşardı. Kristal 40MHz hocam.


40.000000 yazıyor üstünde.

sadogan


mehmet

Test bu frekanslarda yapılmıştır. Çalışmaz diye
bir olay yok. Overclock yapmıyor muyuz bilgisayarlarda.
Aynı olay.
Ancak garanti edilen frekanslar bunlar. Siz 40MHz ile
çalıştırıyorsunuz. Bazı çevre birimleri çalışabilir, bazları
çalışmayabilir.

Bu nedenle katalog içinde belirtilen değerler dışına çıkmamak
en uygunu olacaktır.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

ziyaretci

Alıntı yapılan: sadogan - 02 Haziran 2017, 15:24:10

Tabloda  40mhz yok.
Alıntı yapılan: mehmet - 02 Haziran 2017, 23:15:13
Test bu frekanslarda yapılmıştır. Çalışmaz diye
bir olay yok. Overclock yapmıyor muyuz bilgisayarlarda.
Aynı olay.
Ancak garanti edilen frekanslar bunlar. Siz 40MHz ile
çalıştırıyorsunuz. Bazı çevre birimleri çalışabilir, bazları
çalışmayabilir.

Bu nedenle katalog içinde belirtilen değerler dışına çıkmamak
en uygunu olacaktır.


Çok teşekkür ederim. Daha öncelerden bilmem gerek bilgileri şimdi öğrendim. Sağolun tekrardan.