Pic'e gelen gerilim değerine göre led yakıp söndürme

Başlatan blueboard, 05 Temmuz 2026, 15:17:41

blueboard

Ete Hocam, bir kontrol ünitesinde 7 adet buton var. Kontrol ünitesi basılan butonlara göre tek kablo üzerinde farklı gerilim değerlerinde çıkış veriyor. Hiç bir butona basılı değilken çıkış kablosu üzerinde 0,14 volt gerilim var. Biraz önce belirttiğim gibi basılan butona göre kablodaki gerilim değeri değişiyor. Toplam 7 adet buton var. Her buton basıldığında gelen gerilimi ölçerek 16F1827'nin belirlediğim pininden çıkış alarak röle vb. bir elemanı kontrol etmek istiyorum. Çizimimde görsellik olması açısından her çıkış pinine bir adet led bağladım. Program yazdım ama programda sorun var. Örneğin  1,07 volt uygulandığında ilgili led yanıyor ancak butondan elimi çektiğimde sönmüyor. Programı yazarken mantık olarak yanma-sönme komutlarını da yanlış düşünmüş olabilirim. Mümkünde programı kontrol eder misiniz. Dosyaları ekliyorum.

Acaba butona basılı olduğu sürece ilgili ledi yakmak için when while komutu kullansaydım daha mı iyi olurdu?

Pepe

prueba esto tambien

Select Case HAMA
     
     Case 46 To 163 
      PORTB.0 = 1
     Case 185 To 265 
      PORTB.1 = 1
      Case 283 To 347
      PORTB.2 = 1
      Case 369 To 429
      PORTB.3 = 1
      Case 451 To 511
      PORTB.5 = 1
      Case 533 To 613
      PORTB.6 = 1
      Case 635 To 817 
      PORTB.7 = 1
      Case Else 
      PORTB = 0 
    End Select

ete

Aslında programın doğru çalışıyor.
Yapman gereken şey Pic analog girişi ile GND arasına 22K lık bir direnç bağlamak. Bu anlamsız voltaj kaçaklarını önler ve girişin stabil çalışmasını sağlar.
Bu direnci bağla ve tuşlara bas. Bu şekilde ledlerin tuşları bıraktığında söndüğünü göreceksin.
22K büyük değerli bir direnç olduğu için butonlar ile giren voltajları etkilemeyecektir. Hatta direnci biraz daha büyütebilirsin. 33K veya 39K gibi değerleride deneyebilirsin.

Ete

blueboard


onurinci

@blueboard

verdiğin dosya derlenemiyor sanırım eksik.

Select Case ifadesi arkasında bir veri barındırmalı..

onurinci

Pepe hi...

Assembler Message ?

: MESSAGE: (DEFINE ADC CLOCK is ignored for this device. Set appropriate SFR.)

blueboard

#6
Alıntı yapılan: onurinci - 07 Temmuz 2026, 19:00:54@blueboard

verdiğin dosya derlenemiyor sanırım eksik.

Select Case ifadesi arkasında bir veri barındırmalı..
Select Case kısmını sonradan Pepe'nin yazdıkları ile değiştirdim. Döngü daha hızlı çalışır diye düşündüm.
Aşağıya benim yazdığım şekli ekliyorum.
ADCIN 1,HAMa           'HİÇ BİR TUŞA BASILI DEĞİLKEN 0.14 VOLT GERİLİM VAR
IF HAMA > 45  AND HAMA < 164   THEN  PORT.1=1 
IF HAMA < 40  AND PORT.1=1 PORT .1=0
IF HAMA > 184  AND HAMA < 266   THEN PORT.2=1 
IF HAMA < 40  AND PORTB.2=1 THEN  PORTB.2=0

IF HAMA > 282  AND HAMA < 348   PORTb.3=1   
IF HAMA < 40  AND PORTb.3=1 THEN  PORTB.3=0

IF HAMA > 368  AND HAMA < 430 THEN PORTb.4=1     
IF HAMA < 40 AND PORTB.4=1 THEN PORTb.4= 0   


