Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Port kontrolü

Başlatan tergek, 16 Ocak 2015, 23:15:34

tergek

Merhaba,
Üzerinde çok araştırdım, bildiğim ölçüde denemediğim kalmadı.

[IMG]http://i58.tinypic.com/20znsed.jpg[/img]
D5 ledini SAĞ tuşu ile,  D4 ledini SOL tuşu ile pic basic ile kontrol ediyorum.
Bir TUŞ diğerini södürüyor. Aynı anda ikisi yanmıyor.

Ve ASIL uğraşım sorum DUR tuşu ile o sırada hangisi açık ise kapatıp, tekrar bastığımda açacak (toggle), bu DUR tuşuna o sırada hangi LEDin açık olduğunu nasıl sorgulatacağım?

Teşekkürler...



Gökhan BEKEN

Picbasic bilmiyorum ama kodları koyarsanız yardımcı olabilirim. Yaptığınız yanlışı tahmin edebiliyorum.
Özel mesaj okumuyorum, lütfen göndermeyin.

M.Salim GÜLLÜCE

Sorgulatmayacaksın.
Program içinde değişken üzerinden aç kapa işlemini yaparsan değişkenin en son değeri açık yada kapalı olduğunu zaten sana verir.
Değişkensiz hafıza olmaz. Değişkensiz yapmayı düşünüyorsan paralel kayıt tutman lazım mesela eprom gibi. O da bir nevi değişken farzedilebilir.
Yazdığın değer neyse orada o bulunur. Tek farkı reset durumunda dahi silnmez(üzerine yeni bilgi yazmadığın sürece).

tergek

#3
ABC:
        if DURTUSU=0 AND LEDSOL=1 then
            TOGGLE LEDSOL
        endif 
        
         if DURTUSU=0 AND LEDSAG=1 then
            TOGGLE LEDSAG
        endif
return

LED:
IF SAGTUS=0 AND DURTUSU=1 THEN
        LEDSAG=0:PAUSE 300:LEDSOL=1             
ENDIF

IF SOLTUS=0 AND DURTUSU=1 THEN
        LEDSOL=0:PAUSE 300:LEDSAG=1             
ENDIF


gosub ABC

goto LED


boyle yazdım. Ancak DURTUSU ile sadece hangisi yanıyorsa onu sorgulatarak sondurebiliyorum ancak en son yananı tekrar yakmak için İF ile neyi şart koşmam lazım ?

Mehmet Bey yukarıdaki kodlarda, değişkenleri ledlerin ikiside DURTUŞU ile södükten sonra nasıl bulacağım ? Tam anlamadım paralel kayıt mı tutmalıyım daha temellerini yeni öğrenmeye başladım nasıl araştırmalıyım?


mehmet

Her led için bir değişken oluşturun. 1/0 durumunu
bu değişkenlerde  tutun. İlgili buton ile de bunların
durumlarını değiştirebilirsiniz.

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

OG

#5
TRISA = %11111111
TRISB = %11100111       ''' cikis 2 pin

buton_sayi var Byte
son_yanan_led var Byte
say_1 var Byte

buton_basili VAR Bit
yanan_var VAR Bit

sag_deger var %00001100
sol_deger var %00001010
dur_deger var %00000110

sag_yanik var %00001000
sol_yanik var %00010000

PORTB = 0
son_yanan_led = 0
yanan_var = 0

'''''''''''''''''''''''''
ABC:
    GoSub buton_bak                         ''' gecerli bir basim varmi

    If buton_basili = 1 Then                ''' varmis
        If buton_sayi = sag_deger Then      ''' sag tusu basilmissa
            PORTB = sag_yanik
            yanan_var = 1
            son_yanan_led = sag_yanik
            GoSub buton_birak
        EndIf 
            
        If buton_sayi = sol_deger Then      ''' sol tusu basilmissa
            PORTB = sol_yanik
            yanan_var = 1
            son_yanan_led = sol_yanik
            GoSub buton_birak
        EndIf
        
        If buton_sayi = dur_deger Then       ''' dur tusu basilmissa
        
            If yanan_var = 0 Then            ''' dur butonu basildiginde yanik led yoksa
                PORTB = son_yanan_led        ''' son yanmis olani tekrar yak
                yanan_var = 1                ''' artık yanan var
            Else                             ''' dur butonu basildiginde yanik led varsa
                PORTB = 0                    ''' sondur
                yanan_var = 0                ''' artık yanan yok
         
            EndIf
            
            GoSub buton_birak
        EndIf
    EndIf
    
GoTo ABC

