tmr0 ile 5us zamanlayıcı

Başlatan paradox, 23 Mart 2007, 02:38:13

paradox

birkaç gündür forumda bayağı bir yazı okudum bu konu hakkında.çok fazla bilmiyodum tmr0 ı fakat anlatılanların sayesiinde öğrendim teşekkürler burdan.

sorunum şu picin bir pininden 100khzlik bir kare dalga üreteceğim.
yani bir peryodu 10us olan.çok hassas olmasına gerek yok aslında 100khz ile 200 khz arasında olsa yeter.

5us yi elde etmem için prescaler=1:1 yapmayı düşündüm.
burdan şöyle bir hesap çıkardım;

4mhz/4=1mhz=1us
1us*1*(256-251)=5us oluyor.

ON INTERRUPT GoTo KESME  
OPTION_REG=%10000000     
INTCON=%10101000 'burada wdt nin 1:1 lik prescalerini kullanmak istedim doğrumu bilmiyorum    
TMR0=0
TRISB=0
BASLA:
........
.......boş döngü var
GOTO BASLA

DISABLE
KESME
...
..
TOGGLE İLE PİN TERSLEME
..
...
RESUME

bu şekilde yazdığım bir programla 5us elde edebilirmiyim.256-251 i nasıl yapacağımı bilmiyorum.
tam anlamadım sanırım.

ete

Seçimlerinde bazı hatalar var. Doğrularını açıklarsam karşılaştırır anlarsın nerede hata var sanırım.

ON INTERRUPT GoTo KESME
OPTION_REG=%10001000 ' Bölücü ve WDT seçimi burada
INTCON=%10100000 'kesmeler ve TMR0 kesmesi açıldı

TMR0=247
TRISB=0

BASLA:
       GOTO BASLA

DISABLE
KESME:

       TOGGLE PIN

      TMR0=247          ' TMR0 'a yeniden önyükleme değeri veriliyor
      INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
      RESUME
     ENABLE
  END      

Doğrusu böyle olmalı. Senin merak ettiğin TMR0'a bir ön değer verilmesi işi programın başında bir kez verilecek ve her kesme oluştuğunda bu değer TMR0 'a yeniden yüklenecektir. Böylece TMR0 kesmeden çıkınca verilen b u değerden itibaren saymaya başlayacaktır.

100Khz lik düzgün bir kare dalga ayrıca HPWM ile de kolaylıkla elde edilebilir. Üstelik tamamen geri planda çalıştığı için seni engellemez.

Onu yapmak için en azından Hardware PWM çıkışı olan  16F628 kullanman gerek. 628 de RB3 (PortB.3) bacağı PWM çıkış bacağıdır.
Buradan 100 KHz lik bir PWM sinyali çıkarmak için;

TRISB=0
CMCON=7
T2CON = %00000100
PR2=9
CCP1CON=%00001100

Bu komutları vermen yeterli.

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

paradox

@ete hocam forumdaki herkes size ne kadar teşekkür etse azdır.sizin anlatımlarınızdan öğrenmiştim.dün gece yazdım bu soruyu pc yi kapadığımda aklıma geldi.sabah yani şimdi bir açtım aklıma gelenle aynı cevabı vermişsiniz.en azından mantığını öğrendim artık.option registerının 3. bitini 1 yapacaktım gece yanlışlıkla olmuş o.herşey için tekrar sağol un.

kolay gelsin...

Ziya

5 mikrosaniye için kesme kullanmamanızı tavsiye ederim. 4 MHzlik kristal ile kesmeye dallanmak ve geri dönmek 4 mikrosaniyenizi götürür. Kesmede context saving işlemleri de en az 8 mikrosaniye götürür. bir kesmeye gidip gelmek en az 20 mikrosaniyenizi alır. Bunun yerine CCP compare kullanın, timer1'i dahili osilatörden alın (prescale gerekebilir hatıorlayamadım). Karşılaştırma kayırçısına 5 değerini yükleyin. CCP kesmesini aktiflemenize gerek yok. CCP1 çıkışı size istediğiniz frekansta kare dalga üretecektir.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

paradox

bugün bişey denedim , programı şu

TRISA=0
BASLA :
PORTA.0=1
ASM
NOP
NOP
NOP
NOP
NOP
ENDASM
PORTA.0=0
ASM
NOP
NOP
NOP
NOP
NOP
ENDASM
GOTO BASLA


Bir arkadaşım böyle yapsak olmazmı dedi .denedik bugün osiloskopta.
peryodu 5 us olan güzel bir kare dalga çıktı.
yalnız 1 de kalma süresi 1 us ve 0 da kalma süresi de 4 us oldu.
çalışmayacağını düşünmüştüm ilk başta.çünkü micro code studio hata vermişti derlerken.
çalıştı ama bu sefer de neden peryodun ikiye bölünmediğini anlamadım?

Ziya

goto 2 komut adımında işlenir. yani 2 nop eşdeğeri. 5 adet nop tan sonra bir pin set veya reseti ile yarım dalga boyunu 6 mikrosaniye (diğerini 8 mikrosaniye) elde etmiş olmalısın.

program alanından tasarruf etmek için 2 nop yerine bir sonraki komuta goto yap.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

paradox

bugün aşağıdaki programı osiloskop ile denedm.biraz dc bileşeni olan ama güzel bir kare dalga elde ettik.fakat önemli bir sorun vardı.hesaplamalarıma uymayan bir peryod uzunluğu oldu sebebini anlayamadım.bide siz bakarmısınız.bir peryod 40us sürdü.oysaki ben 10 us istiyorum.

ON INTERRUPT GoTo KESME 
OPTION_REG=%10001000 ' Bölücü ve WDT seçimi burada 
INTCON=%10100000 'kesmeler ve TMR0 kesmesi açıldı 

TMR0=252 
TRISB=0 

BASLA: 
GOTO BASLA 

DISABLE 
KESME: 

TOGGLE PORTB.0 

TMR0=252 ' TMR0 'a yeniden önyükleme değeri veriliyor 
INTCON.2=0 'TMR0 Kesme bayrağı sıfırlanıyor 
RESUME 
ENABLE 
END



teşekkürler...