yardım talebi

Başlatan onurinci, 14 Ocak 2020, 15:44:43

onurinci

hocam saygılar hurda'dan tuşları kopmuş bir frekans sayacı buldum,baktım tuşları hariç gerisi sağlıklı çalışıyor,basit bir ön panel yaptım,eski tavsiyelerize uymaya gayret ederek bir şeyler yapmaya çalıştım.
iki adet gurup mevcut birinci fonksiyon seçimi,ikinci süre secimi,bunları dikkatlice sayıcıya bağladım ve sayıcıyı çalıştırdım,en son bıraktığım değerleride hafızada tutabildim.

fakat süre butonları gayet sağlıklı çalışırken, fonksiyon bütonları,süre menüsüne müdahele ediyor ,bir süre sonra pes ettim,belkide yaptığım uygulama belki MCU'nun çalışma mantığına aykırıdır diye düşündüm,
kısacası yardım talebinde bulunuyorum.. ekte simulasyon dosyaları mevcut..
@ DEVICE pic16F876, WDT_OFF, PWRT_ON, PROTECT_OFF, XT_OSC
DEFINE OSC 4

TRISA= %00000000 : PORTA= 0
TRISB= %00000011 : PORTB= 0
TRISC= %11000000 : PORTC =0
ADCON1= 7 :'CMCON= 7 

DEFINE LCD_DREG PORTB	
DEFINE LCD_DBIT 4		
DEFINE LCD_EREG PORTB	
DEFINE LCD_EBIT 3		 
DEFINE LCD_RSREG PORTB	
DEFINE LCD_RSBIT 2		
DEFINE LCD_BITS 4		
DEFINE LCD_LINES 2


SAYI_A    VAR BYTE
DEGISTI_A VAR BIT
SAYI_B    VAR BYTE
DEGISTI_B VAR BIT
'-------------------------------------------------------------------------------
      READ 10,SAYI_A
 IF SAYI_A= 255 THEN SAYI_A= 0

Start:
'-------------------------------------------------------------------------------
 IF  PORTB.0= 0 THEN  
DEGISTI_A= 1
SAYI_A= SAYI_A +1
 IF SAYI_A > 5 THEN SAYI_A= 5    'XXXXXXXXXXXXXXXXXXX 5
   WHILE PORTB.0= 0 : WEND 
      PAUSE 30
ENDIF    
'-------------------------------------------------------------------------------
 IF PORTB.1= 0 THEN
DEGISTI_A= 1 
SAYI_A= SAYI_A-1
 IF SAYI_A= 255 THEN SAYI_A= 0
   WHILE PORTB.1= 0 : WEND
      PAUSE 30
ENDIF
'-------------------------------------------------------------------------------    
' IF PORTA.2= 0 THEN 
'SAYI_A= 0
'DEGISTI_A= 1
'ENDIF
'------------------------------------------------------------------------------- 
 SELECT CASE SAYI_A
    CASE 0  : LCDOUT $FE,$80," Frequency      " :PORTC= %00000001
    CASE 1  : LCDOUT $FE,$80," Period         " :PORTC= %00000010
    CASE 2  : LCDOUT $FE,$80," Frequency Ratio" :PORTC= %00000100
    CASE 3  : LCDOUT $FE,$80," Time Interval  " :PORTC= %00001000
    CASE 4  : LCDOUT $FE,$80," Unit Counter   " :PORTC= %00010000
    CASE 5  : LCDOUT $FE,$80," Int Oscillator " :PORTC= %00100000

   

 END SELECT
'      LCDOUT $FE,$C0,"SAYI_A=",DEC2 SAYI_A  'sayı değerini görmek için ekledim gerekirse silersin
'------------------------------------------------------------------------------- 
 IF DEGISTI_A= 1 THEN
      WRITE 10,SAYI_A : PAUSE 30
DEGISTI_A= 0
ENDIF
'------------------------------------------------------------------------------- 

 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
'SAYI_B    VAR BYTE
'DEGISTI_B VAR BIT
'-------------------------------------------------------------------------------
      READ 10,SAYI_B
 IF SAYI_B= 255 THEN SAYI_B= 0

''Start:
'-------------------------------------------------------------------------------
 IF  PORTC.6= 0 THEN  
DEGISTI_B= 1
SAYI_B= SAYI_B +1
 IF SAYI_B > 3 THEN SAYI_B= 3     'XXXXXXXXXXXXXXXXXXXXXXXXXXXX   3
   WHILE PORTC.6= 0 : WEND 
      PAUSE 30
ENDIF    
'-------------------------------------------------------------------------------
 IF PORTC.7= 0 THEN
