18f4550 dahili osilatör zaman gecikme hatası

Başlatan eskişehir26, 31 Aralık 2021, 10:30:48

eskişehir26

Arkadaşlar selamlar. 18F4550 dahili osilatörünü deneme amaçlı basit bir led yak sön uygulaması yaptım. kodu CCS C ile yazdım. Ancak yazdığım zaman gecikmesinin 3 katı bir süre gecikme veriyor. Mesela 1 saniye gecikme süresi verince board üzerinde 3 saniyede bir led yakıp söndürüyor. Bu neden olabilir? Konfigürasyon ayarları ile ilgili olabilir mi?

#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); 
         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 (0b11011111);
     
     while (1)
      {
     
     output_toggle(pin_b5);
     delay_ms(1000);
      }
}   

sifirzero

Kardesim internali clock yaparmisin deneyim yazarmisin sonucunu
sifirzero.blogspot.com sifirrzero@gmail.com iman hem nurdur hem kuvvettir

sifirzero

sifirzero.blogspot.com sifirrzero@gmail.com iman hem nurdur hem kuvvettir

eskişehir26

Hocam selamlar. Yaptım ama sonuç değişmedi

muhittin_kaplan

4550 de PLL var.
Siz delay olarak 8mhz yazmış olabilirsiniz (OSC den dolayı) ama cihaz 40mhz de çalışıyor olabilir. Ona dikkat ediniz.

yas


sifirzero

Kardesim simulasyonda denedim calistirdim sorun yok
sifirzero.blogspot.com sifirrzero@gmail.com iman hem nurdur hem kuvvettir

kudretuzuner

Merhaba, öncelikle sağlıklı ve de mutlu bir yeni yıl dilerim. 18F4550 benim sıkça kullanmakta olduğum bir MCU. Genel bir CONFIG ayarları yazdım ve de bu ayarları zaman zaman istediğim gibi değiştirmekteyim(tabii data şitine bakarak).Yazılım assembly ile yazılmıştır ama önemli değil her türlü diğer yazılımlara kuple edebilirsiniz. Bu arada bir de DELAY rutini yazdım.

LIST P=18F4550
INCLUDE "P18F4550.INC"
__CONFIG _CONFIG1L, 0x00 ;
__CONFIG _CONFIG1H, 0x00 ;
__CONFIG _CONFIG2L, 0x00 ;
__CONFIG _CONFIG2H, 0x00 ;
__CONFIG _CONFIG3H, 0x80 ;
__CONFIG _CONFIG4L, 0x80 ;RB6 VE RB7 NORMAL INPUT OUTPUT
__CONFIG _CONFIG5L, 0x00
__CONFIG _CONFIG5H, 0x00
__CONFIG _CONFIG6L, 0x00
__CONFIG _CONFIG6H, 0x00
__CONFIG _CONFIG7L, 0x00
__CONFIG _CONFIG7H, 0x00
ORG H'0000'
SAYAC0 EQU H'8000';BEKLE RUTİNİ
SAYAC1 EQU H'8001';BEKLE RUTİNİ
SAYAC2 EQU H'8002'
SAYAC3 EQU H'8003'
SAYAC4 EQU H'8004'
SAYAC5 EQU H'8005'
SAYAC6 EQU H'8006'
SAYAC7 EQU H'8007'
SAYAC8 EQU H'8008'
SAYAC9 EQU H'8009'
SAYAC10 EQU H'800A'
SAYAC11 EQU H'800B'
SAYAC12 EQU H'800C'
SAYAC13 EQU H'800D'
SAYAC14 EQU H'800E';  "AZBEKLE"           RUTİNİ
SAYAC15 EQU H'800F';  "AZBEKLE"           RUTİNİ
BSF STATUS,5


Buradan sonra siz PORT ayarlarını istediğiniz gibi giriş çıkış ayarlayabilirsiniz.
Aşağıdaki yazılım ise genel amaçlı bir DELAY programıdır. FF değerlerini"01 ile FF" arası değiştirerek istediğiniz gecikmeleri elde edebilirsiniz. Kolay gelsin.


BEKLE
MOVLW H'FF'
MOVWF SAYAC0
DONGU0
MOVLW H'FF'
MOVWF SAYAC1
DONGU1
DECFSZ SAYAC1,F
GOTO DONGU1
DECFSZ SAYAC0,F
GOTO DONGU0
RETURN



AZBEKLE
MOVLW H'8F'
MOVWF SAYAC14
DONGU14
MOVLW H'8F'
MOVWF SAYAC15
DONGU15
DECFSZ SAYAC15,F
GOTO DONGU15
DECFSZ SAYAC14,F
GOTO DONGU14
RETURN

;************
END
;***********
Amatör

eskişehir26

YAS hocam zaten dahili osilatörde sorun yaşıyorum. Yazılan kod dahili osilatör seçildi.

eskişehir26

Alıntı yapılan: muhittin_kaplan - 01 Ocak 2022, 00:50:334550 de PLL var.
Siz delay olarak 8mhz yazmış olabilirsiniz (OSC den dolayı) ama cihaz 40mhz de çalışıyor olabilir. Ona dikkat ediniz.