ete

IF satırları fazla olmadığından dolayı select case kullanmak sana çok büyük fayda sağlamayacaktır. Burada önemli olan derlemeden sonra kaç byte kullanıldığıdır.
Hangi sistem derleme sonrası daha fazla byte kullanıyor ise o program daha fazla zaman harcar.
Kısa olan derlenmiş programlar her zaman tercih edilmelidir.

Onur, galiba Define ADC_CLK açıklamasını merak ediyor. Bunun açıklaması şöyle. Genelde bir çok işlemcide ADC okuma için kullanılacak CLK seçimi Define komutu ile yapılabiliyor. Ancak bu işlemcide yapılamıyormuş. Bu nedenle ilgili FSR yani Special Function Register bitlerini ayarlayarak bunu yapın diye bir ikaz veriliyor. Bu işlemcide (16F1827) bu işle ilgili FSR ADCON1 registeridir. (Data Sheet Sayfa-31) Bu registerin 6-5-4 nolu bitleri bu işi yapmaktadır. İşlemci OSC frekansına uygun bir değer bu bitlere değer verilerek ayarlanmalıdır.

Gerek if satırları kullanarak ve gerekse Select case komutu kullanıldığında aralıkların doğru verilmesine özen gösterilmelidir. Arada tanımlanmamış bölge olmamasına dikkat edilmesi gerekir.
Örnek vereyim.
 If HAMA > 45 And HAMA < 164 Then  komut satırı adc den okunan değerin 45 den büyük ise ve 164 den küçük ise şeklinde bir belirleme ile 46-163 aralığını kontrol altına almaktadır. Bir sonraki komutun aslından IF HAMA 163> şeklinde başlaması gerekir. Ama bakıyorum ikinci komut,
ElseIf HAMA > 184 And HAMA < 266 Then şeklinde 185-265 aralığını kontrol etmektedir.
Bu durumda kontrol edilmeyen bir aralık olduğu kolaylıkla görülebilir. Beklenen voltaj değerine bağlı ADC okumaları bu kontrol edilmeyen aralığa denk gelmeyeceği düşünülüyor olabilir ama bu düşüncenin yanlış olduğunu söylemem gerek. Mümkün olduğunda kontrolsuz aralık bırakılmamalıdır.

Ete

onurinci

Hocam selam bütün gece FSR uyarısana taktım, sayenizde öğrendim.

ikinci şık ise @blueboard arkadaşın verdiği programı derleyemiyorum.
Case satırlarına syntax hatası veriyor. Case select değer tanımlanmamış ,
 ADC'yi nereden okuyacak değişken yok .
nasıl derlemiş olabilirki , ben aynı programı IF komutları ile yazmıştım sorunsuz çalışmıştı, Case Select ile bir örneğin elimde olmasını isterdim.
sizden ricam arkadaşın kodunu derleyebilirmisiniz ,derleniyormu merak ettim..

blueboard

#9
Onur bey, Ete Hocama gönderdiğim ilk PBP dosyasını ve Hex dosyasını şimdi tekrar ekliyorum. İsis'te de Ete hocamın dediği gibi GND ile Analog giriş arasına 22 K direnç ilave ettim. PBP dosyasını kontrol ettim, sorunsuzca derleniyor.

blueboard

#10
Bu arada benim makinam 32 bit. Sizin makinanız 64 bit ise konfigürasyon satırlarını kendi makinanıza göre düzenlemeniz gerekir.

ete

Programlara bakıyorum da içinde Select Case komutu olan bir program göremedim ben.
Yalnızca Pepe programın yalnızca bir kısmını vererek orada Select Case kullanmış. Aslında o komut öncesinde ADCIN 1,HAMA  komutu olması gerek ve buda ilk programdan alınacak diye düşünüyorum.

