Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

zaman

Başlatan turkbowling, 28 Temmuz 2006, 06:32:16

turkbowling

aradım ama bişey bulamadım

diyelimki bitane sayıcımız var sayıcıda swichden gelen iki sinyalin arasıda ne kadar süre geçtigini nasıl buluruz

örnegin dügmeye bastık motor 180 derece döndü ve durdu sayıcı 44 kez saydı motorun baslamasıyla durması arasındaki geçen zamanı saycının gönderdiği sinyaller arasındaki zamanı toplayarak bulmak istiyorum.

teşekkürler

ete

Kullandığın mikroişlemciye bağlı olarak hassas bir zaman sayımı yapmak istiyor isen 16 bitlik TIMER2 sayacını kesme kullanarak çalıştır.
Bunun için
- TIMER2 kesmesini aktif yap,
- Timer2 sayacı için dahili clock beslemesini seç ,
- Motor a start verdiğin zaman TMR2 sayacını sıfırla ve sayacı çalıştır.
- Motor stop ettiğinde TMR2 yi kapat veya Timer2 deki değeri başka bir değişkene aktar.
Böylece arada geçen süreyi hassas bir şekilde ölçmüş olursun.
Timer2 sayacı 16 bit çalışır maksimum alabileceği değer 65535 dir.
Kullanacağın kristale bağlı olarak her bir clock sinyali için geçen süre bellidir.
4 MHz de 1 mikro sn. (us)
10 MHz de 0,4 us (400 nanosaniye)
20 MHz de 0,2 us (200 nanosn) dir.
diyelimki senin süren 65535'i geçiyor. Bu durumda timer2 sayacı her 65535'i geçtiğinde kesme oluşur ve bu kesme bölümünde sende ikinci bir değişken'i ki BYTE değişkeni olabilir bir artırırsın. Buna tam diyelim.
Sonuçta TAM=50 olsun ve Timer2=200 olsun. Senin süren şu şekilde hesaplanmalıdır.
Süre= tam x 65536 + Timer2 = 50 x 65536 + 200 :3.277.000 komut süresi
Buna göre 4 MHz de 3.277.000 us lik bir süre geçmiş olur. Yani 3,277 saniye lik bir süredir. Uzun gibi görülüyor ama aslında kısa bir süre.
10 MHz de ise 3.277.000 x 0,4=1.310.800 us = 1.310,8 ms=1,3 sn.
20 MHz de ise 3.277.000 x 0,2=655.400 us = 655 ms = 0,6 sn.

Bu sistem ile ölçebileceğin en uzun süre ;
255 x 65536 +255 = 16.711.000 komut süresi olup;
4 MHz de yaklaşık 16 sn.
10 Mhz de             6,6 sn
20 Mhz de ise       3,3 sn dolayındadır.

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

Logan

Hangi programlama dlini kullanığını yazmamışsın.Ben asm kullandığını varsayarak yazıyorum.Devreni tam olarak anlayamadım ama mantığı şu şekilde olmalı;Diyelim ki motor 270 derece döndü ve bu esnada 68 sinyal aldın.Sinyaller arasındaki zamanı ölçmek için, programı kısır döngüye sokmalı ve bu kısır döngü içinde atadığın herhangi bir registeri sürekli arttırıp,daha sonrada kullandığın kristale göre komut işleme süresini hesaplayıp, arttırdığın registerin içeriği ile çarpmalısın.Çıkan sonucuda 68 ile çarparsan, motorun 270 dereceyi dönme süresini hesaplayabilirsin. Dahili timer sayıcısını da kullanabilirsin.
İmza.

turkbowling

pic 16f877 ile 12 volt dc araba cam kriko  motorunu kontrol edecegim
derleyici olarak proton kullanıyorum

PROTONUN HELP'İNE BAKTIM FORM2'DA ARATTIM BİŞEY BULAMADIM

PROTONDA BASİT BİR ÖRNEK  KOD YAZAN OLURSA GERİSİNİ BEN GELİŞTİRİRİM

CEVAPLARA TEŞEKKÜRLER..

ete

Aynı iş için çok önceden yazmış olduğum programı aşağıda veriyorum.
Program PBPro da yazılmıştır.
Camın alt ve üst tarafta sona dayanması da kontrol edilmektedir.
Gerekirse devre şemasınıda veririm. Pic 16F628 komparatörleri ile birlikte kullanılmaktadır.

Cam sıkışmasını gerekirse kullanmayabilirsin.
Sistem olarak Opel araçlarının cam açma kapama sistemi örnek alınmıştır.
Cam açma veya kapama butonuna çok kısa (impuls) basılırsa cam motoru on/off olarak çalışmaktadır. Basma süresi biraz fazla olursa cam motoru otomatik komut almakta tekrar basıncaya kadar veya sona dayanıncaya kadar motor çalışmaktadır.

Kolaylıkla Proton'a çevirebilirsin.

Ete

@ device pic16F628, XT_OSC, wdt_off, pwrt_on, mclr_off, lvp_off, protect_off

TRISB=%00000111
TRISA=%00001111
CMCON=5   'RA1 ve RA2 Komparatör diğerleri Digital
MD      VAR BIT   '0=MOTOR STOP , 1= MOTOR RUN
ZAM     VAR BIT   '0=KILIT ZAMANI ULAŞMADI 1= ULAŞTI
TM      VAR BYTE  'MOTOR KILIT ZAMANI
POZ     VAR BYTE  '0=TUSA BASILMADI, 1= TUSA BASILI 2=TUS BIRAKILDI
SURE    VAR word  'CAM KALKMA SURESI
TUS     VAR BYTE
CAM     VAR BYTE  '0=CAM SIKIŞMADI , 1= cam sıkıştı
ASAGI   VAR PORTB.7
YUKARI  VAR PORTB.6
OPTION_REG.7=0

