tuş tarama yardımmm ???????:(

Başlatan gogtug, 22 Ekim 2014, 19:35:23

ete

#15
Biraz daha yardımcı olalım.       "F.T" sana aşağıdakileri yapmanı öneriyor!!!.
-Tarama kısmını aşağı alsan,
-Tarama kısmının başına TUS=255 eklesen
- sonuna da bir return eklesen.

Programın başına da;
BASLA:
GOSUB TARAMA

IF TUS=255 THEN BASLA  'sonra tusa basılmışmı basılmamışmı ona bakıyoruz basılmamış ise yeniden tus taramaya yolluyoruz.
SAYI=SAYI*10+TUS 'tusa basılmış ise ona formül uyguluyoruz.
IF SAYI=12 THEN SIFRE2  'sayı=12 olmuş ise gidip ledi yaktırıyoruz.

GOTO BASLA  'tekrar tus taramaya gönderiyoruz.

Tabiiki burada Değişken tanımlama kısmında SAYI VAR BYTE şeklinde bir değişken de tanımlaman gerekecek.

Bunları düşün ve uygula bakalım ne olacak. Gördüğün gibi basit mantık takibinden başka bir şey değil program yazmak.
Kimin ne iş yapacağına ve ne zaman yapacağına karar veriyorsun programda ona göre çalışıyor.

Bir alt programa GOSUB ile gidilmiş ise oradan mutlaka RETURN ile dönülmelidir. Kullandığın alt programa GOTO ile gitmiş isen oradan yine GOTO ile ayrılman gerekir. Bu açıklamalara dikkat et. Tarama alt programının nerede biteceğine dikkat et. Fazlalıkları sil. Mesla artık LED isimli etiket ve altındakiler bir işine yaramayacak onları silebilirsin. Tarama altında Goto TARAMA diye bir komut satırı var. İşte o satır taramanın sonudur. Satırı silip yerine Return Yazman gerekir.
Bütün bunları normalde söylemeyip seninbulmanı sağlardım. Ancak hem program geliştirme mantığın hemde komut bilgin zayıf. BU bilgi ile böyle bir programı yazmaman gerekirdi. Daha basit programlarla epeyce bir uğraştıktan sonra bütün söylediklerimi kendin bulabilecek seviyeye gelmeli idin. Ancak bir acelen olduğunu ve başaramayınca karamsarlığa kapıldığını hissediyorum. O yüzden daha fazla yol göstermeyi tercih ettim. Ama açıklamaları detaylı verip kusurlarına dikkat çekmeye çalışıyorum. Bu işi öğrenecek ve başarma zevkinden yararlanacak isen her şeyi dikkatlice oku. Neyin nasıl ve neden yapıldığına kafa yor. Mümkünse Basic Ders norlarına çalış. Kısa zamanda diğerleri gibi mantıklı program yazacak seviyeye gelirsin merak etme.


Ete

gogtug

Alıntı yapılan: ete - 23 Ekim 2014, 08:14:43
Biraz daha yardımcı olalım.       "F.T" sana aşağıdakileri yapmanı öneriyor!!!.
-Tarama kısmını aşağı alsan,
-Tarama kısmının başına TUS=255 eklesen
- sonuna da bir return eklesen.

Programın başına da;
BASLA:
GOSUB TARAMA

IF TUS=255 THEN BASLA  'sonra tusa basılmışmı basılmamışmı ona bakıyoruz basılmamış ise yeniden tus taramaya yolluyoruz.
SAYI=SAYI*10+TUS 'tusa basılmış ise ona formül uyguluyoruz.
IF SAYI=12 THEN SIFRE2  'sayı=12 olmuş ise gidip ledi yaktırıyoruz.

GOTO BASLA  'tekrar tus taramaya gönderiyoruz.

Tabiiki burada Değişken tanımlama kısmında SAYI VAR BYTE şeklinde bir değişken de tanımlaman gerekecek.

Bunları düşün ve uygula bakalım ne olacak. Gördüğün gibi basit mantık takibinden başka bir şey değil program yazmak.
Kimin ne iş yapacağına ve ne zaman yapacağına karar veriyorsun programda ona göre çalışıyor.

Bir alt programa GOSUB ile gidilmiş ise oradan mutlaka RETURN ile dönülmelidir. Kullandığın alt programa GOTO ile gitmiş isen oradan yine GOTO ile ayrılman gerekir. Bu açıklamalara dikkat et. Tarama alt programının nerede biteceğine dikkat et. Fazlalıkları sil. Mesla artık LED isimli etiket ve altındakiler bir işine yaramayacak onları silebilirsin. Tarama altında Goto TARAMA diye bir komut satırı var. İşte o satır taramanın sonudur. Satırı silip yerine Return Yazman gerekir.
Bütün bunları normalde söylemeyip seninbulmanı sağlardım. Ancak hem program geliştirme mantığın hemde komut bilgin zayıf. BU bilgi ile böyle bir programı yazmaman gerekirdi. Daha basit programlarla epeyce bir uğraştıktan sonra bütün söylediklerimi kendin bulabilecek seviyeye gelmeli idin. Ancak bir acelen olduğunu ve başaramayınca karamsarlığa kapıldığını hissediyorum. O yüzden daha fazla yol göstermeyi tercih ettim. Ama açıklamaları detaylı verip kusurlarına dikkat çekmeye çalışıyorum. Bu işi öğrenecek ve başarma zevkinden yararlanacak isen her şeyi dikkatlice oku. Neyin nasıl ve neden yapıldığına kafa yor. Mümkünse Basic Ders norlarına çalış. Kısa zamanda diğerleri gibi mantıklı program yazacak seviyeye gelirsin merak etme.


Ete




HOCAM saolun yardımlarınız önerileriniz için evet bilgim biraz az ama ben bunu yapma sebebim led koyduğum yere aslında röle var normal evin kapısını açmak için istiyorum yani gerçekte bişey yapmazsam devam edemiyorum istek geliyo o zmaan bide şuan tam vizelere denk geldi çok zor oluyo yani ..
bide şöyle bişey yazdım  biyerde hata var onu biliyorum tus ları programa göndermedim yani tus=1: gosub basla gibi büyle yazınca isis de 2000 3000 hata geliyo aürekli artıyo hata kasıyo program bişeyde olmuyo zaten hala yanlışımı bulamadım bide anlamadığım yer bu program milisaniyelerle çalışıyo sonuçta  yani ben 1  e bastığımda ben 2 yi basarken nası olcak pause komutuna gerek varmı acaba şunu bi yapsam baya ağırlık verecem ama olmayınca insan istemiyo ...
teşekkür ederim yardımlarınız için





TRISA=0
TRISB=%00000111     
PORTB=0
OPTION_REG.7=0
TUS VAR BYTE
SYMBOL ROLE=PORTA.0
SYMBOL SATIR1=PORTB.4
SYMBOL SATIR2=PORTB.5
SYMBOL SATIR3=PORTB.6
SYMBOL SATIR4=PORTB.7
SYMBOL SUTUN1=PORTB.1
SYMBOL SUTUN2=PORTB.2
SYMBOL SUTUN3=PORTB.3


SAYI VAR BYTE

BASLA:
GOSUB TARAMA
IF TUS=255 THEN
GOSUB BASLA
ELSE
GOSUB SONUC
ENDIF
RETURN


SONUC:
SAYI=SAYI*10+TUS
IF SAYI=12 THEN
HIGH ROLE
ELSE
GOSUB TARAMA
ENDIF
RETURN



TARAMA:
tus=255

HIGH SATIR1
IF SUTUN1=1 THEN TUS=1
IF SUTUN2=1 THEN TUS=2 
IF SUTUN3=1 THEN TUS=3
LOW SATIR1
HIGH SATIR2
IF SUTUN1=1 THEN TUS=4 
IF SUTUN2=1 THEN TUS=5
IF SUTUN3=1 THEN TUS=6
LOW SATIR2             
HIGH SATIR3                           
IF SUTUN1=1 THEN TUS=7
IF SUTUN2=1 THEN TUS=8
IF SUTUN3=1 THEN TUS=9 
LOW SATIR3

GOTO TARAMA
return

ete

Yazdıklarımı okuyacak kadar da zamanın yok anlaşılan. Okumayınca  hata üstüne hata yapıyorsun.
Ne demiştik Gosub ile gidilen yerden geriye mutlaka dönülmesi gerekir. Dönme işlemise Return komutu ile olur. Bu komut programı nerden geldi ise aynı yere gönderir. Goto nun farkını iyi kavraman gerekiyor. Goto ile gittiğin yerden dönme mecburiyetin yoktur, ama bir yere gidecek isen Goto ile gittiğin yerden yine goto şu etiket diyerek gidebilirsin. Şimdi adım adım programına bakalım,
Basla
Gosub tarama bu komut ile tuş taramaya gittik. Oradan mutlaka return ile sönmemiz gerekiyor. Çünki oraya gidince iki alternatifli bir olay gerçekleşir. Ya bir tuşa basarsın yada basmazsın. Tuşa basarsan tu değeri 255 den küçük olur değilse 255 olarak dönersin. Şimdi bakalım tarama kısmında neler oluyor. Tus=255 ile başlıyor satırlar. Bir tusa basmış isen tuş , 0-9 arası değer alıyor ve tarama bitiyor. Ama kötü bitiyor. Orada Goto Tarama diye bir komut var. Altında ise Return var. Programın o Return komutuna erişmesi gerekirken  goto tarama komutu onu yine tarama etiketine yollar ve senin programın sonsuza kadar oradan dönemez. Bak ne yaptık adım adım komut satırlarına baktık ve mantığımızı çalıştırarak orada bir düğüm noktası olduğunu bulduk. Mantık muhakemesi yaptık sadece. Bunu yapamayacak durumdamısın? Sanmıyorum ama neden yapmıyorsun. Yazdığın komutların ne iş yapacağına dikkat et benim yaptığım gibi irdele onları. Evet burada goto tarama satırını silersek en azından program tarama alt programından geldiği yere döner.
Geldiği yer neresi idi basla satırının altında "gosub tarama" komutu. Program taramadan geri dönünce bir sonraki satıra geçer. Ne var orada tus değeri kontrolü var. Tuşa basılmamış ise yani tus=255 ise yeniden basla satırına gitmek ve aynı işleri tekrarlamak gerekir. Ama sen ne yapmışsın. Gosub basla demişsin neden? Halbuki Goto basla desen aynı işler yeniden düzgünce tekrarlanacak idi. Gosub dediğin zaman komut gittiği yerlerde bir return arayacak bulamayıncada stack hatası verip kilitlenecektir. O halde gosub basla yerine goto basla yazman gerekir.
Program bir alt satıra geçecek ve orada else gosub sonuç komutu ile sonuç etiketine gidecektir.
Şimdi sonuç etiketine geldik. Sayı değerini hesapladık. Sayı=12 ise ledi yaktık veya henüz sayı=12 değil o yüzden geri dönüp tekrar bir tuşa basmamız gerekecektir.
Sayı 12 değilse else yazıp gosup tarama demişsin sonra return ile döndürmüşsün. Oradaki gosub tarama ne işe yaradı hiç çünki ne basılan tusu test ettik nede sayı 12 olmuş ise ledi yaktık. Orada fazlalık ve lüzumsuz bir komut amacı yok. Komut bir işe yaramalı. O halde sonuç kısmında sayı=12 değil ise oradan geri dönmemiz bizim için yeterli olacaktır. Else ve diğer gosub tarama kısmını silip orada yalnızca return bırakmak daha doğru olacaktır.
Buraya kadar bir kereliğine basılmış olan bir tusu sayı değişkenine yerleştirip 12 olup olmadığını test etmiş olduk. Diyelimki 1 tusuna bastık va sayı=1 oldu . Şimdi 2 tuşuna basmak için gerekliçşartları yaratmamız gerekiyor. Bunu kim yapar ? Elbette basla satırından itibaren olan bütün komutlar bu işi yapar. O halde bize düşen oraya return değil goto basla yazmamız olacaktır. Böylece program 2 ci tusa ve varsa başka tuslara basmana imkan tanır ve sonuçta ledin de yanar.

Normalde bu anlattıklarım basic derslerine başlayıp adım adım dersleri geçtikçe öğrenilecek şeyler. Ama sen ne hikmetse kestirmeden gitmeye çalışıyorsun. Böyle olmaz. Her zaman bu kadar sabırla anlatmam bunu bilesin. Orada dersler hazırlamışım onlar üzerinde çalışıp pişmen gerekiyor. Yoksa sürekli böyle tökezlersin.

Ete

gogtug

Alıntı yapılan: ete - 24 Ekim 2014, 09:07:35
Yazdıklarımı okuyacak kadar da zamanın yok anlaşılan. Okumayınca  hata üstüne hata yapıyorsun.
Ne demiştik Gosub ile gidilen yerden geriye mutlaka dönülmesi gerekir. Dönme işlemise Return komutu ile olur. Bu komut programı nerden geldi ise aynı yere gönderir. Goto nun farkını iyi kavraman gerekiyor. Goto ile gittiğin yerden dönme mecburiyetin yoktur, ama bir yere gidecek isen Goto ile gittiğin yerden yine goto şu etiket diyerek gidebilirsin. Şimdi adım adım programına bakalım,
Basla
Gosub tarama bu komut ile tuş taramaya gittik. Oradan mutlaka return ile sönmemiz gerekiyor. Çünki oraya gidince iki alternatifli bir olay gerçekleşir. Ya bir tuşa basarsın yada basmazsın. Tuşa basarsan tu değeri 255 den küçük olur değilse 255 olarak dönersin. Şimdi bakalım tarama kısmında neler oluyor. Tus=255 ile başlıyor satırlar. Bir tusa basmış isen tuş , 0-9 arası değer alıyor ve tarama bitiyor. Ama kötü bitiyor. Orada Goto Tarama diye bir komut var. Altında ise Return var. Programın o Return komutuna erişmesi gerekirken  goto tarama komutu onu yine tarama etiketine yollar ve senin programın sonsuza kadar oradan dönemez. Bak ne yaptık adım adım komut satırlarına baktık ve mantığımızı çalıştırarak orada bir düğüm noktası olduğunu bulduk. Mantık muhakemesi yaptık sadece. Bunu yapamayacak durumdamısın? Sanmıyorum ama neden yapmıyorsun. Yazdığın komutların ne iş yapacağına dikkat et benim yaptığım gibi irdele onları. Evet burada goto tarama satırını silersek en azından program tarama alt programından geldiği yere döner.
Geldiği yer neresi idi basla satırının altında "gosub tarama" komutu. Program taramadan geri dönünce bir sonraki satıra geçer. Ne var orada tus değeri kontrolü var. Tuşa basılmamış ise yani tus=255 ise yeniden basla satırına gitmek ve aynı işleri tekrarlamak gerekir. Ama sen ne yapmışsın. Gosub basla demişsin neden? Halbuki Goto basla desen aynı işler yeniden düzgünce tekrarlanacak idi. Gosub dediğin zaman komut gittiği yerlerde bir return arayacak bulamayıncada stack hatası verip kilitlenecektir. O halde gosub basla yerine goto basla yazman gerekir.
Program bir alt satıra geçecek ve orada else gosub sonuç komutu ile sonuç etiketine gidecektir.
Şimdi sonuç etiketine geldik. Sayı değerini hesapladık. Sayı=12 ise ledi yaktık veya henüz sayı=12 değil o yüzden geri dönüp tekrar bir tuşa basmamız gerekecektir.
Sayı 12 değilse else yazıp gosup tarama demişsin sonra return ile döndürmüşsün. Oradaki gosub tarama ne işe yaradı hiç çünki ne basılan tusu test ettik nede sayı 12 olmuş ise ledi yaktık. Orada fazlalık ve lüzumsuz bir komut amacı yok. Komut bir işe yaramalı. O halde sonuç kısmında sayı=12 değil ise oradan geri dönmemiz bizim için yeterli olacaktır. Else ve diğer gosub tarama kısmını silip orada yalnızca return bırakmak daha doğru olacaktır.
Buraya kadar bir kereliğine basılmış olan bir tusu sayı değişkenine yerleştirip 12 olup olmadığını test etmiş olduk. Diyelimki 1 tusuna bastık va sayı=1 oldu . Şimdi 2 tuşuna basmak için gerekliçşartları yaratmamız gerekiyor. Bunu kim yapar ? Elbette basla satırından itibaren olan bütün komutlar bu işi yapar. O halde bize düşen oraya return değil goto basla yazmamız olacaktır. Böylece program 2 ci tusa ve varsa başka tuslara basmana imkan tanır ve sonuçta ledin de yanar.

Normalde bu anlattıklarım basic derslerine başlayıp adım adım dersleri geçtikçe öğrenilecek şeyler. Ama sen ne hikmetse kestirmeden gitmeye çalışıyorsun. Böyle olmaz. Her zaman bu kadar sabırla anlatmam bunu bilesin. Orada dersler hazırlamışım onlar üzerinde çalışıp pişmen gerekiyor. Yoksa sürekli böyle tökezlersin.

Ete



SAYI VAR BYTE
BASLA:
GOSUB TARAMA
IF TUS=255 THEN
goto basla
ELSE
GOSUB SONUC
ENDIF
goto basla

SONUC:
SAYI=0
SAYI=SAYI*10+TUS
IF SAYI=12 THEN  HIGH ROLE
pause 2000
RETURN

TARAMA:
tus=255

HIGH SATIR1
IF SUTUN1=1 THEN TUS=1
IF SUTUN2=1 THEN TUS=2
IF SUTUN3=1 THEN TUS=3
LOW SATIR1
HIGH SATIR2
IF SUTUN1=1 THEN TUS=4 
IF SUTUN2=1 THEN TUS=5
IF SUTUN3=1 THEN TUS=6
LOW SATIR2             
HIGH SATIR3                           
IF SUTUN1=1 THEN TUS=7
IF SUTUN2=1 THEN TUS=8
IF SUTUN3=1 THEN TUS=9 
LOW SATIR3
return



hocam öncelikle yazdıklarınız okudum ona göre düzenlemeler yaptım derslerinizede başladım son olarak son yazdığımı açıklayarak sorma istiyorum
başla ile başladık gosub tarama ile taramaya geldik tus= 255 yaptık ki sonuçta fark varmı diye bakmak için sonra 1 e bastık return ile gosub taramanın bi alt satırından başladık fark varmı diye tekrar kontrol ettik 1 e bastığımız için else ile devam ettik sonuc etiketine gittik  tus 1 olduğundan sayı =1 oldu sayı 12 olmadığı için return ile gosub sonucun bi alt satırından başladık goto basla ile basla ya gittik sonra gosub tarama ile taramaya taramada tus=2 yaptık return ile if satırına geldik tus= 255 olmadığı için else ile sonuc etiketine geldik sayı 1 olduğu için 1*10+2 den 12 yaptık alt satıra indik sayı=12 olduğundan led yandı yani yanması gerekiyodu yanmadı
nedenini şöyle düşünüyorum eğer mantıksal bi hata yoksa biz programı başlattığımızda program çok hızlı ilerlediği için program basla-tarama-tus=255-return-if tus=255 then goto basla- bunlar arasında dönüyo çok hızlı olduğu için diye düşünüyorum 
bu arada derslerinizi takip ediyorum bide kitap almayı düşünüyorum eğer bi kitap yazar önerirseniz çok sevinirim :)

