V

Tek tuş+16f628a+LCD ile yıldız üçgen çalıştırma.

Başlatan vardar07, 26 Mayıs 2012, 12:54:58

vardar07

Selam arkadaşlar sizler kadar usta değilim.Sitedeki konularınızdan (özellikle ETE hocanın derslerinden.) ve diğer sitelerden edindiğim bilgileri bir araya getirerek öğrenme amaçlı bir devre yapmaya çalıştım. Konu sizce belki basit benim içinse o kadarda kolay değil.
Sorunum programı tek tuş ile başlatıp durdurmada. START'a 1kez basılınca 1.led+2.led yanacak bir müddet sonra 2.led sönüp 3.led yanacak. tuşa tekrar basılınca programdan çıkacak.
Yazdığım programdaki hata tuşa ikinci defa basılınca durmadan tekrar baştan start oluyor. Sizden ricam hatam nerede.
Zaman ayarınıda  dışardan yapabilirsem buton veya dirençle nasıl yapabilirim.
Yardımcı olacak arkadaşlara şimdiden teşekkür edrim.


TRISA=%00010001
TRISB=%00000000
PORTA=0
PORTB=0

SYMBOL BUTON=PORTA.0
SYMBOL LED=PORTB.0
LED=0
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 1
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_LINES 2
 
LCDOUT $FE, $40, $04, $00, $04, $04, $04, $04, $04, $00 'İ
LCDOUT $FE, $48, $0E, $11, $10, $10, $11, $0E, $04, $00 'Ç
LCDOUT $FE, $50, $00, $04, $04, $04, $04, $0A, $11, $00 'YILDIZ
LCDOUT $FE, $58, $00, $04, $0A, $11, $11, $0E, $00, $00 'ÜÇGEN

LCDOUT $FE,1
LCDOUT $FE,$C0
PAUSE 200
LCDOUT $FE,1," VARDAR 07"
LCDOUT $FE,$C0,"MUSTAFA VARDAR"
pause 2500
LCDOUT $FE,1
LCDOUT $FE,1,"START'A BAS"

BASLA:

IF BUTON=0 THEN
TOGGLE LED:WHILE BUTON
WEND
IF LED=1 THEN
HIGH PORTA.1:LCDOUT $FE,1,"MOTOR"   'D1
HIGH PORTA.2:LCDOUT $FE,$C0,2           'D2
PAUSE 1500
HIGH PORTA.3:LCDOUT $FE,$C0,3           'D3
LOW PORTA.2
ELSE
LOW PORTA.1:LOW PORTA.2:LOW PORTA.3
ENDIF
ENDIF
goto basla
END



jun

WHILE BUTON
WEND
eksik olmuş

WHILE BUTON=0 WEND olması lazım

aşagıdaki şekilde çalışıyor.

ete

While Buton
Wend
şeklinde yazılmış bir komut ;
While Buton=1:Wend ile eşdeğerdir. Halbuki sana tersi lazım yani Buton=0 ise orada bekle demen gerekiyor.
Bu nedenle o komut eksik olarak orada çalışıyor. Bunu düzeltince sistem nispeten normale dönecektir.
Nispeten diyorum. Bütün ledler için yandıktan sonra bir süre oymuşsun. Bu süre led konumunda bir değişiklik olursa en azından led in yandığını görebilmek için iyi bir uygulamadır. Ancak led söndüğü zamanda bir gecikme koymak aynı mantıkla gereklidir. Aksi halde sönmüş ledi göremeden anında yeniden yanarsa söndüğünü fark edemeyebilirsin.
Bu nedenle aynı gecikmeyi söndükten sonrada koymak uygun olur.

BU sistemi 16F628 yerine  16F88 ile yaparsan Analog girişlerden birisine bir pot bağlayabilir ve bu pot ile Yıldız bağlantıdan Üçgen bağlantıya geçiş süreini isetdiğin gibi ayarlayabilirsin. Bu işle ilgili olarak elbette butonda kullanabilirsin ama buton pek kullanışlı olmaz.  16F88 piyasada bulunabilen bir işlemcidir. Daha önce kullanmadı isen analog pin ayarlamalarını gösterebilirim.

