Elektrik kesintilerinden etkilenmemesi için hafızaya alma

Başlatan aqustic, 30 Ekim 2009, 22:47:02

aqustic

Pic basicte ledli animasyon devreleriyle ugraşıyorum.Buton yardımıyla efekt geçişleri yapabiliyorum fakat elektrik kesilip tekrar elektrik verildiginde en baştaki efektten değilde kesildigi andaki efektten başlamasını istiyorum.Hangi komutları yazmam gerekli.Bununla ilgili çok basit bi örnek varmı

ete

Öncelikle elektrik kesilmesi olayını algılamak için eeprom hafızasının 0 nolu adresine meslea 10 kayıt et. Normalde $ff veya 0 olsun o adreste.

Her bir efekt için bir numara belirle ve ilgili efekte geçerken o numarayı da eepromun 1 nolu adresine kayıt et.

Diyelimki elektrik kesildi ve devre yeniden çalışmaya başladı. İlk iş 0 nolu adrese bakmak olacak orada 10 kayıtlı ise demekki elektrik kesildi, sonra 1 nolu adresteki rakamı alacaksın ve o rakam göre ilgili efekte goto ile gideceksin hepsi bu kadar.

Tabiiki efektlerin sonunda her iki eeprom adresine $FF yazman gerekir.
Yada programdan çıkacak isen aynı işi yapman gerekir.

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

Okan AKÇA

Daha pic tam olarak anlamamışsınız anlasaydınız bu basit  şeyde takılmazdınız.

bymrz

Alıntı yapılan: "cyclone"Daha pic tam olarak anlamamışsınız anlasaydınız bu basit  şeyde takılmazdınız.

Bence o kadar basit değil :)

cyclone hocam, peki sen sadece bu basit eeproma kayıt işlemlerini yaptıktan sonra her zaman efektleri kaldığı yerden devam ettirebileceğini zannediyor musun?  ;)

Okan AKÇA

düşük voltaj kesmesini kullancaksın bitecek olay bu prof. benle başlar farkımız

Ruzgarbey

ete hocamın dediklerine katılıyorum.düşük voltaj kesmesi ile ne olacağını anlayabilmiş değilim.sistemde elektrik olmayınca düşük voltak kesmesi ne yapacak acaba? ayrıca bazılarına göre bait ve sıradan gelen bir konu bazılarına göre sadece aklına gelmediği için çok zor olabilir. ete hocamın dediği gibi bu işi picin eepromu yazarak yapabilirsin.
şimdi eepromun isteği adresi bunun için kullan. bir değişken tanımlayalım
ve pcin açılışına bu değişkene değer atayalım.ben 0. adresi kullanacağım.

efekt var byte
read 0,efekt
if efekt=$FF then efekt=1 'efekt değişkeni boş ise 1. efekten başla

bundan sonra yapmamız gereken efekt değişkenine göre döngü kurmak ve her led animasyonunda hangi animasyon oynatılıyorsa eepromun ilgili adresine o animasyonun sayısını yazmak.
select case efekt
case 1
gosub animasyon1

case 2
gosub animayon2
end select
......
animasyon2:
write 0,2 'burada 2. animasyonu eeproma yazdık.pic tekrar başladığında 2.animasyondan başlayacak..

saygılarımla kolay gelsin.
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

bymrz

Alıntı yapılan: "cyclone"düşük voltaj kesmesini kullancaksın bitecek olay bu prof. benle başlar farkımız

Cümlenin son kısmını anlayamadım?

Benim bahsemet istediğim olay farklı... Basitce düşünürseniz elbette eeproma yazarsın, vs.. vs.. sonra açılışta da okursun hangi efektte kaldığını...

Ama işlemcinin beslemesinin uçlarını elinize alın ve güç kaynağına hızlı bir şekilde 5-10 defa ard-arda değdirip bırakın, sonuç ne oluyor göreceksiniz...

ilk açılışta 500msn bekleme koydunuz ve daha sonra

Read 10, efekt

dediniz...

