timer0 da 0-255 arasını ölçmek

Başlatan forumsad, 21 Temmuz 2011, 09:25:49

forumsad

arkadaşlar timer0 0layını araştırdım biraz diyorki aktif edildiğinde 0-255 arasında sayar 255 olunca kesme etiketine gider   bu şekilde bir örnek buldum
çalışıyor örnek ekde
Device 16F877 ;ENTEGRE TANIMLAMA
Xtal 4 ;KRISTAL FREKANSI 
'------------------------------------------------------------------------
All_Digital=TRUE 'tüm çikislar djital acik 
TRISA=%00000000
TRISB=%00000000  'PORTB7 GIRIS DIGERLERI ÇIKIS OLSUN
TRISC=%00000000
TRISD=%00000000  'portd.2 çıkış
TRISE=%00000000

PORTA=0 
PORTB=0 
PORTC=0 
PORTD=0
PORTE=0


'LCD TANITMA BOLÜMÜ.....................................................................................
DEFINE LCD_DREG		PORTB	    'LCD data bacaklari hangi porta bagli? portb
DEFINE LCD_DBIT		PORTB.4		'LCD data bacaklari hangi bitten basliyor? portb.4 den itibaren
Declare LCD_ENPin   PORTB.3     'LCD "E" pin portb nin hangi bitine baglidir.
Declare LCD_RSPin   PORTB.2     'LCD "RS" pin portb nin hangi bitine baglidir.
DEFINE LCD_BITS			4		'LCD 4 bit  olarak bağlı

'-----------------------------------------------------------------------
'timer0 ayarlari
On Interrupt GoTo KESME 'kesme oluşursa KESME adlı etikete git. 
OPTION_REG=%10000111 'Pull up dirençleri iPTAL-/-Bölme oranı 1/256 
INTCON=%10100000     'Kesmeler aktif,"-", ve TMR0 kesmesi aktif 

TMR0=0  'timer0 sıfırla register

'-----------------------------------------------------------------------
'değişkenleri tanımla.........
SAYAC          VAR   Byte

Clear  'tüm değişkenler sıfırlandı


basla:

'LCDOUT $FE,1
LCDOUT $FE,2,Dec2 SAYAC
DelayMS 500
GoTo basla





Disable
KESME:

 SAYAC=SAYAC+1  	    'kesme sayacı   (Tmr0) x 256 (bölme)


INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
Resume
Enable
GoTo basla

End



0-255 arasındaki değerleri bir değişkene nasıl atarız ???

Tagli

TMR0 register'ını okuyarak timer0'ın o anki değerini görebilirsin. Buna neden ihtiyaç duyuyorsun?
Gökçe Tağlıoğlu

forumsad

#2
2 fotosel arasından malzeme geçiş süresini ölçeceğim malzeme 1 sn altında ğeçiş yaapıyor

say=TMR0
LCDOUT $FE,2 Dec2 say

bu şekilde almaya çalışıyorum ama lcd ye yazdırma bölümü hata veriyor

Tagli

#3
Derleme hatası mı alıyorsun yoksa çalışma sırasında program beklenmedim bir şekilde mi çalışıyor? Derleme hatası alıyorsan derleyicinin verdiği hatayı buraya yaz.

Ayrıca, yapmayı düşündüğün iş için capture modülünü kullanmak da faydalı olabilir. Ben şu ana kadar hiç kullanmamış olduğum için deneyim sahibi değilim, ama bana sanki senin işini görebilirmiş gibi geldi.

Proton'un LCD yazdırma fonksiyonlarını bilmediğim için o konuda pek yardımcı olamayacağım. Ama yapman gereken şeyin normal bir değişkeni yazdırmaktan farklı olmaması lazım. Hatta ilgili fonksiyonun TMR0'ı doğrudan da yazdırabilmesi gerekir.
Gökçe Tağlıoğlu

subram

Alıntı yapılan: forumsad - 21 Temmuz 2011, 09:47:08
2 fotosel arasından malzeme geçiş süresini ölçeceğim malzeme 1 sn altında ğeçiş yaapıyor

say=TMR0
LCDOUT $FE,2 Dec2 say

bu şekilde almaya çalışıyorum ama lcd ye yazdırma bölümü hata veriyor