BASLA: 	MD=0:TM=0:POZ=0:ZAM=0:PORTB=0:Low PORTA.0:CAM=0
TUSBAK:	TUS=PORTB & %11:CAM=CMCON.7:Pause 1
         IF TUS<3 Then DURUM ;NORMALDE TUSA BASILMAZ İSE TUS=3 OLUYOR BASILINCA 1 VEYA 2 OLUYOR
        IF MD=0 Then tusbak
		
        IF YUKARI=1 AND SURE>0 THEN
		SURE=SURE+1:endIF
		
        IF ASAGI=1 AND sURE>0 THEN
		SURE=SURE-1:ENDIF

        IF SURE>2500 OR SURE=0 THEN
        CAM=1:LOW PORTB.4
        ENDIF
 
        POZ=2
        IF CAM=1 Then KONTROL
        IF (ZAM=0) OR (POZ=0) Then BASLA
        
        GoTo TUSBAK
        
CALIS:	MD=1:TM=0:POZ=1:ZAM=0:HIGH PORTB.4    'MD=motor durumu MD=0 motor durmuş MD=1 motor çalışıyor
		IF TUS=1 Then
		High ASAGI:EndIF
		IF TUS=2 Then
		High YUKARI:IF SURE=0 THEN SURE=1
        EndIF
        PauseUs 5:GoTo TUSBAK
        
DURUM: 	IF CAM=1 Then KONTROL   ;CAM SONA DAYANDI (NORMALDE CAM=0, SIKISINCA CAM=1 OLUYOR
		IF MD=0 Then CALIS
        IF POZ=2 Then CEK
	    IF ZAM=1 Then TUSBAK
        TM=TM+1:Pause 1:IF TM<150 Then TUSBAK 'TUS KILITLEME ZAMANI TM ILE
        ZAM=1:High PORTA.0:PauseUs 200:IF POZ<2 Then TUSBAK
        GoTo TUSBAK
CEK:	PORTB=0:Low PORTA.0:TUS=PORTB & %011:Pause 2:IF TUS<3 Then CEK
	    GoTo BASLA   'POZ = tuşun hala bsılı olup olmadığı poz=1.basış bırakınca Poz=2 oluyor.

KONTROL: IF ASAGI=1 THEN SON
         IF SURE>2500 THEN SON
         LOW YUKARI:PAUSE 10:HIGH ASAGI:PAUSE 300:LOW ASAGI
SON:    LOW PORTB.4:GOTO BASLA
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

teknikelektronikci

hocam benimde ilgimi cekti ve kendimi gelistirmek acisindan  verdiginiz kodu inceledim fakat sunu anlamadim acaba bu nedir cevabiniz icin tesekürler saygilar
[code]TUS=PORTB & %11  

& su isaret ne anlama geliyor acaba ve %11 noluyor
kusura bakmayin picbasicde yeniyim ve böle bir sey görmedim tesekürler
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

ete

Öncelikle binary yani 2 li sayı sisteminde rakamlar 0 ve 1 lerle ifade edilirler.
%11 demek desimal 3 sayısına tekabül etmektedir.
& işareti bit bazında AND deyimidir (komutudur).
TUS=PORTB & %11  ifadesi ise aslında PORTB AND %00000011  ifadesi ile aynıdır. Şimdi bunun ne anlama geldiğini açıklayalım;
- PortB nin değerini oku, tüm değeri kullanacak yerde yalnızca PortB0 ve PortB1 bize lazım olduğu için diğer pinlerin değerleri bizi ilgilendirmeyecektir.
Bu nedenle PortB değerini %11 ile AND yaparsak yalnızca PortB0 ile PortB1 in değerini alıp TUS değişkenine yerleştirmiş olacağız.
Dahada açıklamak gerekir ise;
1 AND 1 = 1
1 AND 0 = 0
0 AND 1 = 0
0 AND 0 = 0 eşitliklerinden yola çıkarak, PortB.0=1 ise TUS.0=1 olacaktır. Bunun dışında Tus.0=0 olacaktır.
Aynı şekilde PortB.1=1 ise Tus.1=1 olacak bunun dışındaki değerlerde Tus.1=0 olacaktır.

Sanırım anlaşılmıştır.

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

teknikelektronikci

hocam ayrintili acilamaniz icin tesekür ederim
aslinda %11 ifadesi %00000011 ayni demisiniz ben hep bu zamana kadar 00000011 seklinde ifade etigim icin bir an öle görünce anlamadim ;-) sagolun hocam programda & yerine and yazsak olurmu cünkü ben bir kac yazdigim programlarda sirf and yazdim & isaretini kullanmadim  örn: if portb.0=0 and portb.1=0 gibi ilginiz icin tesekürler saygilar
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

ete

Programda bu komutlarda & yerine AND yazarsan olmaz.
AND komutu 8 bitin tamamını AND lemek için kullanılır. Halbuki biz
8 bit ile yalnızca 2 biti karşılaştırıyoruz. Bir yerde bit çekme (2 biti çekiyoruz) işlemlerinde & işareti kullanılır.
Ancak senin belirttiğin şekilde AND kullanılabilir. Yani ;
If portB.0=0 AND PortB.1=0 şeklinde

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

turkbowling

aslında kastettigim şöle bişey basit olarak

16f877 de portb.0 da bir bton var 1 kere bastıgımda zamanı tutmaya başlıyor
tekrar bastıgımda ne kadar süre geçtiyse lcd'ye gönderiyor

btona 2 kere basma arasındaki zamanı bulmak istiyorumdum

teşekkürler