Yukarıda bahsettiğim olay gerçekleştiğinde değil sadece 10 nolu eeprom, diğer eeprom haneleri bile sapıtıyor... Tecrübelerimle sabittir...

aqustic

Örnek veriyorum devrenin resmi ve kodları aşagıda
Soru 1-)ADCON1=7 ve CMCON=7 komutları ne işe yarıyor anlamları nedir.Neden sonların da 7var
2-)Devrede elektrik kesilip tekrar geldiginde kaldıgı yerden devam etmesi için hangı komutları girmeliyim


ADCON1=7
CMCON=7
TRISA= %11110000
TRISB=0
TRISC=0
PORTA=0
PORTB=0
PORTC=0

BASLA:
PAUSE 1000

ALG1:
IF PORTA.4=0 THEN ALG2
PORTA= %00000001
PORTB= %00000000
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00000010
PORTB= %00000000
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00000100
PORTB= %00000000
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00001000
PORTB= %00000000
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00000000
PORTB= %00000001
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00000000
PORTB= %00000010
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00000000
PORTB= %00000100
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00000000
PORTB= %00001000
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00000000
PORTB= %00010000
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00000000
PORTB= %00100000
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00000000
PORTB= %01000000
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00000000
PORTB= %10000000
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00000000
PORTB= %00000000
PORTC= %00000001
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00000000
PORTB= %00000000
PORTC= %00000010
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00000000
PORTB= %00000000
PORTC= %00000100
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00000000
PORTB= %00000000
PORTC= %00001000
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00000000
PORTB= %00000000
PORTC= %00010000
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00000000
PORTB= %00000000
PORTC= %00100000
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00000000
PORTB= %00000000
PORTC= %01000000
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00000000
PORTB= %00000000
PORTC= %10000000
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00001111
PORTB= %11111111
PORTC= %11111111
PAUSE 500
IF PORTA.4=0 THEN ALG2
PORTA= %00000000
PORTB= %00000000
PORTC= %00000000
PAUSE 500
GOTO ALG1

ALG2:
PORTA=0
PORTB=0
PORTC=0
PAUSE 500
IF PORTA.4=0 THEN ALG2
ALG22:
IF PORTA.4=0 THEN ALG3
PORTA= %00000001
PORTB= %00000000
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00000011
PORTB= %00000000
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00000111
PORTB= %00000000
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00001111
PORTB= %00000000
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00001111
PORTB= %00000001
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00001111
PORTB= %00000011
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00001111
PORTB= %00000111
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00001111
PORTB= %00001111
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00001111
PORTB= %00011111
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00001111
PORTB= %00111111
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00001111
PORTB= %01111111
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00001111
PORTB= %11111111
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00001111
PORTB= %11111111
PORTC= %00000001
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00001111
PORTB= %11111111
PORTC= %00000011
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00001111
PORTB= %11111111
PORTC= %00000111
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00001111
PORTB= %11111111
PORTC= %00001111
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00001111
PORTB= %11111111
PORTC= %00011111
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00001111
PORTB= %11111111
PORTC= %00111111
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00001111
PORTB= %11111111
PORTC= %01111111
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00001111
PORTB= %11111111
PORTC= %11111111
PAUSE 500
IF PORTA.4=0 THEN ALG3
PORTA= %00000000
PORTB= %00000000
PORTC= %00000000
PAUSE 500
GOTO ALG22

ALG3:
PORTA=0
PORTB=0
PORTC=0
PAUSE 500
IF PORTA.4=0 THEN ALG3
ALG33:
IF PORTA.4=0 THEN ALG4
PORTA= %00000011
PORTB= %00000000
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG4
PORTA= %00001100
PORTB= %00000000
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG4
PORTA= %00000000
PORTB= %00000011
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG4
PORTA= %00000000
PORTB= %00001100
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG4
PORTA= %00000000
PORTB= %00110000
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG4
PORTA= %00000000
PORTB= %11000000
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG4
PORTA= %00000000
PORTB= %00000000
PORTC= %00000011
PAUSE 500
IF PORTA.4=0 THEN ALG4
PORTA= %00000000
PORTB= %00000000
PORTC= %00001100
PAUSE 500
IF PORTA.4=0 THEN ALG4
PORTA= %00000000
PORTB= %00000000
PORTC= %00110000
PAUSE 500
IF PORTA.4=0 THEN ALG4
PORTA= %00000000
PORTB= %00000000
PORTC= %11000000
PAUSE 500
IF PORTA.4=0 THEN ALG4
PORTA= %00000000
PORTB= %00000000
PORTC= %00000000
PAUSE 500
GOTO ALG33