Select Case HAMA şeklindeki tanımlama doğru. Burada HAMA nın aldığı değerlere bağlı olarak yapılması gerekenler komutun altında yer alıyor zaten.
Ancak Pepe ninvermiş olduğu örnek çalışabilir değil maalesef.
Case 369 To 429 şeklindeki komut Basic de kullanılmıyor. Derleyici bunu kabul etmiyor.
Doğru şekli şöyle olabilir.
Case is>369 and is<429
Bu nedenle aralık vermek gerektiğinde Select Case komutunun kullanılması pek mantıklı gelmedi bana.
Bu arada doğru select case satırlarınıda vermiş olayım
Select Case HAMA
	     
	  Case is>369 and is<429
	      PORTB.0 = 1
	  Case is>185 and is<265 
	      PORTB.1 = 1
      Case is>283 and is<347
	      PORTB.2 = 1
      Case is>369 and is<429
	      PORTB.3 = 1
      Case is>451 and is<511
	      PORTB.5 = 1
      Case is>533 and is>613
	      PORTB.6 = 1
      Case is>635 and IS<817 
	      PORTB.7 = 1
      Case Else 
	      PORTB = 0 
	    End Select
Ete

onurinci

hocam ilk defa derleyici Bad expresion be bank hataları verdi bu programı derlemiyor. acaba içinde text parçalarımı var diye inceledim ve bulamadım. bazen HTML sayfasından kopyalarken bir şeyler bulaşabiliyor. derleyemediğim program.

ASM
  __config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_ON & _CPD_ON & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_ON & _FCMEN_ON
  __config _CONFIG2, _WRT_ALL & _PLLEN_ON & _STVREN_ON & _LVP_OFF & _BORV_19 &  _LVP_OFF
ENDASM



DEFINE OSC 4
OSCCON= %11110000   'PLL enabled, Internal RC-8MHz

DEFINE ADC_BITS 10 ' 10 bit ADC dönüşüm
DEFINE ADC_CLOCK 1
DEFINE ADC_SAMPLEUS 5 ' 5 uS A/D sample time

TRISA = %00000010            
PORTA=0
            
PORTB=0
TRISB = %00000000   'portb tamamaı ÇIKIŞ

ANSELA =%00000010       
ANSELB =%00000000   
ADCON0 =%00000011         
ADCON1=%10010000          'sağa yaslı, clock = fosc/8
FVRCON=%11000011
 
DACCON0 = 0
DACCON1 = 0
INTCON = 0
CM1CON1 = 0
CCP1CON=0
CCP2CON=0
HAMA  VAR WORD
         

BASLA:

pause 100
    ADCIN 1,HAMA           'HİÇ BİR TUŞA BASILI DEĞİLKEN 0.1 VOLT GERİLİM VAR
    Select Case   HAMA
    
    
Select Case HAMA
	     
	  Case is>369 and is<429
	      PORTB.0 = 1
	  Case is>185 and is<265 
	      PORTB.1 = 1
      Case is>283 and is<347
	      PORTB.2 = 1
      Case is>369 and is<429
	      PORTB.3 = 1
      Case is>451 and is<511
	      PORTB.5 = 1
      Case is>533 and is>613
	      PORTB.6 = 1
      Case is>635 and IS<817 
	      PORTB.7 = 1
      Case Else 
	      PORTB = 0 
	    End Select
    
 

GOTO BASLA

END


hata kodu :Mesaj [301] C:\PROGRAM FILES (X86)\PBP3 1\PBPPI14E.LIB 6204 MESAJ: (ADC SAATİNİ TANIMLA bu aygıt için yok sayılır. Uygun SFR'yi ayarlayın.)

[ASM HATASI] KONTROL.ASM (145): Önceki adres içeriğinin üzerine yazılıyor (8007)

[ASM HATASI] KONTROL.ASM (146): Önceki adres içeriğinin üzerine yazılıyor (8008)

onurinci


Pepe

No uso pbp , en positron basic si se usa
El select case con to como lo mostré en el ejemplo, no sabía que pbp no lo acepta

Powered by EzPortal
▲