nurim

@gogtug,
"F.T" nin programı üzerinde biraz çalışarak işin mantığını anlaman sonra daha ileri program komutlarıyla ("ETE" nin önerileri) programı derlemen en doğrusu olacaktır.
Bunun için bende bu programı daha anlaşılır şekilde çalışır hale getirdim. Açıklamalarıda dikkatlice incelersen önce program mantığını çözerek, gerekli düzeltme gelişmeleri yaparsın.
Kolay gelsin

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [nurim@electronic]                                *
'*  Notice  : Copyright (c) 2014 ticari amaçla kullanılamaz]    *
'*          : All Rights Reserved                               *
'*  Date    : 26.10.2014                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
TRISA=0
TRISB=%00001110     'Pinlerin giriş çıkış olarak ayarlanması
PORTA=0
PORTB=0
OPTION_REG.7=0
TUS VAR BYTE
SYMBOL ROLE  =PORTA.0 'Röle portu belitiliyor.
SYMBOL SATIR1=PORTB.4 'Satır portu belitiliyor.
SYMBOL SATIR2=PORTB.5
SYMBOL SATIR3=PORTB.6
SYMBOL SATIR4=PORTB.7
SYMBOL SUTUN1=PORTB.1  'Sütun portu belitiliyor.
SYMBOL SUTUN2=PORTB.2
SYMBOL SUTUN3=PORTB.3
tus=0

