12F629 OSSCAL osilatör hatası

Başlatan eskişehir26, 31 Aralık 2021, 11:04:25

eskişehir26

Arkadaşlar selamlar. 12f629' a PICkit3 ile program yazdırmak istediğimde OSCCAL hatası veriyor. Bunu nasıl düzeltebilirim? Aynı hatayı alıp yapan biri yol gösterirse sevinirim.

sifirzero

Kardesim galiba yanlislikla ters voltaj vermissin
sifirzero.blogspot.com sifirrzero@gmail.com iman hem nurdur hem kuvvettir

ete

#2
12F675 ve 12F629 da fabrikasyon dahili osilatör kalibrasyon değeri program hafızasının en son adresine yazılıp satışa sunuluyor. İşlemciyi programladığınız zaman şayet silme komutu ile (Erease) işlemci içindeki programı silerseniz bu kalibrasyon ayarıda silinip işlemciyi çalışmaz duruma getirir. O işlemcinin tekrar çalışır duruma gelmesi için kalibrasyon değerinin yeniden bulunup ilgili adresine yazılması gerekir. Bu işlemi Pickit2 programlayıcıları yapabiliyor. Elinizde var ise yaptırabilirsiniz.
Yok ise kafadan atma bir değerle en azından işlemciyi çalıştırabilirsiniz. Bunun içinde programı işlemciye yükledikten sonra en son adrese $3F34 veya $3F48 gibi bir değer yazıp sonra programlayınız.

Elinizde basit bir frekansmetre var ise onunla da kendiniz yapabilirsiniz aslında bu işi.
Config ayarlarından INT OSC CLOCKOUT on GP4 seçilerek programda OSCCAL registerine önce rasgele bir değer verip frekansmetreyi GP4 pinine bağlayarak çıkan frekansı ölçmek gerekir. 1Mhz (Fosc/4) frekansı yakalayana kadar değerleri butonlarla değiştirip OSCCAL registerine yazmak ve GP4 den sonuca bakmak gerekir. Ensonda kalibrasyon değeri ne ise onu son adrese yazmak işlemciyi kurtarmak için yeterli olacaktır.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

eskişehir26

#3
Hocam cevaplarınız için çok teşekkür ederim. Program yükledim ancak deneme amaçlı dahili osilatör ile led yan sön uygulaması yaptım ancak sadece yanıyor sönmüyor :)

#include <12f629.h> 
#fuses INTRC,NOWDT,NOPROTECT,NOCPD,NOPUT,NOMCLR,NOBROWNOUT
#use delay (internal=4000000) 
#use fast_io(a)                                                        
                                                        
void main ( )
{  

          setup_timer_1(T1_DISABLED) ;
        setup_vref (FALSE);
    setup_comparator(A0_A1_OUT_ON_A2);
  
  set_tris_a (0b11111011);
  
  while (1)
  {
      output_toggle(pin_a2);
    delay_ms(100);
  }
}

ete

Led yanıyor ve sönmüyor ise osc frekansı çok düşük kalmış demektir. Şimdiye kadar çalıştığım 675 işlemcilerde genelde oscal değeri $34 değeri ile $38 aralığında değerler gördüm. Bu değeri son adrese yazabilirseniz işiniz görülür.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

eskişehir26

#5
Hocam PIC'in osccal değerini 3428 olarak gördüm ve sorunsuz şekilde program yüklendi. PIC' e yüklediğim kodu paylaştım. dahili osilatör frekansı 4 MHZ olarak seçtim.  Ancak led yanıp duruyor hiç sönmüyor : ) .Benzer bir durumu 18F4550 de de yaşıyorum. 18F4550 de dahili osilatör seçiliyken, programda yazdığım zaman gecikmesinin 3 katı bir zaman gecikmesi oluyor. sıfırzero hocamda baktı kodda bir hata yok dedi. #use delay (internal=8000000) komutunda internal yerine clock ta yazdım yine olmuyor. aşağıdaki kod da ledi 3 saniye yakıyor, 3 saniye sönük tutuyor.  onun da kodu:
  #include <18f4550.h> 