Hocam kodları paylaştım. Nasıl bir düzeltme önerirsiniz?

muhittin_kaplan

css bilmiyorum ama pll x3 yapıldıysa şunu 24000000 yapar denerdim
#use delay (internal=8000000)

JOKERAS

#11


CCS'de ne şekilde yapılır bilmiyorum ama Direkt olarak Registerlerden kontrol edip deneyin.
Aplikasyondan da görüleceği üzere Osilatör seçmek için Multiplexer var.
Bunu kontrol eden register SCS Bitleri.
Ayrıca İnternal osilatör ayarı için birde PostScaler var.Ve Default durumu 1Mhz.


Kodunuzu şu şekilde deneyin bakalım ne oluyor.

#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); 
         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 (0b11011111);

    OSCCONbits.SCS = 0x02;  //Internal Osilatör Block
    OSCCONbits.IRCF = 0x07; //Max 8Mhz seçildi.Alt değerlerde Frekans katlarına bölünür.
     

     
     while (1) {
     
     output_toggle(pin_b5);
     delay_ms(1000);

     }
}


Edit; PLL isteniyorsa Fuse ve PLL Bloğunu ona göre revize etmek icab eder.
Bu örnek, mevcut İnternal Max 8Mhz için.

kudretuzuner

Merhaba, dahili osilatörü hiç kullanmadım. Data şitine baktım        __CONFIG _CONFIG1H, 0x00 ; bölümü bu konu ile alakalı  FOSC3:FOSC0: Oscillator Selection bits(1)0-3 bitleri ile yapılacak değişiklikler ile ayar yapabilirsiniz.
REGISTER 25-2: CONFIG1H: CONFIGURATION REGISTER 1 HIGH (BYTE ADDRESS 300001h)
R/P-0 R/P-0 U-0 U-0 R/P-0 R/P-1 R/P-0 R/P-1
IESO FCMEN — — FOSC3(1) FOSC2(1) FOSC1(1) FOSC0(1)
bit 7 bit 0
Legend:
R = Readable bit P = Programmable bit U = Unimplemented bit, read as '0'
-n = Value when device is unprogrammed u = Unchanged from programmed state
bit 7 IESO: Internal/External Oscillator Switchover bit
1 = Oscillator Switchover mode enabled
0 = Oscillator Switchover mode disabled
bit 6 FCMEN: Fail-Safe Clock Monitor Enable bit
1 = Fail-Safe Clock Monitor enabled
0 = Fail-Safe Clock Monitor disabled
bit 5-4 Unimplemented: Read as '0'
bit 3-0 FOSC3:FOSC0: Oscillator Selection bits(1)
111x = HS oscillator, PLL enabled (HSPLL)
110x = HS oscillator (HS)



----------------------------------------------------------------------------------------------
1011 = Internal oscillator, HS oscillator used by USB (INTHS)
1010 = Internal oscillator, XT used by USB (INTXT)
-----------------------------------------------------------------------------------------------


1001 = Internal oscillator, CLKO function on RA6, EC used by USB (INTCKO)
1000 = Internal oscillator, port function on RA6, EC used by USB (INTIO)
0111 = EC oscillator, PLL enabled, CLKO function on RA6 (ECPLL)
0110 = EC oscillator, PLL enabled, port function on RA6 (ECPIO)
0101 = EC oscillator, CLKO function on RA6 (EC)
0100 = EC oscillator, port function on RA6 (ECIO)
001x = XT oscillator, PLL enabled (XTPLL)
000x = XT oscillator (XT)
Özetle;
__CONFIG _CONFIG1H, 0x0B veya  __CONFIG _CONFIG1H, 0x0A yaparak dener misiniz? Sonucu yazarsanız ben de kesin öğrenmiş olurum.
Amatör

eskişehir26

Alıntı yapılan: JOKERAS - 01 Ocak 2022, 19:28:30

CCS'de ne şekilde yapılır bilmiyorum ama Direkt olarak Registerlerden kontrol edip deneyin.
Aplikasyondan da görüleceği üzere Osilatör seçmek için Multiplexer var.
Bunu kontrol eden register SCS Bitleri.
Ayrıca İnternal osilatör ayarı için birde PostScaler var.Ve Default durumu 1Mhz.

Bu kod CCS de çalışmaz. Ayrıca PLL kullanmıyorum.


Kodunuzu şu şekilde deneyin bakalım ne oluyor.

#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); 
         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 (0b11011111);

    OSCCONbits.SCS = 0x02;  //Internal Osilatör Block
    OSCCONbits.IRCF = 0x07; //Max 8Mhz seçildi.Alt değerlerde Frekans katlarına bölünür.
     

     
     while (1) {
     
     output_toggle(pin_b5);
     delay_ms(1000);

     }
}


Edit; PLL isteniyorsa Fuse ve PLL Bloğunu ona göre revize etmek icab eder.
Bu örnek, mevcut İnternal Max 8Mhz için.


eskişehir26

Alıntı yapılan: muhittin_kaplan - 01 Ocak 2022, 18:35:34css bilmiyorum ama pll x3 yapıldıysa şunu 24000000 yapar denerdim
#use delay (internal=8000000)

Hocam PLL kullanmıyorum