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

Başlatan vardar07, 25 Mayıs 2012, 02:57:16

vardar07

Selam arkadaşlar sizler kadar usta değilim.Sitedeki konularınızdan 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 değil.sorunum. programı tek tuş ile başlatıp durdurma. 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.
Zaman ayarınıda  dışardan yapabilirsem buton veya dirençle ayarlamak istiyorum.
Yazdığım programdaki hata tuşa ikinci defa basılınca durmadan tekrar baştan start oluyor. Sizden ricam hatam nerede. 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



[IMG]http://img560.imageshack.us/img560/7260/vardar.jpg[/img]


subram

ilk olarak şu ifade de ne yapmak istemişsin?
SYMBOL LED=PORTB.0
LED=0


eğer doğru anladıysam şu şekilde değiştir
LED  VAR BIT
LED=0


Daha sonra ana programu şu şekilde değiştirmen lazım.
BASLA:

IF BUTON=0 THEN
TOGGLE LED
WHILE BUTON=0
WEND
ENDIF

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

GOTO BASLA

END


http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

ete

Bana kalırsa yazdıkların doğru. Yalnızca küçük bir hata var oda;
TOGGLE LED:WHILE BUTON
WEND
şeklinde yazdıkların.
Burada BUTON'u durduramıyorsun. Sebebide WHILE BUTON yerine WHILE BUTON=0 yazman gerektiğidir.
Bunu düzelt gerisi doğru çalışır.

@Subram;
SYMBOL LED=PORTA.0    komutu doğru bir komuttur. Bu şekilde bir "Alias" şeklinde kullanım söz konusudur. Yani PortA.0 pinine bir başka isim vermiş oluyursunuz.
LED VAR Bit  komutuda doğru ancak birisi direk portun bir biti şeklinde çalışıyor. Diğeri yalnızca bir Bit değişkeni olaak çalışıyor.
Bu nedenle LED VAR BIT denildimi ayrıca onu port pinine eşitleyecek bir ikinci komutda yazmanı gerektirir.
Meslea  LED=1 ve ardından PORTB.0=LED gibi. Halbuki SYMBOL kullanılırsa direk o pine ait biti BIT değişkeni gibi kullanabilirsin.

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

vardar07

Alıntı yapılan: subram - 26 Mayıs 2012, 16:25:55
ilk olarak şu ifade de ne yapmak istemişsin?
SYMBOL LED=PORTB.0
LED=0


eğer doğru anladıysam şu şekilde değiştir
LED  VAR BIT
LED=0


Daha sonra ana programu şu şekilde değiştirmen lazım.
BASLA:

IF BUTON=0 THEN
TOGGLE LED
WHILE BUTON=0
WEND
ENDIF

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

GOTO BASLA

END


Arkadaşım öncelikle ilgine teşekkür ederim.
SYMBOL LED=PORTB.0
LED=0   ile portb.0 a ile sistemin çalıştığını görmesi ve diğer portların referans alıp hareket etmesi için yapmıştım.
Senin tavsiyenle sistem çalışıp duruyor (isis'te) yalnız  LED ( porta.2 deki) low olması gerekirken olmadan port a.1,porta.2 ve porta.3 beraber çalışmaya devam ediyor. Hex'i pice yüklesek problem olurmu.

HIGH PORTA.3:LCDOUT $FE,$C0,3           'D3
LOW PORTA.2

busatırı
HIGH PORTA.3:LCDOUT $FE,$C0,3           'D3
LOW PORTA.2
PAUSE 100 
ve
LOW PORTA.2
PAUSE 10
HIGH PORTA.3:LCDOUT $FE,$C0,3           'D3

Olarak denedim  simulasyonda gene düzelmedi. Derleme yaparken problem yok.

vardar07

ETE hoca teşekkürler sayenizde bu yaştan sonra (öğrenmenin yaşı yokmuş) amatörce bir şeyler yapmaya çalışacağız.
subram arkadaşın cevabındaki gibi yapınca  porta.1,porta.2 verilen süre sonunda porta.3  hıgh oluyor buarada porta.3=1 olmadan porta.2 low olması lazım simulasyonda olmuyor. Normalde olurmu.?

subram

low porta.2 den sonra da pause 1500 koy. led=1 olduğu durumda 1ve 2 hıgh olur bunu görebiliyorsun çünkü. 1500 mS bekleme var. ama sonra low porta.2 yi görebilmen için yeterli süre yok. program tekarada ilk konuma geçip bekleme yapıyor.  Aşağıdaki kodu dene. bu kodda porta.1 sürekli hıgh konumda. porta.2 ve porta.3 konum değiştiriyor.

IF LED=1 THEN

LOW PORTA.3
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
PAUSE 1500

ELSE

LOW PORTA.1:LOW PORTA.2:LOW PORTA.3

ENDIF


@ETE hocam ben başka bir amaç için mi kullandı onu öğrenmek için sormuştum.  Birde kendi alışkanlığımla alakalı olarak sizin bahsettikleriniz aklıma gelmedi. şimdi düşününce dedikleriniz programlamada daha kullanışlı ve yaratıcı. öğreneceğimiz çok şey var sizden.
saygılar
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

vardar07

Subram usta senin verdiğin kod ve ete hocanın uyardığı şekli ile (BUTON'u durduramıyorsun. Sebebide WHILE BUTON yerine WHILE BUTON=0 yazman gerektiğidir) değişikliği yapınca sistem oturdu . Ben nacizane kıt bilgimle 1ve2. led yarken butona basılırsa sistemi başla komutuna döndürmeye yani ani durdurmak için uğraşıyorum. Teşekkür eder sizlerede kolaylıklar dilerim.