Son değeri tutabilen sayıcı

Başlatan onurinci, 21 Ağustos 2017, 03:47:46

onurinci

hocam MAX7219'u inceledim benim boyumu kat kat aşar,7 segment displaydan vazgeçtim,programı dikkatlice 2x16 LCD'ye uyarladım,sonuçta çalıştırabildim.fakat LCD refresh yani tazelemesi gözü son derece rahatsız ediyor,pause'yi fazla versem,bu seferde sayı kaçırıyor yani geç çalışıyor,bir yöntemi varmı hocam ?

@ DEVICE PIC16F628A,INTRC_OSC_NOCLKOUT,WDT_OFF,MCLR_OFF,PWRT_ON,BOD_OFF,LVP_OFF,CPD_OFF,PROTECT_OFF
DEFINE OSC 4

TRISA= %00000011 : PORTA= 0
TRISB= %00000000 : PORTB= 0

CMCON= 7


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


SYMBOL but2= PORTA.0
SYMBOL but3= PORTA.1
symbol alarm= PORTA.2

SAYAC  VAR WORD
I      VAR BYTE

'**********************
      PAUSE 200

      READ 0,sayac.BYTE1,sayac.BYTE0
IF SAYAC= 65535 THEN SAYAC= 0
     GOSUB AYARLA
     
   
     
Start:
'****** Alarm routine ************************************
IF SAYAC>5 and SAYAC<545 THEN
   ALARM=0
ELSE
  ALARM=1
ENDIF
'*********************************************************       


      GOSUB ekran
     
IF but2= 0 THEN
      GOSUB artir
ENDIF

IF but3= 0 THEN
      GOSUB eksilt
ENDIF
     
      goTO Start   



ekran:
    LCDOUT $FE, $C0              ' Set cursor at the beginning of the second order
    LCDOUT $FE,1,DEC SAYAC," ","pf"       

    Pause 100
      RETURN

EKSILT:
SAYAC= SAYAC-1
IF SAYAC= 65535 THEN SAYAC= 0
      GOSUB AYARLA
      RETURN
     
     
ARTIR:
SAYAC= SAYAC+1                                                     
IF SAYAC= 1000 THEN SAYAC= 999
      GOSUB AYARLA
      RETURN
     
   
     

AYARLA:

      WRITE 0,sayac.BYTE1,sayac.BYTE0 : GOSUB delay
delay:
FOR  I=0  TO 250
      PAUSE 1
NEXT
      RETURN
     

END

Elektronikprojem

Pause 250 en ideali sanki. Bunun bir çözümü var aslında. Sayıda değişim olduğunda gosub ekran dersen ekran sayı artışında yenilenir.Böylelikle pause vermek zorunda da kalmazsın.
Birde buton arttırma ve eksiltme komutlarına bir while wend eklersen daha sağlıklı olur sanki

Elektronikprojem

@ DEVICE PIC16F628A,INTRC_OSC_NOCLKOUT,WDT_OFF,MCLR_OFF,PWRT_ON,BOD_OFF,LVP_OFF,CPD_OFF,PROTECT_OFF
DEFINE OSC 4

TRISA= %00000011 : PORTA= 0
TRISB= %00000000 : PORTB= 0

CMCON= 7


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


SYMBOL but2= PORTA.0
SYMBOL but3= PORTA.1
symbol alarm= PORTA.2

SAYAC  VAR WORD
I      VAR BYTE

'**********************
      PAUSE 200

      READ 0,sayac.BYTE1,sayac.BYTE0
IF SAYAC= 65535 THEN SAYAC= 0
     GOSUB AYARLA
     
   
     
Start:
'****** Alarm routine ************************************
IF SAYAC>5 and SAYAC<545 THEN
   ALARM=0
ELSE
  ALARM=1
ENDIF
'*********************************************************       



     
IF but2= 0 THEN
      GOSUB artir
      GOSUB ekran
ENDIF

IF but3= 0 THEN
      GOSUB eksilt
      GOSUB ekran
ENDIF
     
      goTO Start   



ekran:
    LCDOUT $FE, $C0              ' Set cursor at the beginning of the second order
    LCDOUT $FE,1,DEC SAYAC," ","pf"       

    Pause 10
      RETURN

EKSILT:
SAYAC= SAYAC-1
IF SAYAC= 65535 THEN SAYAC= 0
      GOSUB AYARLA
      RETURN
     
     
ARTIR:
SAYAC= SAYAC+1                                                     
IF SAYAC= 1000 THEN SAYAC= 999
      GOSUB AYARLA
      RETURN
     
   
     

AYARLA:

      WRITE 0,sayac.BYTE1,sayac.BYTE0 : GOSUB delay
delay:
FOR  I=0  TO 250
      PAUSE 1
NEXT
      RETURN
     

END

ete