TARAMA:
' Bu bölümde tuşlara basılıp basılmadığı kontrol ediliyor.
low SATIR1
IF SUTUN1=0 THEN TUS=1 : gosub SIFRE
IF SUTUN2=0 THEN TUS=2 : gosub SIFRE
IF SUTUN3=0 THEN TUS=3 : gosub SIFRE
high SATIR1
low SATIR2
IF SUTUN1=0 THEN TUS=4 : gosub SIFRE
IF SUTUN2=0 THEN TUS=5 : gosub SIFRE
IF SUTUN3=0 THEN TUS=6 : gosub SIFRE
high SATIR2
low SATIR3                           
IF SUTUN1=0 THEN TUS=7 : gosub SIFRE
IF SUTUN2=0 THEN TUS=8 : gosub SIFRE
IF SUTUN3=0 THEN TUS=9 : gosub SIFRE
high SATIR3

GOTO TARAMA
'basılan tuş varsa şifre bölümüne gelinir..
 
  SIFRE: 'şifrenin 1. hanesi burada kontrol edilir.....doğruysa şifre2 ye gidilir.
  IF TUS=1 THEN
  goto SIFRE2
  ENDIF

  SIFRE2:'bu şifre sayısıda doğruysa röle aktif edilir, süre sonunda başa dönülür.
  IF TUS=2 THEN
  HIGH ROLE
  PAUSE 3000 'röle süresi
  LOW ROLE
  ENDIF
  return 'dönüş
