PIC18F452 TMR0 100 Hz olmuyor

Başlatan oongit, 26 Kasım 2013, 21:21:58

oongit

Selam Arkadaşlar...

Yeni bir işlemci aldım... PIC18F452... Amacım 100 Hz kare dalga üretmek (10 ms.de bir 250µs pulse...) Ama olmuyor, olmuyor, olmuyor... Nerede hata yapıyorum bir türlü bulamadım. Yardımcı olmanızı rica ediyorum. Daha önce hiç 18F452 kullanmadım.

Device 18F452
Xtal 20

Config_Start
    OSC     = HS
    OSCS    = OFF
    PWRT    = OFF
    BOR     = OFF
    WDT     = OFF
    CCP2MUX = OFF
    STVR    = OFF
    LVP     = OFF
    Debug   = OFF
Config_End

All_Digital = FALSE

TRISA = %001011
TRISB = %00000000
TRISC = %00000000
TRISD = %00000000
TRISE = %000

Symbol PULSE = PORTD.0

On Interrupt GoTo KESME
TMR0=60

T0CON=%11000101
INTCON=%10100000
TMR0L=0

BASLA:
    @nop
    GoTo BASLA
    
    Disable
KESME:
    TMR0=60
    TMR0L=0
    High PULSE
    DelayUS 250
    Low PULSE
    INTCON.2 = 0
    Resume
    Enable

End

Maxim

hocam kesme içinde delay komutu sevilmez pek
üstelik yazılım kesmesi kullanmışsın On Interrupt GoTo KESME

On_Interrupt GoTo KESME ile yaparsan yani hardware kesme ile çok daha sağlıklı olur

oongit

İş yerinde olduğum için şu an deneme şansım yok. Dediğinizi eve gidince deneyeceğim.

Peki;
On Interrupt GoTo KESME ile
On_Interrupt GoTo KESME arasındaki fark ya da avantaj nedir?

Bir de kesme içinde kullandığım Delay komutu, kesme haricindeki ana programımın süresini etkilemeyecek diye tahmin ediyorum. Tabii bir de şu var... Bu Pulse süresini kesme haricinde oluşturamıyorum (en azından harici bir devre ile yapmak istemiyorum, yoksa işlemciler neden var değil mi?)

Saygılarımla...

Kabil ATICI

#3
ana program içinde de pek ala pulse süresini oluşturabilirsin.
Bayrak ata. (bir ram adresi)
Buna örneğin
Bayrak=0 diye bir başlangıç değeri ver.

Kesme içinde Bayrak=1 yap.

tek yapman gereken ana program içinde
bayrak değerinin 1 olup olmadığına bakmak
bayrak değerin 1 ise
burada Bayrak=0 yapıp istediğin delay komutuna uygulamak.

BASLA
if Bayrak=1 then
     Bayrak=0
    High PULSE
    DelayUS 250
    Low PULSE
endif
GoTo BASLA

gibi bir şey olabilir
ambar7

oongit

Programım bayağı kalabalık olacak gibi görünüyor. O yüzden; ana program içinde Pulse oluşturmak yerine, bu işi arka planda TMR0 sayıcısının yapmasını istiyorum. TMR0, arka planda sürekli 10 ms. de bir 250 µs Pulse üretirken ben programımın yürümesini istiyorum.

Yani bir nevi HPWM komutu gibi... 20 MHz frekansta, bu kadar düşük frekansta Pulse oluşturamayacağıma göre bunu mecburen TMR0 ile yapmam gerekiyor. Umarım derdimi anlatabilmişimdir.

Maxim

bu kod tam 100.0 hz lik bir kare dalga çıkışı verir
timer0 16bit olarak kullandım.
normal döngü içerisinde ne yaparsan yap, delayms 5000 bile desen PORTD.0 çıkışındaki 100hz bozulmaz.

Device = 18F452
Declare Xtal 20

Config_Start
    OSC     = HS
    OSCS    = OFF
    PWRT    = OFF
    BOR     = OFF
    WDT     = OFF
    CCP2MUX = OFF
    STVR    = OFF
    LVP     = OFF
    Debug   = OFF
Config_End

All_Digital = FALSE

TRISA = %001011
TRISB = %00000000
TRISC = %00000000
TRISD = %00000000
TRISE = %000

Symbol CIKIS = PORTD.0
Dim TIMER0 As TMR0L.Word

Symbol GIE = INTCON.7
Symbol T0IE  = INTCON.5
Symbol T0IF  = INTCON.2

T0CON=%10000000

On_Interrupt GoTo KESME
T0IE=1
GIE=1

BASLA:
DelayMS 100
GoTo BASLA
      
KESME:
Context Save

TIMER0 = 53036
Toggle CIKIS
  
T0IF=0
Context Restore



oongit

Çok çok teşekkürler Maxim...

Bu şekilde 10 ms. de bir 250 µs pulse verebiliyor mu? Yoksa 10 ms. de bir konum mu değiştiriyor. (Deneyemiyorum evde değilim henüz... Malum mesailer)

Maxim

#7
Alıntı yapılan: oongit - 28 Kasım 2013, 22:09:15
Çok çok teşekkürler Maxim...

Bu şekilde 10 ms. de bir 250 µs pulse verebiliyor mu? Yoksa 10 ms. de bir konum mu değiştiriyor. (Deneyemiyorum evde değilim henüz... Malum mesailer)

valla 100hz dedin 100hz oldu :)
yani 5ms high, 5ms low kare dalga

edit: 10ms de bir 250us puls olayını kaçırmışım

oongit

Yanıt biraz geç oldu ama... Sonsuz teşekkürler Maxim  :D

oongit

Şimdi oldu...

Device = 18F452
Declare Xtal 20

Config_Start
    OSC=HS
    OSCS=OFF
    PWRT=OFF
    BOR=OFF
    WDT=OFF
    CCP2MUX=OFF
    STVR=OFF
    LVP=OFF
    Debug=OFF
Config_End

All_Digital=FALSE

TRISA=%001011
TRISB=%00000000
TRISC=%00000000
TRISD=%00000000
TRISE=%000

Symbol PULSE=PORTD.0
Symbol GIE=INTCON.7
Symbol T0IE=INTCON.5
Symbol T0IF=INTCON.2

Dim TIMER0 As TMR0L.Word

T0CON=%10000000

On_Interrupt GoTo KESME
T0IE=1
GIE=1

BASLA:
    DelayMS 100
    GoTo BASLA
      
KESME:
    Context Save
    TIMER0=40500
    High PULSE
    DelayUS 250
    Low PULSE
    T0IF=0
    Context Restore