şöyle yaparsan belki daha düzgünn olabilir

LCDOUT $FE,2 Dec3 TMR0
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

forumsad

veya şöyle yapabilirmiyiz her 10mikro saniyede timer kesmesi oluşsun

bu arada yazdırma işini
Print At 1,1,Dec say  şeklinde yazdırdım oldu  aslında lcd de 0-255 arası rakam görmem gerekirken 700 lü rakamlar bile gözüküyor

forumsad

aslında timer0 milisaniye şeklinde ayarlayabilsem benim işimi görür yani her mili saniyede kesmeye gitse benim için yeterli

capture olayını bir araştırayım ne olduğunu bilmiyorum




subram

#7
benim dediğim gibi deneyin birde. merka ettim ne olacak.

10uS için OPTION REG=10000000 olmalı.

tmr0'da 251  değerini yüklersen sanırım 10 uS de bir kesme oluşur

1 milisaniyeiçin OPTION REG=10000001 olmalı.

tmr0'da 6  değerini yüklersen sanırım 1 mS de bir kesme oluşur

http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

forumsad

OPTION_REG=%1000010 
bu şekilde kullandım oldukça hızlı sayıyor  hız fazla gelirse sonra bölme oranını yükseltirim

şimdi portb change kesmesi ekleyip timer0'ı başlatmayı ve durdurmayı deneyeceğim  takipde kalırsan sevinirim

subram

#9
Alıntı yapılan: forumsad - 21 Temmuz 2011, 10:12:46
OPTION_REG=%1000010 
bu şekilde kullandım oldukça hızlı sayıyor  hız fazla gelirse sonra bölme oranını yükseltirim

şimdi portb change kesmesi ekleyip timer0'ı başlatmayı ve durdurmayı deneyeceğim  takipde kalırsan sevinirim

OPTION_REG=%1000010   bu durumda kesme oranı 1/8 bu demk ki 8*256=2048 yaklaşık 2mS de bir kesme oluşuyor demek.

OPTION_REG= ilk üç biti için kesme değerler
3.bit     2.bit     1.bit          kesme oranı
0             0          0                    1/2
0             0          1                    1/4
0             1          0                    1/8
0             1          1                    1/16
1             0          0                    1/32
1             0          1                    1/64
1             1          0                    1/128
1             1          1                    1/256
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

forumsad

BİR SORUN ÇIKTI portb change kesmesi açılışta çalışıyor çakılı kalıyor

'****************************************************************
'****************************************************************
Device 16F877A ;ENTEGRE TANIMLAMA
Xtal 4 ;KRISTAL FREKANSI 
'------------------------------------------------------------------------

TRISA=%11111111
TRISB=%11110000  'PORTB0 GIRIS DIGERLERI ÇIKIS OLSUN
TRISC=%10000000
TRISD=%00000000
TRISE=%00000000




'PB4-7 change kesme ayarlari------------------------------------------------------
On_Hardware_Interrupt GoTo KESME     'Hardware interrupt Olusunca INT ye git
OPTION_REG = %00000000 'INTERRUPT KÖSE DURUMU düşen kenar
INTCON  =%10001000     'global kesme aktif,portb4-7 change kesmesi aktif




'//////////////////////////////////////////////////////////////////////////
'çikislari temizle 
PORTA=0 
PORTB=0 
PORTC=0 
PORTD=0
PORTE=0




'__________________________________________________________________________________________________
BASLA:
'*****************************************
Enable             'kesme devrede 
'*****************************************
DelayMS 50
PORTC.1=0



DelayMS 100





GoTo BASLA

'/////////////////////////////////////////////////
'/////////////////////////////////////////////////
'/////////////////////////////////////////////////



'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
KESME:
Disable            'kesmeyi pasif
Context Save                'kaldığı yeri sakla 
PORTC.1=1




INTCON.0=0 
Context Restore             'tüm kyıtlı reg. tekrar yüklenip keseden çıkılıyor      	
Enable
GoTo BASLA
'-------------------------------------------------------------------------------------------------------------




End

subram

BASLA etiketinin altındaki ENABLE komutunu silersen olur galiba.
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

forumsad

#12
'****************************************************************
'****************************************************************
Device 16F877A ;ENTEGRE TANIMLAMA
Xtal 4 ;KRISTAL FREKANSI 
'------------------------------------------------------------------------