Kolay Gelsin
nurim

ete

Program yazma işi böyledir. İlk yazdığında farkında olmadan bir sürü hata yaparsın ve ilk hata üzerine yoğunlaşınca sanırsınki programın gerisi doğru. Senin yazdığın programın ilk halinde mantık sırası hataları vardı. Uğraşa uğraşa onları giderdik.
Ama sende aynı hatayı yaparak programın çalışmasını bekledin. Halbuki geride o kadar fazla hata varki!!!!.
Bu işi sana öğretmeye kararlı olduğum için hatalarını teker teker sıralıyacağım. Bakalım düzeltip programı çalışır hale getirebilecekmisin.

1. Programında sigorta ayarların yok. Kullandığın işlemci 16F628 olsa gerek. Ona uygun sigorta ayarları ekle ve INTRC_OSC seçeneğini seç.

2. Kullandığın işlemcide A portu ilk çalıştırmada Komparatör olarak çalışır ve bu digital çalışmayı bozar. Sen komparatör kullanmayacağın için bu özelliği CMCON=7 komutunu vererek kapatmalısın.

3.Tuş takımını nereye bağladığını ve hangi pinleri giriş hangi pinleri çıkış olarak kullandığına dikkat ederek  TRISB registerine doğru değer ver. Son yazdığın kısımda Trıs registerleri programda yer almıyor. Ancak öncekilere bakınca bu değerin yanlış olduğunu görüyorum. Muhtemelen bu yanlış değeri kullanıyorsun.