ALG4:
PORTA=0
PORTB=0
PORTC=0
PAUSE 500
IF PORTA.4=0 THEN ALG4
ALG44:
IF PORTA.4=0 THEN ALG1
PORTA= %00000000
PORTB= %00000000
PORTC= %00000000
PAUSE 500
IF PORTA.4=0 THEN ALG1
PORTA= %00001111
PORTB= %11111111
PORTC= %11111111
PAUSE 500
GOTO ALG44

END

ete

Kullandığın 16F876A işlmecinin PortA pinlerine bakarsan AN0-AN1 gibi ifadeler göreceksin. Bunlar işlemcinin aynı zamanda Analog to Digital çevirme özelliğinin bulunduğunu gösteriyor. Üstelik bu özellik sen aksine birkomut ile iptal etmez isen açılışta önseçimli (default) olarak geliyor. Halbuki sen o pinleri birer digital giriş çıkış pini olarak kullanıyorsun. O halde ne yapmak gerekir bu pinlerde önseçimli gelen ADC özelliğini iptal edip pinleri digital giriş çıkış pini olarak ayarlamak gerekir. Bu işi yapan Register ise ADCON1 registeridir. Bu işlemcinin data sheetinde ADC kısmına bakmış olsa idin orada hangi değerin ADC yi iptal ettiğini görmüş olacaktın. 7 rakamı bu işi görür ve pinleri digital yapar.

Aynı şekilde bu işlemcide birde comparatör özelliği bulunmaktadır. Bu özellikte önseçimli olarak gelir ve pinleri digital kullanmak için bu özelliğinde iptal edilmesi gerekir. Bunu da CMCON (comparatör) registerine 7 yazmak sureti ile yapıyoruz.

Daima işlemcilerin data sheetlerine bakmayı adet haline getiriniz. İşlemcilerin özelliklerini bilmeden iyi programlama yapamazsınız.

Gelelim programa, ard arda dizilimiş işlem yapan satırların bazılarını birer döngü içine yerleştirerek programı kısaltmak mümkün dür. Bunu yaparak programı biraz olsun kıslattım ve istediğin komutlarıda programa ilave ettim. Bak bakalım çalışacakmı?.

Ete

Define OSC	4
@ DEVICE pic16F876A
@ DEVICE pic16F876A, WDT_on
@ DEVICE pic16F876A, PWRT_ON
@ DEVICE pic16F876A, Bod_off
@ DEVICE pic16F876A, PWRT_off
@ DEVICE pic16F876A, PROTECT_ON
@ DEVICE pic16F876A, XT_OSC

ADCON1=7
CMCON=7
TRISA= %11110000
TRISB=0
TRISC=0
PORTA=0
PORTB=0
PORTC=0

POZ var byte
A VAR BYTE
B VAR BYTE
C VAR BYTE
I var byte

Pause 200
read 0,poz
IF POZ=255 then Poz=0


branchl poz,[basla,yer1,yer2,yer3,yer4,yer5,yer6,yer7,yer8,yer9,yer10,yer11,yer12,yer13,yer14,yer15,yer16,yer17]

BASLA:
PAUSE 1000

ALG1:
      poz=0:gosub yaz
      IF PORTA.4=0 THEN ALG2
      FOR I=0 TO 3
        PORTA= DCD I
        PORTB= %00000000
        PORTC= %00000000
        PAUSE 500
        IF PORTA.4=0 THEN ALG2
      NEXT

      POZ=1:GOSUB YAZ