TRISA=%11111111
TRISB=%11110000  'PORTB0 GIRIS DIGERLERI ÇIKIS OLSUN
TRISC=%00000000
TRISD=%00000000
TRISE=%00000000

'LCD TANITMA BOLÜMÜ.....................................................................................
Declare LCD_DTPin PORTC.4		'DATA girişi PORTC'nin 4. ucundan başlayacak
Declare LCD_ENPin PORTC.3
Declare LCD_RSPin PORTC.2
Declare LCD_Interface 4
Declare LCD_Lines 4			'LCD 4 satırdan oluşuyor


'PB4-7 change kesme ayarlari------------------------------------------------------
'On_Hardware_Interrupt GoTo KESME     'Hardware interrupt Olusunca INT ye git
On Interrupt GoTo KESME 'kesme oluşursa KESME adlı etikete git.
OPTION_REG = %00000000 'INTERRUPT KÖSE DURUMU düşen kenar
INTCON  =%10001000     'global kesme aktif,portb4-7 change kesmesi aktif




'//////////////////////////////////////////////////////////////////////////
'çikislari temizle 
PORTA=0 
PORTB=0 
PORTC=0 
PORTD=0
PORTE=0




'__________________________________________________________________________________________________
BASLA:
'INTCON.7=1
'INTCON.3=1 
DelayMS 100
PORTD.1=0
LCDOUT $FE,1,"merhaba"                     'Dec3 TMR0

PORTD.1=1
DelayMS 200
PORTD.1=0


DelayMS 100





GoTo BASLA

'/////////////////////////////////////////////////
'/////////////////////////////////////////////////
'/////////////////////////////////////////////////



'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
KESME:
'RBIF=1   
'GIE=0    
Disable            'kesmeyi pasif
'Context Save                'kaldığı yeri sakla 
PORTD.1=1
LCDOUT $FE,2,"kesme"                     'Dec3 TMR0





INTCON.0=0
'RBIF=0   'INTCON.0=0 
'GIE=1    'INTCON.7=1
'Context Restore             'tüm kyıtlı reg. tekrar yüklenip keseden çıkılıyor      	
Enable
GoTo BASLA
'-------------------------------------------------------------------------------------------------------------




End



olmuyor valla bu reğister ayarlarından nefret ediyorum

pcb

#13
öncelikle ne yapmak istediğinizi anlamaya çalışıyorum, 2 fotosel var, ürün birinci fotosel e gelince timer saymaya başla ikinci fotosel e gelince timer sayması dursun ekranda ne kadar sürede geldiği gösterilsin mi ?
1saniyeden daha kısa sürede ikinci fotosel e gelmesi gerekiyor, kısıt 1sn anladığım kadarı ile.
fotoseller portb ye bağlı external interrupt olarak ayarlanacak


neden timer0 - 8 bit kullanıyorsunuz onu anlamadım

forumsad

hocam aynen öyle örneklersek yan yana çalışan 2 adet yürüyen merdiven düşünün hızlarının yüksek olduğunu düşünün merdivene adımını atan kişi 1 sn nin altında  yukarıya çıkıyor şimdi bu kişinin kaç mili saniyede yukarıya çıktığını bulmam lazım...

bu işi portb nin change kesmesini kullanarak yapabileceğimi söyledi arkadaşlar

şöyleki fotoselin birini portb.7 ye bağlı olanı merdivenin girişine ikinci fotoseli merdivenin bitine portb.6 ya bağlı olanı yerleştirisem  ne olur

şahıs merdivene adımını attığında ilk fotosel tetiklenir timer0 saymaya başlar ikinci fotossel tetiklendiğinde timer0 durur timer0 ın değeri
bize kişinin kaç milisaniyede yukarıya çıktığını vermez mi !!!!!

aynı olayı iniş merviveninede uygulayacağım portb.5 ve portb4 foteselleride ona bağlanacak timer2 kullanılacak



yapmaya çalıştığım bu !!!!2 gündür ugraşıyorum artık bir arkadaşın desteği olmadan yapmam imkansız gözüküyor....bu konuda bana yardımcı olmanızı
rica edeceğim

kahveyi boşverin bu olayı çözün 40 yıl köleniz olayım  :)

saygılarımla