#FUSES INTRC_IO, NOWDT, NOPROTECT, NOBROWNOUT, NOPUT, NOCPD, STVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, IESO, FCMEN, NOPBADEN, NOWRTC, NOWRTB, NOEBTR, NOEBTRB, NOCPB, NOMCLR, NOXINST
#use delay (internal=8000000)
#use fast_io(b)

void main ( )
{
        setup_timer_0 (T0_OFF);
        setup_timer_1(T1_DISABLED) ;
        setup_timer_2 (T2_DISABLED,0,1) ;  
        setup_timer_3(T3_DISABLED) ;
        setup_CCP1 (CCP_OFF) ;        
        setup_CCP2 (CCP_OFF) ;        
        setup_adc_ports (NO_ANALOGS);  // analog girişler iptal edilerek dijital yapıldı.
        setup_adc (ADC_OFF|ADC_TAD_MUL_0);
        setup_psp (PSP_DISABLED);
        setup_spi (SPI_SS_DISABLED);
        setup_wdt (WDT_OFF);
        setup_comparator (NC_NC_NC_NC);
        setup_vref (FALSE);
        setup_oscillator (OSC_8MHZ);

  set_tris_b (0b01011111);
    
    while (1)
      {
      
    output_toggle(pin_b5);
    delay_ms(1000);
      } 
}

ete

Ne yazıkki C bilgim çok fazla değil. Ben Basic çalışırım. Yazdığın kodun aynısını Basic de yapıp simulasyonda deniyorum sorunsuz çalışıyor gözüküyor.

Kullanılan kapsamlı bir işlemci ve bazı özelliklerine dikkat etmek gerekiyor. Biliyorum C dilinde pek çok şey otomatiğe bağlanmış ama acaba aşağıdakiler uygulanmışmıdır. Hemen belirteyim benim programa bunları uyguladım.
- Bu işlemcinin dahili osc ile çalışması için sigorta aayrlarında _FOSC_INTOSC_HS_1H seçilmesi gerekir bu 8 ve Üzeri frekanslar için gerekli olan bir seçimdir.
- Yine dahili OSC de 8 Mhz seçeneğinin aktive edilmesi gerekir ki bunuda OSCCON registeri yapar ve bu registere OSCCON=%01110010 değerini verdim.
- Yine bu işlemcide giriş pinleri PORTX registeri ile ama çıkış pinleri de LATX registeri ile kontrol edilir. Kısaca PORTB de bir giriş pinine bakmak için PORTB.x kullanılır iken aynı port da bir çıkış yapmak için LATB.x regsiteri kullanılır. Senin yazdıklarında bunlara ait bir ifade göremedim. Benim program PORTB.5 pinini TOGGLE olarak her 1000 ms (1sn) de bir yakıp söndürmektedir.

Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

eskişehir26

Hocam sorun board üzerinde oluyor. simülasyonda sorunsuz çalışıyor

Maxim


elektronik

Frekans yüksek olmuştur. led çok hızlı yanıp sönüyorsa sanki sürekli yanıyor gibi görünüyordur. bunu anlamak için gecikmeyi dahada arttırın

eskişehir26

Her şeyi denedim olmuyor. Çok ilginç :)

sadogan

  main lopun hemen üst satırına
 #ROM 0x03FF = {0x344C} bunu ekleyip deneyebilirmisin.

eskişehir26

Alıntı yapılan: sadogan - 02 Ocak 2022, 19:32:12main lopun hemen üst satırına
 #ROM 0x03FF = {0x344C} bunu ekleyip deneyebilirmisin.

12F629 için mi? Burada asıl mevzu 12F629 un dahili osilatör işi

sadogan

Bu zaten eepromda bulunan silinmiş osc cal değeri için .

sadogan



Resimde EEPROM alanında mavi olark işaretli yere 33 gibi değeri yazarakta osc kalibrasyon değeri verebilirsin