YER1:
      FOR I=0 TO 7
        PORTA= 0
        PORTB= dcd I
        PORTC= %00000000
        PAUSE 500
        IF PORTA.4=0 THEN ALG2
      NEXT

      POZ=2:GOSUB YAZ
YER2:
      FOR I=0 TO 7
        PORTA= 0
        PORTB= 0
        PORTC= dcd I
        PAUSE 500
        IF PORTA.4=0 THEN ALG2
      NEXT

      POZ=3:GOSUB YAZ
YER3:
     PORTA= %00001111
     PORTB= %11111111
     PORTC= %11111111
     PAUSE 500
     IF PORTA.4=0 THEN ALG2

     POZ=4:GOSUB YAZ
YER4:
     PORTA= %00000000
     PORTB= %00000000
     PORTC= %00000000
     PAUSE 500
     GOTO ALG1

ALG2:
     POZ=5:GOSUB YAZ
YER5:
     PORTA=0
     PORTB=0
     PORTC=0
     PAUSE 500
     IF PORTA.4=0 THEN ALG2

ALG22:
      IF PORTA.4=0 THEN ALG3
      POZ=6:GOSUB YAZ
YER6:
     A=1
     FOR I=0 TO 3
     PORTA= A
     PORTB= %00000000
     PORTC= %00000000
     PAUSE 500
     IF PORTA.4=0 THEN ALG3
     A=A*2+1
     NEXT

     POZ=7:GOSUB YAZ
YER7:
     B=1:A=15
     FOR I=0 TO 7
       PORTA= a
       PORTB= B
       PORTC= %00000000
       PAUSE 500
       IF PORTA.4=0 THEN ALG3
       B=B*2+1
     NEXT
       
      POZ=8:GOSUB YAZ
YER8:
     A=15:B=255:C=1 
     FOR I= 0 TO 7
       PORTA= A
       PORTB= B
       PORTC= C
       PAUSE 500
       IF PORTA.4=0 THEN ALG3
       C=C*2+1
     NEXT
       
     POZ=9:GOSUB YAZ
YER9:
     PORTA= %00000000
     PORTB= %00000000
     PORTC= %00000000
     PAUSE 500
     GOTO ALG22

     POZ=10:GOSUB YAZ
YER10:     
ALG3:
      PORTA=0
      PORTB=0
      PORTC=0
      PAUSE 500
      IF PORTA.4=0 THEN ALG3
     
     POZ=11:GOSUB YAZ
YER11:      
ALG33:
      IF PORTA.4=0 THEN ALG4
      PORTA= %00000011
      PORTB= %00000000
      PORTC= %00000000
      PAUSE 500
      IF PORTA.4=0 THEN ALG4
     
     POZ=12:GOSUB YAZ
YER12:
      PORTA= %00001100
      PORTB= %00000000
      PORTC= %00000000
      PAUSE 500
      IF PORTA.4=0 THEN ALG4

     POZ=13:GOSUB YAZ
YER13:
      B=3
      FOR I=0 TO 3
        PORTA= %00000000
        PORTB= b
        PORTC= %00000000
        PAUSE 500
        IF PORTA.4=0 THEN ALG4
        B=B*4
      NEXT
     POZ=14:GOSUB YAZ
YER14:
      C=3
      FOR I=0 TO 3
        PORTA= %00000000
        PORTB= %00000000
        PORTC= %00000011
        PAUSE 500
        IF PORTA.4=0 THEN ALG4
        C=C*4
      NEXT  
      POZ=15:GOSUB YAZ
YER15:
      PORTA= %00000000
      PORTB= %00000000
      PORTC= %00000000
      PAUSE 500
      GOTO ALG33
     
      POZ=16:GOSUB YAZ
YER16:
      ALG4:
      PORTA=0
      PORTB=0
      PORTC=0
      PAUSE 500
      IF PORTA.4=0 THEN ALG4
      ALG44:
      IF PORTA.4=0 THEN ALG1
      PORTA= %00000000
      PORTB= %00000000
      PORTC= %00000000
      PAUSE 500
      IF PORTA.4=0 THEN ALG1

     POZ=17:GOSUB YAZ
