role kontrolü

Başlatan cann, 15 Haziran 2012, 12:56:21

cann

3 analog girişteki voltajları karşılaştırarak, 2 roleyi belirli değerler de açop kapamak istiyorum

mcp de yazmaya çalışıyorum ama if komutunu bad expresion veriyor; akış diyagramımı yanlış acaba?

@ DEVICE pic16F877a
@ DEVICE pic16F877a, WDT_ON
@ DEVICE pic16F877a, PWRT_ON             
@ DEVICE pic16F877a, PROTECT_OFF
@ DEVICE pic16F877a,  HS_OSC
TRISA.0 = 1
TRISA.1 = 1
TRISA.2 = 0
TRISA.3 = 1
TRISA.5 = 0
TRISC = 0
TRISD = 0
ADCON1 = %00000101


''''''''Variables''''''''''
fb var word
rl var word
ref var word


define ADC_BITS 8
DEFINE ADC_CLOCK 2
DEFINE ADC_SAMPLEUS 100
'''''''''''''''''''''''''''''''
adcin 0, fb
ADCIN 1, rl
ADCIN 3, ref

if

(fb-ref) >125 and (fb-ref)<100

TRISA.2 = 0
(rl-ref)>125 and (rl-ref)<100
TRISA.5 = 0
else
TRISA.2 = 1
TRISA.5 = 1
goto
basla
end if

tyildizak

if-else'li ifadenizin içinde 3 koşul var, oysa iki koşul olmalı:

1.  (fb-ref) >125 and (fb-ref)<100 
2.  (rl-ref)>125 and (rl-ref)<100
3.  else

(rl-ref)>125 and (rl-ref)<100 TRISA.5 = 0 kısmını ayrı bir ifade ile yazmak gerekir.

My75

#2
Röleler nerede?? yani çıkış yapmak için Tris değilde port olmalı..Tris sadece ilgili portu giriş çıkış yapar..Aşağıdaki gibi düzenlersen kafan karışmaz..

Öylesine yazıyorum,gerekli düzenlemeleri sen yaparsın..

ROLE1   VAR  PORTB.0
ROLE2   VAR  PORTB.1

BASLA:
ADCIN 0, fb
ADCIN 1, rl
ADCIN 3, ref

IF (fb-ref) >125 and (fb-ref)<100 THEN
HIGH ROLE1
ELSE
LOW  ROLE1
ENDIF

IF (rl-ref)  >125 and (rl-ref)<100  THEN
HIGH ROLE2
ELSE
LOW ROLE1
LOW ROLE2
ENDIF

GOTO BASLA

END

Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

cann

teşekkürler cevaplar için
role çıkışı için RA2 ve RA5 i düşünmüştüm.
ADCON1=%00000101 İLE ayarladım sanıyordum, transistör beyzine gidecek akımı

gareven

bi de program kodları kod etiketi içinde yazarsan foruma arkadaşlar daha kolay yapdımcı olabilirler, değişken, sabit vs farklı renklerde çıktığı için görmesi daha rahat oluyor.

cann

öneriler için teşekkürler

ADCON1 = %00000101
define ADC_BITS 8
define ADC_CLOCK 2
define ADC_SAMPLEUS 100

role1   VAR  PORTA.2
role2   VAR  PORTA.5
fb var word
rl var word
ref var word


önerileriniz doğrultusunda düzenledim, roleler adc kontrolü ile çalışıyor, ancak 8 bits yazdığım halde, role kontrol aralığı hesapladığım gibi olmuyor,
define adc_bits8 işlev görmüyor sanki, hangi aralıkta kendisini nasıl hesaplıyor anlamadım.

cann

?
8 bits yazdım ama voltaj aralığına cevabı 8 bit değil

ete

Bir ADC kanalının 8 bit çalışması için iki şey gerekir.
Birincisi ADCON1 registerinin 7 nolu biti "0" olmalıdır.
İkincisi define tanımlalarından bit 8 olarak verilmelidir.
Verdiğin kodlara bakıyorum ikiside yapılmış durumda . O halde ADC okuması 8 bit olmalıdır. Başka yolu yok.
Bir diğer konuda madem 8 bit okuma yapılacak ham okuma değişkenide Byte cinsiden olmalı daha uygun olur.
Sende word olarak duruyor.

Voltaj aralığındaki cevabı 8 bit değil derken alınan neticeleri yazarsan daha iyi anlayabiliriz. Yada direk okunan değerleri ekrana yazdır yada ne bileyim isisde değişken olarak onları takip etmeye çalış ne değer aldıklarını gözlemle. Böylece kolaylıkla neler olup bittiğini görebilirsin.

Diğer bir konu ise Pic16F877A da A portu önseçimli (default ) olarak komparatör şeklinde açılır. Şayet önlem almaz isen o pinler komparatör olarak çalışırlar. Halbuki sen ADC pinleri olarak kullanmak istiyorsun . O halde programına ;
CMCON=7 komutunu ilave etmen gerekiyor.
Muhtemelen yanlış okuma sonuçları bu komutun eksikliğine bağlı olabilir.
Ete

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

cann

teşekkürler ETE. isisde takip ettim.

potasiyometre 0 volt ve 5 volt aralığında, adc ise 0-256 aralığında. neden 512 değil anlamadım. hesapları 0-256 üzerinden yapınca roleyi istediğim aralıkta off-on yapabiliyorum. 8 bit olduğu halde 0-256 aralığında çalışmasını anlamadım.

teşekkürler

ferit06

8 bit == 0-255 olduğundan

cann

kafa kalmadı walla
nedense kafayı takmışım 512 ye
tşk