4. SONUC etiketi altında;
pause 2000
şeklinde bir komut yerleştirmişsin. Bu her seferinde programın 2 sn kadar burada beklemesine ve dolayısıyla tuş kontrolünün yeterince hızlı yapılamamasına sebep olmaktadır.
Bu komut led yanacak ise devreye girmelidir. Aslında ledi söndürecek bir komut koymadığına göre böyle bir gecikmeye zaten gerek yoktur bence o gecikmeyi 100 ms olarak değiştir.

5. En büyük sorun tarama kısmında bulunuyor. Sorunu göremediğine göre kafanda canlandırmanı sağlamaya çalışacağım.
Programınbaşında dahili pullupları açmış bulunuyorsun. Bu ne demektir ? giriş olarak ayarladığın pinler sürekli olarak HIGH da bekleyecek demektir.
Şimdi sen tarama kısmında ne yapıyorsun adım adım bakalım,
HIGH SATIR1
IF SUTUN1=1 THEN TUS=1
IF SUTUN2=1 THEN TUS=2
IF SUTUN3=1 THEN TUS=3
LOW SATIR1

Dikkat edersen çıkış olarak ayarlanmış SATIR1 pinini HIGH yapıyorsun. BUnda bir sorun yok (şimdilik) Sonra giriş pinlerine bakıyorsun
IF SUTUN1=1 THEN TUS1  bu komut ilk giriş pinin HIGH ise TUS değeri 1 olacak diyor. Senin giriş pinlerin zaten HIGH da bekliyor yani 1 ler hemde hepsi birden o zaman ne oluyor TUS=1 oluyor. Ama tuşa bassanda 1 oluyor basmasanda çünki SUTUN1 zaten pullup dan dolayı HIGH da bekliyor sürekli 1 yani. Bu ne anlama geliyor. Tarama sistemin yanlış demek oluyor. Ne yapman lazım. Giriş pini (SUTUN1) HIGH da bekliyor ise tuşa basınca LOW olması lazımki işlemci tuşa basıldığını anlasın. Aksi taktirde bu şekilde hiç bir şey anlamayacak. Bu hata şekli taramanın sonuna kadar devam ediyor.
Çözüm ne?
Taramaya başlamadan evvel TUS=255 demiştik. Hemen onun altına
PORTB=255 dememiz gerekiyor. Bütün çıkış pinlerini HIGH yapacaktır bu komut. Sonra İlk satır pinini LOW a çekip sütunlara bakmamız lazım geliyor öyle değilmi? Yani şöyle;

