12f675 de bir algoritma sorunu

Başlatan muyat, 15 Haziran 2017, 02:58:42

muyat

12f675 de bir oyuncak motoru kontrolü yapıyorum.İleri geri hareketleri butona bastıgım süre kadar olcak hep.Ve 5 saniyeyi kesinlikle geçmicek.
Örnegin Butona 5 saniye veya 5 saniyeden daha uzun bile basarsam;
5 saniye ileri yönde hareket edecek.5 saniyelik süre dolunca elim hala butonda ise o şekilde kalcak elimi butondan çekince(ve enaz 5 saniye boyunca tekrar butona basmazsam) 5 saniye geri gelcek.Yani butona bastıgım süre kadar ileri ve butonu bıraktıgım süre kadar da geri gelcek.
Aşagıdaki algoritmada örnegin butona 3 saniye basarsam butonu bırakınca da 3 saniye geri geliyor buraya kadar sorun yok. Fakat yapmak istedigim şey şu:
Butona örnegin 5 saniye bastık,
İleri yönde 5 saniye hareket etti,
Butondan elimizi çektik,
5 saniye geri geliyorken 5 saniyelik   süre dolmadan örnegin 3.saniyede elimi tekrar butona basınca 3 saniye ileri hareket etmesini istiyorum.Yani geri gelen araba tekrar ileri giderek eski konumuna gelcek fakat aşagıdaki algoritmada bunu yapamadım.Son konumuna gelmiyor geçiyor çizgiyi.Düzeltebilir misiniz?Yeterince



@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON &_MCLRE_OFF & _CP_ON  

CMCON=7
ANSEL=0

EEPROM 0,[0]

             
DEFINE OSCCAL_1K 1
DEFINE OSC 4

TRISIO=%01111100




BUTON VAR GPIO.2     
MAVI VAR GPIO.0     
SARI VAR GPIO.1     
C VAR WORD
SAYIM VAR word
SAYICI VAR WORD
PARONAY VAR BIT
X VAR WORD
Y VAR WORD
AC VAR BIT
GPIO=0
         
CLEAR
READ 0,AC

        PAUSE 1000
       

BAS:

IF AC=0 AND BUTON=0 then      'BUTONA BASTIK
GOSUB PARAZITSAY
IF PARONAY=1 THEN 
GOSUB ILERI                   'ILERİ ETİKETINE ATLADI
ENDIF
ENDIF

IF AC=1 AND BUTON=1 THEN     'bUTONU BIRAKTIK
PAUSE 1000
GOSUB GERI
ENDIF

GOTO BAS


ILERI:      'ILERI ROLESINI AÇ
AC=1             
SARI=1
PARONAY=0



FOR c=X to SAYICI '5000e kadar say
SAYICI=SAYICI+1         

IF BUTON=1 THEN
SARI=0
PAUSE 1000
GOTO ATLA
ENDIF

PAUSE 1

IF SAYICI=5000 THEN

SARI=0
GOTO M3
ENDIF
NEXT

M3:

SARI=0
ATLA:
C=0
SARI=0
PAUSE 500

RETURN




GERI:    'GERI ROLESINI AÇ           
X=0
AC=0
MAVI=1             
       
FOR C=0 TO SAYICI              '
Y=Y+1 

IF BUTON=0 THEN
MAVI=0
PAUSE 1000
SAYICI=5000-Y
GOTO ATLA2
ENDIF

PAUSE 1

NEXT
SAYICI=0

MAVI=0               

ATLA2:
C=0
MAVI=0

PAUSE 500

RETURN



PARAZITSAY:
SAYICI=SAYICI+1               'sayım yap
PAUSE 2                 

IF SAYICI>=30 THEN          '59 ye kadar saydı ise
PARONAY=1                      'parazit değil onayla
GOTO SON                     
ELSE
PARONAY=0
ENDIF

IF BUTON=0 THEN GOTO PARAZITSAY '

SON:
SAYICI=0
         
RETURN
end

ete

#1
Zaman tutarken başka bir işi yapacak yada kontrol edeceksen pause ler kullanarak çözüme ulaşamazsın. Çözüm tmr0 veya daha iyisi tmr1 sayacını kullanmaktır.
Tmr1 sayacı 16 bitlik bir sayac olmasına karşın rağmen büyük zaman dilimlerini sayamaz.
Çaresi standart bir zaman dilimi alıp dilimleri sayarak büyük dilime ulaşmaktır. Örnek vereyim. 4 mhz de bu sayac 1/8 bölme oranı ile 500 ms lik bir zaman dilimini sayacak şekilde kurulabilir. Bu dilimleri sayarak dakikaları saydırmak mümkündür. Tabiiki bu saydırma geri planda yapılırken sende tuşa basılmışmı  yada bırakılmış mı bakabilir ve cevap evet ise anında sayactan çıkıp diğer işe gidebilirsin sana lazım olan budur.
Programın başında bir eprom hafızasından bir değer okuyup bit değişkenine yerleştirmişsin. Hafıza byte değerindedir ve 8 bitten oluşur. Bu sorunu şöyle halledebilirsin. Ya ac değişkeni byte olacak sen yine ona 1-0 değerini vereceksin yada bu okumayı read 0,temp şeklinde byte olarak yapıp ardından Ac=temp.0 şeklinde bit0 değerini Ac değişkenine aktaracaksın.
Programı düzeltin demişsin ama yeni mantığa göre bir sürü kod yazmak gerekir. Sen yaz bizbdüzeltelim yine. Anlayacağın yeni bir program yazman gerek.
Ete

ete

Bir örnek vereyim dedim ama anlattığın şeyleri anlamakta zorluk çekiyorum.
1. Butona bastık her ne olursa olsun 5 sn ileri dönecek motor.
2. Motor 5 sn döndü ve durduruldu. Hala Butona basıyor isem konumunu bozmadan bırakıncaya kadar bekleyecek.
3. Motor durduktan sonra butona basılmıyor ise o zaman motor 5 sn geri dönmeye başlayacak.
4. Geri dönerken şayet yeniden butona absarsam bu seferde 3 sen ileri gidecek ve duracak.
anladığım bu gelelim anlamadığıma.
Butona bastığım süre kadar geri gidecek demişsin o halde bu 5sn meselesi ne olacak.
O zaman açıklaman yanlış oluyor. Ayrıca ger giderken 3 sn ileri gidip sonra ne yapacak?
Daha iyi bir açıklama olması gerek.
Ete

Powered by EzPortal