Ete

vardar07

ETE Usta öncelikle ilgine teşekkürler .bilmem yazmam doğrumu başka bir yerde tarafınızve subram arkadaşın ilgisi ile sorunu çözmüş olduk. Ancak ben bu işte yeni olduğum için 16f628a için düzenlenmiş hex'i  16f88için tekrar derlesek diğer pot faktörünü adapte edebilirmiyiz. Ayrıca acil önlem  için yıldızdan üçgene geçerken durdurmak istesek (programı sadece yıldız üçgen değil geniş amaçlı bilgi edinmek için .) üçgene geçme anında şartlı bir komut daha eklesek olurmu. Saygılar.

ete

Bu istediklerini yapabilmek için devrede biraz tadilat gerekti. Star ve Stop butonlarını PortB0 ve PortB.1 pinlerine aldım.
PortB.0 da LED isimli değişkenin çalışıyor idi. Aslında LED ile PORTAQ.1 bir birlerinin aynı işi yapıyorlar. O halde LED olarak PORTA.1'i atadım. Devreye 1 adet pot ilave ettim ve makismum süre potun maksimum konumunda 5000 ms (5 sn) olarak belirledim. Bu sire 4 ms ile 5000 ms arasında ayarlanabilmektedir.

Stop butonu istenen her konumda çalışabilmektedir.
Yeni devre şeması ve programlar ilişiktedir.

Ete

vardar07

Ete  hoca eline koluna sağlık süper oluş teşekkürler.

vardar07

Alıntı yapılan: jun - 27 Mayıs 2012, 00:36:47
WHILE BUTON
WEND
eksik olmuş

WHILE BUTON=0 WEND olması lazım

aşagıdaki şekilde çalışıyor.

Arkadaşım teşekkürler. Ete hocaya mesaj yazarken senide ekleyecektim unutmuşum kusura bakma.
ADCIN 0,HAM
      SURE=(HAM+1)*/1250
      RETURN   Hesabında süre uzatmasını nasıl yapıyorsunuz sabahtan beri çözmeye çalıştım fakat çıkaramadım. 50sinden sonra merak demekki bu kadar oluyor.

ete

0-1023 adc ölçüöünde 1024 kademe vardır.
Süreyi maksimum 5000 ms olsun istemişltim. O halde sabit çarpanımız 5000/1024 şeklinde hesaplanacaktır.
Formülü */ operaörü ile kullanacağım için sonuç 256 ya bölünmüş olarak bana verilecek. O halde eşitlik bozulmasın diye öndenbirde 256 ile çarpıyorum sabit çarpanı.
5000/1024=4,8828,     Bunu 256  ile çaprınca  1250 rakamını bulmuş idim.
Şimdidiyelimki süremiz maksimum 6000 ms olsun. O halde
60000/1024=5.8593   bunu 256 ile çarparsam  1500 değerini bulurum.
O halde sabit çarpanım 1500 lacakmış Formulüm  Sure=(Ham+1)*/1500  şeklinde olacaktır.

Benzer şekilde diğer süreleri hesaplayabilirsin.

Ete

vardar07

Sağol hocam iyiki varsınız. Bilginize ve yardımınıza teşekkürler.

kgguler

Ete hocam
Simülasyonda (sizin gönderdiğiniz) LCD sadece ışık veriyor.Yazı bilgi vs yazmıyor.Problem beniim bilgisayarda olabilir mi?

ete

Sorun sende olsa gerek. Şimdi siteden yükleyip çalıştırdım. Sorunsuz çalıştı.

Ete

vardar07

ETE hocam derlemede aşağıdaki gibi ekran yazdırmada bir kaç değişiklik yaptım ama bir türlü porta.3  1olduğunda 1. satırda MOTOR 2.satırda üçgen amblemi sürekli kalması gerekirken olmuyor.Gene nerede hata yapıyorum acaba.