PORTB=255
LOW SATIR1

Peki bu durumda tuşa basılırsa Sütun 1 mi olacak yoksa sıfırmı? elbette sıfır olacaktır. O halde IF satırlarınıda bu sisteme uygun olarak değiştirmek gerekecek. Yani şöyle;

PORTB=255
LOW SATIR1
IF SUTUN1=0 THEN TUS=1
IF SUTUN2=0 THEN TUS=2
IF SUTUN3=0 THEN TUS=3
HIGH SATIR1

Ben bir tarama kısmını sana doğru olarak verdim diğerlerinide sen değiştirirsin artık. Burada önemli olan hatayı anlayabilmek idi umarım anlamışsınıdr.
Daha bitmedi !!!!.
Senin Sutun1 tuş takımında nereye bağlı 3-6-9-# hattına bağlı. Bunu önceden verdiğin şemaya bakarak söylüyorum yada anlıyorum. Peki SATIR1=0 iken SUTUN1=0 ise bu nedemektir? Bu "3" tuşuna basıldığını gösterir halbuki sen orada "1" şeklinde kullanmışsın bu seçeneği. Buda yanlış. Yani satır ve sütunları nereye bağladığına bakmadan basılan tuş şudur diye yanlış hüküm vermişsin. Bunlarıda düzelt baştan sona yanlışlar çünki.

Başka hata yok ancak bir önemli eksik var. Program tahmin ettiğinden çok hızlı çalışır. Sen 1 tuşuna bastığın zaman şayet tedbir almaz isen sayı değerin elini 1 tuşundan çekinceye kadar 1111 şeklinde hemen değer alır. Halbuki biz tus=1 sayı=1 olsun istiyoruz. O halde her bir tarama bölümünde tuşun bırakıldığını kontrol etmemiz gerekiyor. Tuş bırakılmış ise program devam etsin aksi halde bırakılıncaya kadar beklesin isteriz.
Bu işi yapmanın bir kaç yolu var mesela;
WHILE  (SUTUN1=0 OR SUTUN2=0 OR SUTUN3=0):WEND diyebilirsin. Bu sütunlardan birisi LOW da ise (Yani tuşlardan birisine basılmış ise)  orada bekle anlamına gelir. Bir başka şekilde; Giriş pinlerimiz şöyle idi PORTB=%00001110  (Bak bu aynı zaman da PORTB nin TRIS değeridir) Pullup dan dolayı 1 olan pinler HIGH da bekledikleri için böyledir. Bunu sayı karşılığı 14 dür (8+4+2=14). Bir tuşa basılırsa 14 değerinden eksilme olacaktır. o zaman 14 yerine 6-12-10 olacaktır. O halde şöyle bir komut yazılabilir. WHILE  (PORTB & %00001110)<14:WEND
Bu komut nereye yazılacak? her bir sütun kontrolünün altına yazılması gerekir. Bir tanesini ben yazayım örnek olsun.
LOW SATIR2 
IF SUTUN1=0 THEN TUS=6
IF SUTUN2=0 THEN TUS=5
IF SUTUN3=0 THEN TUS=4
WHILE (PORTB & %00001110)<14:WEND
HIGH SATIR2