#3
Sende sıkıntı yaratan eproma kayıt bölümü bence. Her kayıttan sonra 250 ms gecikme veriyorsun. Bu döngü ile verildiği iin birazda komut gecikmesi giriyor işin içine Bence döngüyü kaldır sadece pause 10 ya yeterli.
Ekranda bir görüntünün izlenebilir olması için 100 ms gecikme gerekir. Hızlı sayan sistemlerde ne saydığı yada hızlı geçişlerin önemi yoktur. Nerede kaldığı önemlidir sayma yavaşlayınca yada durduğunda ekranda normal sayını görebilirsin.
Buton kontrollerine ya gecikme koyacaksın ki eproma kayıt kısmı bunu karşılıyor yada tek tek butona basabilmek için While - wend döngüsü ile onu kontrol altına alacaksın. Dediğim gibi sayma herzaman hızlı olur ne syadığı önemli değildir. Hızlı sayıcı istiyorsan tabiiki. Durunca sayacın ne değerde olduğunu görebilirsin.

Hoşuma gitmeyen bir bölüm var;
AYARLA:

      WRITE 0,sayac.BYTE1,sayac.BYTE0 : GOSUB delay
delay:
FOR  I=0  TO 250
      PAUSE 1
NEXT
      RETURN

Write komutundan sonra GOSUB delay demesen zaten program oraya gidecek ve gecikmeyi yaratıp geri dönecektir.
Sende ise önce Gosub ile delay komutunu çalıştırıyor. Sonra tekrar delaya gelerek bir daha çalıştırıp geri dönüyor.
Bu durumda her kayıt rutininden sonra 500 ms gecikme vermiş oluyorsun. Oradaki GOSUB komutunu silmen gerek.

Ete

onurinci

Hocam sallanmada azıcık fark oldu,fakat devam ,LCD delay için Pause100 sanki iyi bunu düşürürsem ikişer ikişer atlıyor,artırırsam çok geçikiyor, hocam müsaitseniz birde butonlar için while örneği verebilirmisiniz.

Furkan verdiğin örnekte gerçekten display sallanması duruyor,fakat açılışta ekran yok herhangi bir butona basar isem geliyor, birde tepkime baya yavaşlıyor..

ete

Programda bazı noktalara dikkatini çekmek isterim.
Butona basıldıktan sonra şayet yeterince gecikme koymazsan aslında sayaç çok hızlı sayar ve sen elini butondan çekinceye kadar birkaç sayma yapabilir.
While:wend eklemekle, butona basmakla birlikte  çift yada birden bazla sayma işini önlersin. Ancak bu seferde sayma çok yavaşlar ve her bir artırma yada eksilme işleminde sürekli butona basıp bırakmak zorunda kalırsın ki buda sıkıcı olur bazen.

LCD ekranı kullanma biçiminde hiç güzl değil. Her akran komutunda ekranı sildirip yeniden yazarsan ekranda titreme imajı kaçınılmaz olur. Bunun yerine direk yazdırma her zaman daha iyidir. Yada yalnızca değişen kısmı ekrana yazmak daha iyidir.
Bir satır ekran komutu için Gosub kullanmakda anlamsız geliyor bana.

Ben şimdi simulasyonda denedim yalnızca delay kısmını kaldırıp yerine pause 10 koyarak yeterlki bir sayma hızı yakalanıyor.
Bu gibi durumlarda ben şunu tercih ederim. Butona basıldığı sürece sayma yada eksiltme yeterince hızlı olmalı. Eproma kayıt işi elimi butondan çekersem devreye girmeli. Her seferinde kayıt almak da epromu bir gün bitirir.

Aşağıda düzelttiğim programı koyuyorum. Butonlara while wend ilave ettim ancak birinde kapattım komutu. Aradaki farkı görebilesin diye istersen açar kullanırsın.
Ete
@ __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT 
DEFINE OSC 4

TRISA= %00000011 : PORTA= 0
TRISB= %00000000 : PORTB= 0

CMCON= 7


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


SYMBOL but2= PORTA.0
SYMBOL but3= PORTA.1
symbol alarm= PORTA.2

SAYAC  VAR WORD
I      VAR BYTE

'**********************
lcdout $fe,1
PAUSE 200

      READ 0,sayac.BYTE1,sayac.BYTE0
IF SAYAC= 65535 THEN SAYAC= 0
     GOSUB AYARLA
     
   
     
Start:
'****** Alarm routine ************************************
IF SAYAC>5 and SAYAC<545 THEN
   ALARM=0
ELSE
  ALARM=1
ENDIF
'*********************************************************       


   lcdout $fe,$80,dec sayac," ","pf "
     
IF but2= 0 THEN
      GOSUB artir
      while but2=0:wend
      pause 50
ENDIF

IF but3= 0 THEN
      GOSUB eksilt
'      while but3=0:wend
'      pause 50
ENDIF
     
      goTO Start   

EKSILT:
SAYAC= SAYAC-1
IF SAYAC= 65535 THEN SAYAC= 0
      GOSUB AYARLA
      RETURN
     
     
ARTIR:
SAYAC= SAYAC+1                                                     
IF SAYAC= 1000 THEN SAYAC= 999
      GOSUB AYARLA
      RETURN
           