BASLA:

GOSUB ADCAL:LCDOUT $FE,$80,"SURE:",DEC SURE," AYARLA  ":LCDOUT $FE,$C0,"START'A BAS   "
IF dur=0 then SIFIRLA:LCDOUT $FE,$80,"SURE:",DEC SURE," "
IF BUTON=0 THEN
  TOGGLE LED
  WHILE BUTON=0:WEND
  IF DUR=0 THEN SIFIRLA
  IF LED=1 THEN
  HIGH PORTA.1:LCDOUT $FE,1,"MOTOR           "   'D1 ana
  HIGH PORTA.2:LCDOUT $FE,$C0,2                      'D2 yıldız
  GOSUB BEKLE:IF POZ=1 THEN SIFIRLA
  HIGH PORTA.3                                                     'D3 ücgen
  LOW  PORTA.2:LCDOUT $FE,1,"MOTOR           ":LCDOUT $FE,$C0,3
  ELSE
  LOW PORTA.1:LOW PORTA.2:LOW PORTA.3   
  ENDIF
ENDIF
GOTO BASLA

ete

POrtA.3 ün HIGH olması LED konumuna bağlı.
LED=0 ise
HIGH PORTA.3
LOW  PORTA.2:LCDOUT $FE,1,"MOTOR           ":LCDOUT $FE,$C0,3
şeklinde komut vermişsin.
bu istediğini yapacak olan komut dizisi. Neresi olmuyor acaba. Bende oluyor çünki.
- Start tuşuna basıyorum. Sistem Yıldız ile başlıyor üçgen'e geçiyor.
- Tekrar start tuşuna basınca sönüyor ve senin dediğin oluyor. Yani PortA.3 high da kalıyor ve ekranda Üçgen işareti (daire gibi aslında) sürekli kalıyor.

Acaba stop tuşuna basınca da aynı işimi yapsın istiyorsun.
Ete


vardar07

hocam sistem normal çalışıyor sadece üçgene geçince ekranda motor üçgen amblemini göstermeden süre .... ayarla starta bas yazıyor yani stop a veya ani durmaya basılmış gibi yazıyor.(süre ayarla starta bas )
GOSUB ADCAL:LCDOUT $FE,$80,"SURE:",DEC SURE," AYARLA  ":LCDOUT $FE,$C0,"START'A BAS   "
üçgene geçince bunu yazıyor. diğerleri normal.
LOW  PORTA.2:LCDOUT $FE,1,"MOTOR           ":LCDOUT $FE,$C0,3 burada yapılmak istenen doğrumu.
sistem pbp dosyasını kabul etmediği için uzantıyı txt olarak değiştirdim.Yazılımın son hali.

ete

Basla--- Goto basla arasını aşağıdaki gibi değiştir bakalım ne olacak.

Ete

BASLA:

GOSUB ADCAL':LCDOUT $FE,$87,"SURE:",DEC SURE," "
IF dur=0 then SIFIRLA
IF BUTON=0 THEN
  TOGGLE LED:
  WHILE BUTON=0:WEND
  IF DUR=0 THEN SIFIRLA
  IF LED=1 THEN
     HIGH PORTA.1:LCDOUT $FE,1,"MOTOR "
     HIGH PORTA.2:LCDOUT $FE,$C0,2           'D2
     GOSUB BEKLE:IF POZ=1 THEN SIFIRLA
     HIGH PORTA.3:LCDOUT $FE,$C0,3           'D3
     LOW PORTA.2
     PAUSE 150
  ELSE
'     LOW PORTA.1:LOW PORTA.2:LOW PORTA.3
HIGH PORTA.3
LOW  PORTA.2:LCDOUT $FE,1,"MOTOR           ":LCDOUT $FE,$C0,3
ENDIF
ENDIF
goto basla

Powered by EzPortal