Bütün sütun kontrollerine aynı komut satırını eklemen gerekiyor çünki aynı komut kullanılacaktır.

Hepsi bu kadar. Bu sefer umarım başarırsın.

Ete

gogtug

#21
Alıntı yapılan: ete - 26 Ekim 2014, 08:22:27
Program yazma işi böyledir. İlk yazdığında farkında olmadan bir sürü hata yaparsın ve ilk hata üzerine yoğunlaşınca sanırsınki programın gerisi doğru. Senin yazdığın programın ilk halinde mantık sırası hataları vardı. Uğraşa uğraşa onları giderdik.
Ama sende aynı hatayı yaparak programın çalışmasını bekledin. Halbuki geride o kadar fazla hata varki!!!!.
Bu işi sana öğretmeye kararlı olduğum için hatalarını teker teker sıralıyacağım. Bakalım düzeltip programı çalışır hale getirebilecekmisin.

1. Programında sigorta ayarların yok. Kullandığın işlemci 16F628 olsa gerek. Ona uygun sigorta ayarları ekle ve INTRC_OSC seçeneğini seç.

2. Kullandığın işlemcide A portu ilk çalıştırmada Komparatör olarak çalışır ve bu digital çalışmayı bozar. Sen komparatör kullanmayacağın için bu özelliği CMCON=7 komutunu vererek kapatmalısın.

3.Tuş takımını nereye bağladığını ve hangi pinleri giriş hangi pinleri çıkış olarak kullandığına dikkat ederek  TRISB registerine doğru değer ver. Son yazdığın kısımda Trıs registerleri programda yer almıyor. Ancak öncekilere bakınca bu değerin yanlış olduğunu görüyorum. Muhtemelen bu yanlış değeri kullanıyorsun.

4. SONUC etiketi altında;
pause 2000
şeklinde bir komut yerleştirmişsin. Bu her seferinde programın 2 sn kadar burada beklemesine ve dolayısıyla tuş kontrolünün yeterince hızlı yapılamamasına sebep olmaktadır.
Bu komut led yanacak ise devreye girmelidir. Aslında ledi söndürecek bir komut koymadığına göre böyle bir gecikmeye zaten gerek yoktur bence o gecikmeyi 100 ms olarak değiştir.

5. En büyük sorun tarama kısmında bulunuyor. Sorunu göremediğine göre kafanda canlandırmanı sağlamaya çalışacağım.
Programınbaşında dahili pullupları açmış bulunuyorsun. Bu ne demektir ? giriş olarak ayarladığın pinler sürekli olarak HIGH da bekleyecek demektir.
Şimdi sen tarama kısmında ne yapıyorsun adım adım bakalım,
HIGH SATIR1
IF SUTUN1=1 THEN TUS=1
IF SUTUN2=1 THEN TUS=2
IF SUTUN3=1 THEN TUS=3
LOW SATIR1

Dikkat edersen çıkış olarak ayarlanmış SATIR1 pinini HIGH yapıyorsun. BUnda bir sorun yok (şimdilik) Sonra giriş pinlerine bakıyorsun
IF SUTUN1=1 THEN TUS1  bu komut ilk giriş pinin HIGH ise TUS değeri 1 olacak diyor. Senin giriş pinlerin zaten HIGH da bekliyor yani 1 ler hemde hepsi birden o zaman ne oluyor TUS=1 oluyor. Ama tuşa bassanda 1 oluyor basmasanda çünki SUTUN1 zaten pullup dan dolayı HIGH da bekliyor sürekli 1 yani. Bu ne anlama geliyor. Tarama sistemin yanlış demek oluyor. Ne yapman lazım. Giriş pini (SUTUN1) HIGH da bekliyor ise tuşa basınca LOW olması lazımki işlemci tuşa basıldığını anlasın. Aksi taktirde bu şekilde hiç bir şey anlamayacak. Bu hata şekli taramanın sonuna kadar devam ediyor.
Çözüm ne?
Taramaya başlamadan evvel TUS=255 demiştik. Hemen onun altına
PORTB=255 dememiz gerekiyor. Bütün çıkış pinlerini HIGH yapacaktır bu komut. Sonra İlk satır pinini LOW a çekip sütunlara bakmamız lazım geliyor öyle değilmi? Yani şöyle;

PORTB=255
LOW SATIR1

Peki bu durumda tuşa basılırsa Sütun 1 mi olacak yoksa sıfırmı? elbette sıfır olacaktır. O halde IF satırlarınıda bu sisteme uygun olarak değiştirmek gerekecek. Yani şöyle;

PORTB=255
LOW SATIR1
IF SUTUN1=0 THEN TUS=1
IF SUTUN2=0 THEN TUS=2
IF SUTUN3=0 THEN TUS=3
HIGH SATIR1

