PIC BASIC PRO Öğreniyoruz soru cevapları

Başlatan aster, 19 Mayıs 2005, 17:33:33

emrah

flas led yapmak sadece bir örnekti hocam, yani amacm ana menü normal çalısırken usart kesmesi oldugunda etkilenip etilenmedigini gözlemekti. simulasyonda calıstırdıgımız komutları gercekte calıstıramadım. aceba board ustunde yanlıslıkmı yaptım dedim usart kesmesi olmadan normal seri datalar  gönderdiğimde onları alabiliyorum. nyse yarın tekrar ugrasacam. teşekkürler ...

emrah

merhaba,

timer0 kesmesi hakknda bir yerde takıldım.

ete hocamızın ders notlarında pwm konusuna bakıyordum. timer0 ile yapılan pwm programında  şurası aklıma takıldı!

PORTA=0:portb=0
TRISB=%00000000   '
TRISA=%00000000   '
'-----------------------------------------------------------------
@ DEVICE pic16F628                      'işlemci 16F628                               
@ DEVICE pic16F628, WDT_OFF                 'Watch Dog timer kapalı
@ DEVICE pic16F628, PWRT_ON                'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF          'Kod Koruma kapalı
@ DEVICE pic16F628, MCLR_off               'MCLR pini kullanılmıyor.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
'-------------------------------------------------------------------------
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10001000   'Pull up dirençleri İPTAL- Bölme oranı 1/1
INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktif

TMR0=28

CMCON=7    '16F628 de komparatör pinleri iptal hepsi giriş çıkış
'----------------------------------------------------------------------------

'-----------------------------------------------------------------------------
CLEAR  'tüm değişkenler sıfırlandı
'PAUSE 200

'-----------------------------------------------------------------------------

BASLA:

GOTO BASLA

DISABLE
KESME:
      PORTA.0=1-PORTA.0
      @ nop
      @ nop
      TMR0=28
      INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
      RESUME
      ENABLE
     
END

timer0 = 28 yapmakla ne yapılmıs oluyor ?   timer0 kesmesinde ayarlanan presicalra degeri ile kullanılan kristala baglı olarak belli bir usaniye de kesme olusmuyormu? bu timer0= 28 yada baska bir rakam yazmakla ne degişiyor?


Birde 3 çıkışlı pwm programında, baslarda     timer0=6 yapılmış, kesme içerisindeki timer0= 254 yapılmıs  buda baska daha baska bir olaymı ???

cevaplar için şimdiden teşekkkürler ...

ilhan_mkp

tmr0 timeri 8bitlik bu da demek oluyor tmr0 ençok 255 değeri alabilir
yani 255 değerine ulaştığında kesme bayrağı set olur
sen tmr0 içine 28 değeri attığında 28 den 255 doğru sayar ve farklı bir zaman diliminde kesme olur
256-28=228 yani tmr0 her taşmada 0 yapılırsa 256 makina saykılında taşma olur 28 yaparsan 228 makina saykılında taşma olur


proton dersleri bölüm 2 ayrıntılı anlatım var

https://320volt.com/proton-plus-ile-pic-programlama-bolum-2/


alttaki bölümü incemen iyi olur bu tabi benim görüşüm


Yukarda Kullanılan TMR0 ile yapılan kesmenin zamanı 500 milisaniyedir. Gelin isterseniz bunu beraber hesaplayalım.

proton formul 1

Yukardaki Çözümde PIC in komut işleme süresinin (Makine Saykılı) 4Mhz lik Osilatör ile, 1 Mhz Olduğu Hesaplanıyor. Bu hesapla 1 Makine Saykılının süresi proton formul 2 formüle edersek 1uS olarak hesaplarız.

Yukardaki işlemden Sonra şimdi gelelim "Tmr0 ın zaman taşmasının" nezaman oluşacağına. Dikkat ettiyseniz Programın Başında "TMR0=6" ataması yapılmış bu atamayla Tmr0 sayıcısının "6" sayısından başlaması sağlanmıştır.

Böylece Tmr0 ın 250 adım sayması sağlanmıştır(256-6). Ayrıca OPTION_REG = %00000011 ayarlaması ile 1/16 oranı belirlenmiştir. Buradan bizim çıkaracağımız anlam şudur; her 16 makine saykılında Tmr0 sayıcısı 1 artsın.