'''''''''''
' kontak sıcramaları için 150ms önlem süresi verdik
buton_birak:
    For say_1 = 1 To 150
        pause 1
        GoSub buton_bak
        If buton_sayi <> %00001110 Then buton_birak
    Next
Return
'''''''''''''
buton_bak:
    buton_basili = 0
    buton_sayi = PORTA & %00001110          ''' buton bagli portlari maskeleme yapiyoruz
    
    ''' Yanlizca 1 tanesi basili ise gecerli basim var kabul ediyoruz
    If buton_sayi = sag_deger Then buton_basili = 1
    If buton_sayi = sol_deger Then buton_basili = 1
    If buton_sayi = dur_deger Then buton_basili = 1
Return
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

ete

@ __config _XT_OSC & _WDT_ON & _CP_OFF
define osc 4
porta=0
TRISA=%00001110
PORTB=0
TRISB=%00000000

ESKI VAR BYTE
YENI VAR BYTE
SYMBOL SAG=PORTA.1
SYMBOL SOL=PORTA.2
SYMBOL DUR=PORTA.3
SYMBOL LEDSAG=PORTB.3
SYMBOL LEDSOL=PORTB.4

pause 200


basla:
      IF SAG=0 THEN
        LEDSOL=0
        LEDSAG=1
        ESKI=PORTB     ' &00001000
        WHILE SAG=0:WEND
        PAUSE 50
      ENDIF
      
      IF SOL=0 THEN
        LEDSAG=0
        LEDSOL=1
        ESKI=PORTB
        WHILE SOL=0:WEND
        PAUSE 50
      ENDIF
      
      IF DUR=0 THEN
        YENI=PORTB ^ ESKI
        PORTB=YENI
        WHILE DUR=0:WEND
        PAUSE 50
      ENDIF
      
      GOTO BASLA


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

tergek

#7
Mükemmel bilgiler... mehmet, OG, ete . Teşekkür ederim sayenizde birçok yeni şey öğrendim. Ellerinize sağlık. Devrem tamamlanmış oldu.

mehmet

Bitmiş halini buradan yayınlarsanız, ihtiyacı
olan arkadaşlar da faydalanabilirler...
Hatta bitmiş devrenin resimleri de varsa
daha güzel olur...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

tergek

#9
Alıntı yapılan: mehmet - 17 Ocak 2015, 23:53:43
Bitmiş halini buradan yayınlarsanız, ihtiyacı
olan arkadaşlar da faydalanabilirler...
Hatta bitmiş devrenin resimleri de varsa
daha güzel olur...
Mehmet Bey'in dediği gibi ihtiyacı olanlar için, devrem ilk resimdeki şemanın aynısı , kodlar ise ete Bey'in aynısı şuan için. İsteyenler diğer portlarada yeni ledler yada yeni kombinasyonlar ekleyebilir. Ben öğrenmek için bu şemayı düşündüm. Şuan birşeye hizmet etmiyor.

ete Bey, YENI=PORTB ^ ESKI bu kod işin can alıcı noktası benim için tam olarak hangi alanlarda ^ işareti kullanılıyor ?

İyi günler.

ete

#10
TOGGLE denilince aklıma hemen XOR operatörü gelir. "^" işareti de bit bazında XOR işlemi yaptıran lojik operatördür.
YENI=PORTB ^ ESKI komutunda ESKI değeri yalnızca SAG yada SOL tuşlarından birine basılırsa değişmektedir. Bu durumda sonucu etkilemeden DUR tuşu ancak PORT'u XOR yaparak değiştirebilir diye düşünmüştüm. Zira ESKI değişmeyeceğine göre aktif olan bitleri XOR bir açar bir kapatır.
PORTB=%00001000 iken led yanıyor durumdadır. Bu zaten ESKI adlı değişken değerine eşittir. Bunu PORTB=PORTB XOR ESKI yaparsak yani,
PORTB=%00001000 XOR %00001000 olunca otomatikman aktif olan bit sıfırlanacaktır. Bu işlemi tekrar yaparsan bu sefer ;
PORTB=%00000000 XOR %00001000 yapılacağı için led biti otomatikman set edilmiş olacaktır.

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

helloworld

ete hocam ben komutlarınızı CCS C de yazmayı denedim çeviremediğim yerleri oldu.kodu paylaşıyorum bir bakabilir misiniz? tabi eğer bu iki dili bilen varsa yardımcı olursa sevinirim.

#include "C:\Users\c\Desktop\TUŞ KONTROLÜ\main.h"
#fuses XT,NOWDT,NOPROTECT,NOPUT

#use delay (clock=4000000) 
#define SAG pin_a0
#define SOL pin_a1
#define DUR pin_a2
int8 ESKI=0;
int8 YENI=0;
void main()
{
  set_tris_a(0x07);
output_b(0x00);
set_tris_b(0x00);

delay_ms(200);


basla:
      if(SAG==0){
        output_low(pin_b0);
        output_high(pin_b1);
        ESKI=PORTB      
        while(SAG==0);
        delay_ms(50);
      
      
      if (SOL==0){
        output_low(pin_b0);
        output_high(pin_b1);
        ESKI=PORTB
        while (SOL==0);
        delay_ms(50);
      }
      
      if (DUR==0){
        YENI=PORTB ^ ESKI
        PORTB=YENI
        while (DUR==0);
        delay_ms(50);
      }
      
      GOTO BASLA

tergek

      IF DUR=0 THEN
        YENI=PORTB ^ ESKI
        PORTB=YENI
        WHILE DUR=0:WEND
        PAUSE 50
      ENDIF


DUR tuşuna basılı kaldığı sürece ve bıraktıktan sonrada aynı işleme devam etmesi için ve arklanmaları daha iyi önlemek için nasıl bir iyileştirme yapmalıyız acaba ?

OG

Alıntı YapDUR tuşuna basılı kaldığı sürece ve bıraktıktan sonrada aynı işleme devam etmesi için ve arklanmaları daha iyi önlemek için nasıl bir iyileştirme yapmalıyız acaba
Verdiğim kodu denememişsin.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

ete

Bence PAUSE 50 değerini 150 ye çıkart sorun kalmaz.

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