YER17:
      PORTA= %00001111
      PORTB= %11111111
      PORTC= %11111111
      PAUSE 500
      GOTO ALG44

YAZ:
     WRITE 0,POZ:PAUSE 10
     RETURN
END
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

aqustic

Sayın Ete hocam;
Ben bu devreyi aşagıdaki adresten indirdim.Ama az önce şunu farkettim.Adreste isis,bas ve hex dosyası var.Hex dosyasını isiste picin içine attıgımda proteusta devre güzel  çalışıyor.Fakat bas dosyasını  açıp  bas dosyasının içerigini   hiç ellemeden compile edip hex'e çevirmek istedigimde hata veriyor  ve orjinal hex dosyasıda  siliniyor.Burdan anladıgım kadarıyla linke başka bi bas dosyası konulmuş olabilir.
Dolaysıyla aşagıdaki hatayı veriyor.Bas dosyasının tamamını silip senın üstteki mesajda yazdıgın kodları içine ekleyip compile etmek istedigimde hata sayısı artıyor ve compile edilmiyor.
http://www.mediafire.com/download.php?iimjoe2mdnj


ete

Anladığım kadarı ile MCS de derlemeden önce yanlış pic seçili durumda. Üst ekranda kutucuk içinde Pic16F876A yer alması gerekir. Bunun için kutucuğun yanındaki ok işaretine tıkla ve açılan pic listesinden 16F876A yı bul ve seç sonra derle hata vermeyecektir.

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

aqustic

Ete hocam valla harikasın ya.
Dediginiz gibi datasheetlere artık hep bakcam.
Derlerken 16f876ı seçtim dedigin gibi hata düzeldi.Ayrıca proteusta elektrigi kesip tekrar verdigimde kaldıgı yerden devam ediyor.Bunu da hallettik.
Ama benım asıl istedigim şu.
Şimdi bu devrede 4 tane animasyonumuz var.Örnegin animasyonlardan birinde ledler eklenerek yürüyor.Atıyorum butonla o eklenerek ilerleyen  animasyonu seçtik ve ledler yürümeye başladı.Ortadaki lede kadar  yürüyerek geldi diyelim.O sırada elektrik kesilip tekrar verildiginde o kaldıgı ortadaki ledden yürüyerek başlamasını değilde en baştaki ledden yürüyerek başlamasını istiyorum.Yani o an hangı anımasyondaysa elektrik kesildiginde seçili olan  o animasyonun baştan başlamasını istiyorum.Sizden bunu istiyorum demeyim de rica etsem bi de bu şekılde kodları koyabilirmisiniz.

ete

Aslında benim yazdığım kod öyle çalışıyor.

İyice denedinmi?

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

stlg

Bence her seferinde eeproma kayıt yapılması mantıklı değil, donanımsal olarak elektrigin kesildigini anlamak ve bu işlemi bir sefer yapmak daha mantıklı ,dıs kesme kullanılarak en son effekt hafızaya aldırılabilir, bunun icin 7805 den once trafo uclarından basit bir diyot ve kucuk bir kapasiteyle dıs kesme olusturulabilir, tabi bu ucta 5v gibi bir zener kullanılması gerekir, elektrik kesilince kesme olusur ,7805 den sonraki buyuk kapasite bosalmadan eeprom hafızaya en son effekt bilgisi kaydedilir
ALLAHA EMANET OLUNUZ Hoştur bana senden gelen,  Ya gonca gül yahut diken,  Ya kaftandır yahut kefen,  Kereminde hoş lütfunda hoş.

aqustic

Ete hocam.
Proteusta elektrik kesilip tekrar verildiginde animasyon tam nerde kaldıysa ordan başlıyor.Dolaysıyla o an hangi animasyonda kaldıysa o animasyonun başından başlamıyor.Ama board üzerinde denemedim daha.Deneyince sonucu bildiririm.