AYARLA:

      WRITE 0,sayac.BYTE1,sayac.BYTE0 :pause 10
      RETURN     

END

onurinci

hocam sağolun sanki bu daha iyi olmuş..
amacım hani radyolarda varyabıl kondansatör olur onu motor ile kontrol edebilmek,motor kısmı Stepper ile oraları kusursuz çalışıyor,ama takdir edersinizki varyabıl belli bir açıda çalışabiliyor.eprom bozulması konusunu sizin yazılarınızdan dikkatlice okumuştum.
aslında eeprom' a sürekli değilde misal her 10 yada 20 saniyede bir yazdırmanın yollarını arayacağım,çatıda anteni tune eden bu varyabılın tam olarak konumunu bilmeliyimki,frekans düşünce yada artınca sağamı solamı döndüreceğime karar verebilmeliyim,bu varyabılın miline bağlı bir disk'e yapıştırdığım siyah etiketleri optik olarak izleyerek sayım yapıyorum,
aslında yardımınız olmadan buralara dahi gelemezdim,hocam çok sağolun argeye devam...

İlyas KAYA

Optik olarak çalışır ancak tozdan etkilenir. Çok turlu yada kaliteli bir potans ile variable ın nerde olduğunu çok rahat anlarsınız. Süre Saymanızda gerekmez, eprom kullanmanız da gerekmez. Manuel olarak hareket dahi etse konumunu direnc değerini okuyarak bulabilirsiniz. Tek yapmanız gereken potansi adc ile okumak ve potansi iyi bir noktaya yerleştirmek
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

onurinci

@İlyas KAYA
hocam ilk olarak aynen dediğiniz gibi yaptım,fakat klasik ADC rutini kullanınca ekrandaki rakam + - 1 yada 2 digit geziniyor.opamp falan koydum kar etmedi,ADC filitre teknikleri ile çözersin dediler o da benim seviyemi aşıyor,60'na geldim artık öğrenemiyorum,optik sıkıntı olabilir diye bütün gün züccaciyede uyduruk çin küpeleri aradım bunların mıknatısı küçücük,elimde REED kontakt yok bulunca deneyeceğim.
bütün uğraşılarım posizyon bilgisini kaybetmemek,tıpkı eski uydu çanağı posizyonerleri  mantığı..

yanımda 200PPR magnetic Hall  bir Encoder var bu kablo ile 10 metre yukarıda A4988 sürücü ve  1.8 derece 200 adım bir stepper'e bağlı,motorun miline'de bir encoder bağlıyım diyorum,uygulamalarda Picbasic ve proton sınıfta kalıyor,oraları Asembler yazmak lazım,bakalım yaz daha bitmedi uğraşmaya devam..

http://etepic.com/index.php/topic,3651.0.html

Hattuşa

onurinci hocam iyi bir radyocu lazım, şöyle AM transmitter ve receiver yapmaktan anlayan. varyabl cond. vs deyince atlayayım dedim. ben bu konuya iyice fransızım ;D  ;D  ;D

onurinci

@pro-TR
1976 'dan beri alıcı vericiler ile uğraşıyorum,30 yıl Motorola'da çalıştım,PCB özürlü olduğum için kendi tasarımlarım delikli plaketten öte gitmedi,yaptığım şeyler beni tatmin etmez ,kafamda neler neler tasarlarım,biriktirdiğim parçalara bir servet ödedim,teknoloji öyle hızlı ilerliyorki,artık benim bildiklerimin hiç bir önemi kalmadı desem yeridir,artık devir SDR'lerin ultra highspeed Flash ADC ve Dac'ların,parmak kadar ekipmanla 10KHz'den 3GHz ye kadar hükmedebiliyorsun ,buda benim canımı sıkıyor..

TA2GC Engin TURAN

Hattuşa

hocam katılmıyorum size, gelişen teknoloji insanı tembelleştiriyor. bu gerek fiziki gerekse bilgi yönünde tembelleşiyor. dijital elekronik ne kadar ilerlese de analogun hükümranlığından kurtulamıyor. çünki dijital denen dünya tek başına hiç bir şey tabi herşeyi hazır modüllerle yapmayacaksanız. adamlar ardiono diye bir sistem geliştirmişler görüyoruz adam herhangi bir sensörü okumak isterse takıyor sensörü bir yerlerden de o sensöre ait hazır kodu dahil ediyor programa gelsin veriler. biz basicciyiz ya eğer ilk defa çalıştıracaksanız o sensörün datasheetini hatim ediyoruz. bizden önceki ASM cileri hayal bile edemiyorum. resmen iğne ile kuyu kazıyorlar. bu söylediklerim her ne kadar yaw ne güzel işte dedirtse de en küçük bir problemi aşmada temel olmadığı için tıkanmalara sebep oluyor.

bu arada hocam eğer uygun görürseniz size özel mesajla bir kaç sorum olacak, hocam balık istemiyorum. sadece yol gösterin yeter

Powered by EzPortal