bozuk para kanalı devre hk

Başlatan yolcu27, 23 Aralık 2016, 21:59:56

yolcu27

Arkadaşlar 1 tl ile çalışan oyuncakların bozuk para modülünden aldım modül ile birlikte birde devre kurmam gerekiyor. modüle para atınca çıkış veriyor. ben bu çıkışı portd.2 ye giriyorum. buna göre belirli programlar çalıştırmak istiyorum ama kaldım. senaryoyu yazayım fikirlerinizi alayım birde
senaryo:

devre ilk açıldığında 10sn içinde program seçmek için bir ekranımız olacak . bir buton ile programlar arasında geçiş yapacağız. bu ekranda yazacak program1 2 3 4 diye.

daha sonra bu programa göre para atılarak portd.3 ten çıkış alacağım her programda 30 dk arttırarak yani 30 60 90 120 diye. 

şuana kadar program seçip ekranda görünmesini sağladım. Program için para adlı bir değişken atadım. her para atıldıgında pord.2=1 oalcak ve para=para+1 olacak. bu para atma süresi 10 sn olacak 10 sn içinde paramız programımızın şartına uygun ise portd.3 çıkış verecek değilse beklemeye devam edecek.

şimdi yazarken farkettim 30 dk çalışma bitince ne olacak :) program başa dönüp yeniden program seçmemizi istemesi lazım burada da 10 sn olacaktı. ozaman bunun öncesinde bir buton ekleyeyim ve butona basıldığında program seçe girsin. program çalışması bitince de yeniden o program seçe yönlendirecek butona basılmasını beklesin. ( BU KISIMI HALLEDEBİLİRİM)


@ DEVICE pic16F877      
@ DEVICE pic16F877, WDT_off
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC

TRISA=%00010000  ' porta4 GİRİŞ GERİSİ çıkış
TRISB=0            ' PORTB ÇIKIS
TRISD=%00000101             ' PORTD.0 giriş gerisi çıkış
PORTD=0              ' PORTD SIFIRLANDI
PORTA=0             ' PORTA SFIRLANDI

DEFINE LCD_DREG PORTD        'LCD data bacakları PortD ye bağlı
DEFINE LCD_DBIT 4            'LCD data bacakları 4. bit den başlıyor
DEFINE LCD_RSREG PORTB       'LCD RS Bacağı PortB ye bağlı 
DEFINE LCD_RSBIT 1           'LCD RS bacağı 1. Bite bağlı 
DEFINE LCD_EREG PORTB        'LCD Enable Bacağı PortB ye bağlı
DEFINE LCD_EBIT 3            'LCD Enable Bacağı 3. bite bağlı 
DEFINE LCD_RWREG PORTB       'LCD RW Bacağı PortB ye bağlı
DEFINE LCD_RWBIT 2            'LCD RW Bacağı 2. bite bağlı
DEFINE LCD_BITS 4            'LCD 4 bit olarak bağlı
DEFINE LCD_LINES 2           'LCD 2 sıra yazabiliyor

say var byte
x var word 
para var byte
clear
pause 200
 
 
 ana:
   
LCDOUT "MENU TUSUNA     "           
LCDOUT $FE,$C0,"BASINIZ         "
 
 if portA.4=1 then
 GOTO EKRAN
 ENDIF
 
 goto ana
 
 
ekran:

lcdout $fe,1      
LCDOUT "PROGRAM SECINIZ"



secme:
SAY=0



 FOR X=0 TO 100

while portd.0=1   
say=say+1   
gosub kontrol 
wend

IF SAY=5 THEN SAY=0    
pause 100
 NEXT
 GOTO PROGKONTROL   




kontrol:

if say=1 then    
lcdout $fe,1      
LCDOUT "PROGRAM 1"


endif

if say=2 then    
lcdout $fe,1      
LCDOUT "PROGRAM 2"


endif

if say=3 then    
lcdout $fe,1      
LCDOUT "PROGRAM 3"

endif

if say=4 then    
lcdout $fe,1      
LCDOUT "PROGRAM 4"

endif


return


PROGKONTROL:
pause 100
if say=1 then prog1
if say=2 then prog2
if say=3 then prog3
if say=4 then prog4

goto progkontrol


prog1:

lcdout $fe,1      
LCDOUT "PROGRAM 1"
LCDOUT $FE,$C0,"JETON ATINIZ"

for x=0 to 200
while portd.2=1 
para=para+1
wend
pause 50
next

if para=1 then
portd.3=1
pause 10000
portd.3=0
goto ana
endif

goto prog1


prog2:

lcdout $fe,1      
LCDOUT "PROGRAM 2"
LCDOUT $FE,$C0,"JETON ATINIZ"

for x=0 to 200
while portd.2=1 
para=para+1
wend
pause 50
next

if para=2 then
portd.3=1  
pause 10000
portd.3=0
goto ana
endif

 goto prog2
prog3:

lcdout $fe,1      
LCDOUT "PROGRAM 3"
LCDOUT $FE,$C0,"JETON ATINIZ"

for x=0 to 200
while portd.2=1 
para=para+1
wend
pause 50
next