Burada her 16uS de bir Tmr0 "1" Artacaktır. Ön ayar ile 250 ye Kadar saydırdığımız Tmr0 Zaman =250 * 16= 4000 us` lik zaman biriminde kesmeye girer. Sonuç Olarak Aşağıdaki Formül karşımıza çıkar.

formul3

If SAYI=125 Then
Toggle LED
SAYI=0
EndIf

Programda geçen yandaki komut satırı ile bu kesmenin her 125 defa oluşmasında LED ile tanımlanan PortD.0 numaralı çıkışı durum değiştirir. Aşağıdaki formülle bu durum değiştirme süresi 500mS olarak ayarlandığını görebilirsiniz.


emrah

cevap için teşekkürler, şimdi daha net anlaşıldı

Aziz Arslan

#304
Merhaba.
''deneme'' isimli bir değişkenin içeriğini bir arttırma komutunu satırını ve portb.0 bitini çıkış yapmak için gereken komut satırını söyliyebilirmisiniz ?

t2

''deneme'' isimli bir değişkenin içeriğini bir arttırma komutu:
deneme = deneme+1

portb.0 bitini çıkış yapmak:
low portb.0

fryrmnd

yalınz dikkat edin
low portb.0
ifadesi ile b0 pini low a çekilmiş oluyor.bunu istemezseniz program başında TRISB=0 kullanabilirsiniz. Tabi bu şekilde de tüm b portu çıkış olur. 

emekli

ete  hocam ingilizca 0 olduğundan rapidshare  de dosya acamıyorum üçretli olduğu içinmi aceba

pea

Timer ile birlikte değişen bir değişken üretebiliyor muyuz acaba?
256 sayışta bir artmasın da her sayışta bir artsın.
Bunun en kolay yolu kesmenin sonuna tmr0=255 eklemek sanırım.Ancak bu sefer de kesmeye giriş çıkışta zaman kaybetmiş oluyoruz sanırım.Bu yüzden de bire bir sayış imkansız galiba

ete

@Aziz Arslan,
PortB.0 pinini çıkış yapacak komut,     Output Portb.0  şeklindedir.

@Emekli,
Rapid de dosya açmak terimi sanki Rapid'e bir dosyayı upload edeceksiniz anlamını çağrıştırıyor. İçimdenbir ses Rapid den dosya yüklemek istediğinizi söylüyor.  Hangi dosyayı yükleyecekseniz adresi verinne yapacağınızı söyleyeyim. İllaki İngilizce bilmek gerekmiyor. Yaşnızca bir iki kelime öğrenmeniz dosyayı yüklemeniz için yeterli.

@Pea,
Timerlar gibi seri değer artırımı yapabilen bir değişken üretmek zor. Yapabilirsiniz ama bir Timer gibi sayamaz. Sebebi ise şu, Gerek Timer0 ve gerekese Timer1 sayaçları işlemcinin osilatöründen puls alarak sayma yapabilir. Sizin kullanacağınız değişkende bu kadar hızlı sayabilmeyi sağlayacak bir özellik yok maalesef. Timer değeri her artışta kendi değişkeninizi artırmaya çalışsanız yazdığınız komut satırlarının yarattığı gecikmeler nedeni ile paralel değişim sağlayamazsınız.  Size çok hızlı bir sayım gerekmiyor ise enkolay yolu en kısa aralıklı bir Tmr0 kesmesi oluşturup kesme oluştuğunda sayacınızın değerini bir artırmak olabilir. Bu ise ortalam 100 çevrimde bir değer artırmak şeklinde yorumlanabilir. Çalışma frekansını artırırsanız süre dahada kısalacaktır. Biliyorsunuz 18F serisi 48Mhz de PLL yardımı ile çalışabilmektedir. Bu frekansta istediğinize yakın bir değer elde etmeniz mümün. Bu ihtiyacın nerden kaynaklandığını pek anlamadım ama ihtiyacın sebebini söylerseniz belki başka bir çözüm bulunabilir.

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

pea

@ete
Cevabınız için teşekkür ederim :)
Aslında ihtiyaçtan öte merak ettim.Visual Basic biliyorum , arada sırada aklım oraya gidiyor.VB'te timer'a değişken atama vardı da.

Klasik PWM ile RGB led sürme uygulaması yapmak/öğrenmekle uğraşıyorum.12f675'in dahili osilatörünü kullanıyorum ve 15Hz'e ulaşabiliyorum.
Ana programı yarıda kesmeyecek şekilde timer'ı kısalttım.Kesme'de de sayaç ve if döngüleri var(sizin derslerinizdeki rgb pwm döngüsü).Sanırım bu döngüler çok fazla saykıl gerektiriyor.Assembly dosyasını açıp satırları saydım , 50 satır civarı çıktı.Timer'ı da 100 saykıl civarına ayarladım.
4Mhz/4(dahili osilatör) / 100(%100 duty için) / [50(kesme içi) + 100(timer)] = 66.7Hz oluyor.
Prescaler'da aldatmaca var demişsiniz , o bölümü tam anlamadım ama 1/2 bölme olsa bile 33Hz olur.Ben ise 15Hz çıkış alıyorum.

Assembly'deki komutları mı yanlış sayıyorum yoksa fazladan bölen bir şey daha mı var?
Bir de harici osilatör dışında mantıklı bir hızlandırma elde edemem sanırım , doğru mudur?

Teşekkürler

ete

Bana kalırsa 12F675 ile aynı kılıfa sahip olan ve piyasada bulunabilen 12F683 kullan. Bu işlemcide HPWM modülü bulunmaktadır. Kullanımı gayet kolaydır ve rahat edersin. Tmerlar ile uğraşmadan istediğin frekansta (min 245 Hz max 100Khz ) PWM sinyalini ilgili pinden çıkartırsın.

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

pea

12f683 benim de listemdeydi ancak tek kanal pwm olduğu için çok çekici gelmemişti.
Bana gereken 3 kanalı bu tek pwm'den de-multiplexer entegreleriyle mi elde ederim?

ete

3 kanal gereken yerde tek kanal paylaşımlı kullanılamaz. En azından R-G-B nin farklı duty değerleri olması gerekir.
Bu durumda ya 3 adet HPWM çıkışıolan bir işlemci kullanacaksın yada kesme yolu ile bu sinyalleri elde etmeye çalışacaksın demektir. Başka çare yok.

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

pea

Siz önerince bir yolu var sanmıştım , tüh.
De-mux ile duty'lerini 1/3 oranında azaltmış olacağımı fark ettim.Hatta ilk denememde tecrübe de etmistim :D
Çözünürlüğümü 100'den 32'ye indirerek 45hz'lik bir sinyal elde etme kararı aldım.
Yardımınız için çok tesekkur ederim