DEGISTI_B= 1 
SAYI_B= SAYI_B-1
 IF SAYI_B= 255 THEN SAYI_B= 0
   WHILE PORTC.7= 0 : WEND
      PAUSE 30
ENDIF
'-------------------------------------------------------------------------------    
' IF PORTA.5= 0 THEN 
'SAYI_B= 0
'DEGISTI_B= 1
'ENDIF
'------------------------------------------------------------------------------- 
 SELECT CASE SAYI_B
    CASE 0  : LCDOUT $FE,$C0," 0.01s/1 Cycles" :PORTA= %00000001
    CASE 1  : LCDOUT $FE,$C0," 0.1s/10 Cycles" :PORTA= %00000010
    CASE 2  : LCDOUT $FE,$C0," 1s/100  Cycles" :PORTA= %00000100
    CASE 3  : LCDOUT $FE,$C0,"10s/1000 Cycles" :PORTA= %00001000


   

 END SELECT
 '     LCDOUT $FE,$C0,"SAYI_B=",DEC2 SAYI_B  'sayı değerini görmek için ekledim gerekirse silersin
'------------------------------------------------------------------------------- 
 IF DEGISTI_B= 1 THEN
      WRITE 10,SAYI_B : PAUSE 30
DEGISTI_B= 0
ENDIF
'-------------------------------------------------------------------------------      





     
      GOTO Start
END

ete

#1
Açıkçası nasıl bir sorun olduğunu ne anlayabildim nede görebildim.
Gördüğüm yegane olumsuzluk her bir fonksiyon için ayarladığın gate değerinin sabit kalamadığı.
Yani bir fonksiyon için ayarladığın Gate değeri fonksiyonları değiştirip tekrar aynı fonksiyona geldiğinde sabit kalmamış oluyor. Bana kalırsa fonskiyonlar için ayarlanmış gate değerleride hafızaya alınmalı ve tekrar aynı fonksiyona döndüğünde o gate değeri aynı şejilde görülmeli.
Sorun dediğinde zaten bu ise dizi değişkenlerine müracaat etmen gerekecek ve kayıt alırken bunlarıda kayıt alman gerekecek.
Funk[Index] isminde 0-5 (fonksiyon) aralığı için bir dizi değişkenimiz olursa
Funk[index]=0 verdiğimizde ilk gate değeri, sıfır yerine 1 verdiğimizde 1 nolu gate değerini hafızada saklıyor anlamına gelecektir.

Bunun ötesinde select case seçeneği ile her bir seçeneğin alması gereken değerleri de ayarlamak zor olmayacaktır.

Toparlayacak olursak. Elinde index olarak kullandığın (SAYI) isimli değişkenin var.
SAYI değerinin kendisi hangi fonksiyonda olduğunu belirleyecek. Bunu FONK[Index]değişkeninde index olarak kullandığın zamanda o fonksiyona karşılık gelen Gate seçeneğin otomatik olarak seçilmiş olacaktır.
En iyisi sen ilişikteki programı bir dene bakalım farkı görebilecekmisin.
Sigorta ayarlarını kendine göre değiştir gerekirse. versiyon 3.1 e göre verdim çünki.

Ete

onurinci

Hocam çok teşekkür ederim ,bu yöntemi bilmiyordum..
hata halen devam ediyor üst menü alt menüyü sağa sola sürüklüyor.
acaba eeprom'da aynı adres'emi yazdırıyorum .
örnek ilk menü iyi çalışıyor gibi sağa doğru ilerlerken bazı evrelerde alt satırda sürüklenmeler devam ediyor.

benim program herhalde felaketti, üst menüyü hareket ettirince alt menü tamamen sürükleniyordu.cihazın panelinde ancak bir adet LCD sığdırabileceğim boşluk var,ayrı ayrı iki Pic yazarsam makina gayet güzel çalışıyor,biraz daha uğraşayım hocam,tekrar teşekkür ederim..

ete

İsiste böyle bir sorun gözükmüyor. Bahsi geçen sorunların ana kaynağı lcd nin kendisidir. Örnek vereyim. 2*16 olarak kullanmak üzere planladığın bir programda lcd yi 2*20 olarak kullanırsan 2 ci satıra yazdırdığın bazı karekterler 1 ci satırda çıkar yada tersini yaparsan 1 e yazdıkların 2 ci satırda çıkar, sende de benzer bir şey oluyordur. Kullandığın lcd nin ne olduğunu iyi belirle ve programın ile karşılaştır, aslında görebilesek hemen anlaşılır.
Ete

Powered by EzPortal