Ben bir tarama kısmını sana doğru olarak verdim diğerlerinide sen değiştirirsin artık. Burada önemli olan hatayı anlayabilmek idi umarım anlamışsınıdr.
Daha bitmedi !!!!.
Senin Sutun1 tuş takımında nereye bağlı 3-6-9-# hattına bağlı. Bunu önceden verdiğin şemaya bakarak söylüyorum yada anlıyorum. Peki SATIR1=0 iken SUTUN1=0 ise bu nedemektir? Bu "3" tuşuna basıldığını gösterir halbuki sen orada "1" şeklinde kullanmışsın bu seçeneği. Buda yanlış. Yani satır ve sütunları nereye bağladığına bakmadan basılan tuş şudur diye yanlış hüküm vermişsin. Bunlarıda düzelt baştan sona yanlışlar çünki.

Başka hata yok ancak bir önemli eksik var. Program tahmin ettiğinden çok hızlı çalışır. Sen 1 tuşuna bastığın zaman şayet tedbir almaz isen sayı değerin elini 1 tuşundan çekinceye kadar 1111 şeklinde hemen değer alır. Halbuki biz tus=1 sayı=1 olsun istiyoruz. O halde her bir tarama bölümünde tuşun bırakıldığını kontrol etmemiz gerekiyor. Tuş bırakılmış ise program devam etsin aksi halde bırakılıncaya kadar beklesin isteriz.
Bu işi yapmanın bir kaç yolu var mesela;
WHILE  (SUTUN1=0 OR SUTUN2=0 OR SUTUN3=0):WEND diyebilirsin. Bu sütunlardan birisi LOW da ise (Yani tuşlardan birisine basılmış ise)  orada bekle anlamına gelir. Bir başka şekilde; Giriş pinlerimiz şöyle idi PORTB=%00001110  (Bak bu aynı zaman da PORTB nin TRIS değeridir) Pullup dan dolayı 1 olan pinler HIGH da bekledikleri için böyledir. Bunu sayı karşılığı 14 dür (8+4+2=14). Bir tuşa basılırsa 14 değerinden eksilme olacaktır. o zaman 14 yerine 6-12-10 olacaktır. O halde şöyle bir komut yazılabilir. WHILE  (PORTB & %00001110)<14:WEND
Bu komut nereye yazılacak? her bir sütun kontrolünün altına yazılması gerekir. Bir tanesini ben yazayım örnek olsun.
LOW SATIR2 
IF SUTUN1=0 THEN TUS=6
IF SUTUN2=0 THEN TUS=5
IF SUTUN3=0 THEN TUS=4
WHILE (PORTB & %00001110)<14:WEND
HIGH SATIR2

Bütün sütun kontrollerine aynı komut satırını eklemen gerekiyor çünki aynı komut kullanılacaktır.

Hepsi bu kadar. Bu sefer umarım başarırsın.

Ete



CMCON=7
OPTION_REG.7=0




@ __config _XT_OSC & _WDT_ON & _MCLRE_ON & _LVP_OFF & _CP_OFF


TRISA=0
TRISB=%00001110     
PORTB=0



TUS VAR BYTE
SYMBOL ROLE=PORTA.0
SYMBOL SATIR1=PORTB.4
SYMBOL SATIR2=PORTB.5
SYMBOL SATIR3=PORTB.6
SYMBOL SATIR4=PORTB.7
SYMBOL SUTUN1=PORTB.1
SYMBOL SUTUN2=PORTB.2
SYMBOL SUTUN3=PORTB.3
SAYI VAR BYTE
SAYI=0
BASLA:

GOSUB TARAMA
IF TUS=255 THEN
goto basla
ELSE
GOSUB SONUC
ENDIF
goto basla

SONUC:

SAYI=SAYI*10+TUS
IF SAYI=123 THEN  HIGH ROLE
IF SAYI=123 THEN SAYI=0
pause 400
LOW ROLE


RETURN

TARAMA:
tus=255
PORTB=255

LOW SATIR1
IF SUTUN1=0 THEN TUS=1
IF SUTUN2=0 THEN TUS=2
IF SUTUN3=0 THEN TUS=3
WHILE (PORTB & %00001110)<14:WEND
HIGH SATIR1
LOW SATIR2
IF SUTUN1=0 THEN TUS=4 
IF SUTUN2=0 THEN TUS=5
IF SUTUN3=0 THEN TUS=6
  WHILE (PORTB & %00001110)<14:WEND
HIGH SATIR2             
LOW SATIR3                           
IF SUTUN1=0 THEN TUS=7
IF SUTUN2=0 THEN TUS=8
IF SUTUN3=0 THEN TUS=9
   WHILE (PORTB & %00001110)<14:WEND
HIGH SATIR3
return

 


hocam çok teşekkür ederim yardımlarınız için ben bunu o gün yazdım fakat yoğunluktan giremedim daha da birsürü şey olması lazım biliyorum eeprom bellek falan ama başlangıcı yaptım sayenizde sürekli forumudaki dersleri takip etmeye çalışıyorum tekrar saolun:)

Powered by EzPortal