if para=3 then
portd.3=1 
pause 10000
portd.3=0
goto ana
endif
goto prog3

prog4:

lcdout $fe,1      
LCDOUT "PROGRAM 4"
LCDOUT $FE,$C0,"JETON ATINIZ"

for x=0 to 200
while portd.2=1 
para=para+1
wend
pause 50
next

if para=4 then
portd.3=1
pause 10000
portd.3=0
goto ana
endif


  goto prog4






SONRADAN PORTA.4 PİNE BUTON BAGLADIM MENU YE GİRMEK İÇİN BUNA BASILMASI GEREK. PROGRM BİTİNCE MENU TUSUNA YÖNLENDİRDİM.

SORUNUM PROG1 İÇİN 30DK LIK SÜRENİN BAŞLAMASI İÇİN 1 JETON ATILMASI GEREK BUNU BUTON İLE YAPMAYA ÇALIŞMAMA RAĞMEN  BİR TÜRLÜ BAŞARAMADIM.

SANIRIM SORUNLU OLAN KODLAR ŞUNLAR

prog3:

lcdout $fe,1      
LCDOUT "PROGRAM 3"
LCDOUT $FE,$C0,"JETON ATINIZ"

for x=0 to 200
while portd.2=1 
para=para+1
wend
pause 50
next

if para=3 then
portd.3=1 
pause 10000
portd.3=0
goto ana
endif
goto prog3



BU ALT PROGRAMLARDA SORUN VAR SANIRIM

papsukkal

#1
Nasıl bir sıkıntı yaşıyorsun?

d1 deki butona basınca buton serbest kalıncaya kadar say değişkeni devamlı sayar. Burada butona bir defa basınca say değişkeninin 1 artmasını garantilemen lazım. Bunun için de while yerine burada da if kullan. Şimdilik benim gördüğüm bu.

Ya da while döngüsünden çıkınca say değişkeninin bir artmasını sağlayabilirsin. Bu şekilde de buton basılı  kaldığı süre içinde program while içinde döner buton serbest kalnca say bir artar ve yoluna devam eder.

Kolay gelsin.

----

Yanlış while komutunu incelemişim  :) aynısı para girişi için de geçerli.

Bir de BASIC te bu kadar uzun pause komutundan kaçınmanı tavsiye ederim. pause 10000 demek programın 10000 ms pause komutu içinde kalması ve bu süre içinde dünyadan irtibatını kesmesi demek. Daha sonra kesme v.s. kulanırsan sıkıntı yaşarsın. 

yolcu27

Alıntı yapılan: papsukkal - 24 Aralık 2016, 13:01:27
Nasıl bir sıkıntı yaşıyorsun?

d1 deki butona basınca buton serbest kalıncaya kadar say değişkeni devamlı sayar. Burada butona bir defa basınca say değişkeninin 1 artmasını garantilemen lazım. Bunun için de while yerine burada da if kullan. Şimdilik benim gördüğüm bu.

Ya da while döngüsünden çıkınca say değişkeninin bir artmasını sağlayabilirsin. Bu şekilde de buton basılı  kaldığı süre içinde program while içinde döner buton serbest kalnca say bir artar ve yoluna devam eder.

Kolay gelsin.

----

Yanlış while komutunu incelemişim  :) aynısı para girişi için de geçerli.

Bir de BASIC te bu kadar uzun pause komutundan kaçınmanı tavsiye ederim. pause 10000 demek programın 10000 ms pause komutu içinde kalması ve bu süre içinde dünyadan irtibatını kesmesi demek. Daha sonra kesme v.s. kulanırsan sıkıntı yaşarsın.

Ozaman benim para değişkenin hiç bir zaman istediğim değere gelmiuor şuan.dediginiz gibi dışarı alıp deneme yapayım. 

Uzun pause sorun değil pause süresinde sadece led yanacak ondan dolayı o şekilde yazdım. İlginiz için teşekkürler

Adem_AYDIN

#3
Bunu yapabilirsin.

If buton=0 then a=0
if buton=1 and a=0 then
para=para+1
a=1
endif
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

crasftsman

iyi günler bu para alma haznesini nerden aldınız ne kadara aldınız ?

yolcu27

Alıntı yapılan: crasftsman - 26 Aralık 2016, 11:44:35
iyi günler bu para alma haznesini nerden aldınız ne kadara aldınız ?

merhaba toysmar dı sanırım sitenin ismi 35 liraya aldım ama çok kalitesiz çıktı . 50 liraya filan olanlar var

şimlikik sorunumu hallettim @Adem_AYDIN  nın dediği şekilde yaptım.
bekleme süresi olarak 30 60 90 120 olacak şekilde şu hesabı yaptım ama sizce doğrumudur

30 dk lık bekleme süresi için yaptım bunı
for x=0 to 1000
pause 1800
next



Adem_AYDIN

4 Mhz için:
bir saniye pause 1000
bir dakika pause 60000 (1sn x 60)

otuz dakika
for x=0 to 29 (x=1 to 30 da yazılabilir ilk değer 0 olduğundan 29a kadar 30 defa işlem yapar)
pause 60000
next
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.