Elektrik kesintilerinden etkilenmemesi için hafızaya alma

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

ete

animasyon başı derken nereyi kast ediyorsun anlmadım herhalde. Örnekle tarif edermisin.

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

aqustic

Ete Hocam konu üzerinde ilgin için öncelikle çok teşekkür ederim.
Şöyle söyleyim:
Bu devrede pice 20tane led baglanmış.Eklenerek yürüyen led animasyonunu  seçtik diyelim:
Yani ilk baştaki led yancak ve yandıktan sonra yanık kalıp sırayla ondan sonrakiler  yanmaya başlıcak.İşleme başladık diyelim:
1.led+2.led....14.led e kadar geldik diyelim.Şu an ledlerin 14 tanesi yanık,6 tanesi sönük ve 15 .led yanmak üzereyken tam bu sırada elektrigi kapattık diyelim.Elektrigi geri açtıgımızda şöyle bişey oluyor:14 ledin hepsi aynı anda şak diye yanıp 15.led+16.led+17.led....20.ledler sırayla yanmaya başlıyor.
Yada sırayla yanan led efektini seçtik diyelim:
Önce 1 .led yancak sonra  1.led sönüp 2 .led yancak sonra 2.led sönüp 3.led yancak... bu şekilde animasyon  başladı diyelim.
Atıyorum 12.lede geldik.12.led yandı sonra söndü ve tam 13.led yancakken elektrik kesilip tekrar geri geldiginde bu animasyon 1.ledden başlaması gerekirken 13.ledden başlıyor.
Dolaysıyla sistem o an hangi animasyonda kaldıysa elektrik geri verildiginde o animasyonu buluyor fakat o animasyonun başından başlatmıyor.
Tabi proteusta böyle oluyor.Kesin sonucu görmek için boardda denicem.

ete

Bu dediğin proteusta da gerçektede aynı olur. Senin ne istediğini anlamak gerçekten zor.

Aşağıdakini son olarak veriyorum. Uymayan taraflarını sen düzeltirsin artık. Gerçi isteğine uygun gibi geliyor bana ya neyse.
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 58
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,[alg1,yer5,yer10,yer11,yer14,yer15,yer16,yer17]

BASLA:
PAUSE 1000
      poz=0:gosub yaz
ALG1:      
      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

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

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

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

YER4:
     PORTA= %00000000
     PORTB= %00000000
     PORTC= %00000000
     PAUSE 500
     GOTO ALG1

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

ALG22:
      IF PORTA.4=0 THEN ALG3

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

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

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

YER9:
     PORTA= %00000000
     PORTB= %00000000
     PORTC= %00000000
     PAUSE 500
     GOTO ALG22

     POZ=2:GOSUB YAZ
YER10:     
ALG3:
      PORTA=0
      PORTB=0
      PORTC=0
      PAUSE 500
      IF PORTA.4=0 THEN ALG3
     
     POZ=3:GOSUB YAZ
YER11:      
ALG33:
      IF PORTA.4=0 THEN ALG4
      PORTA= %00000011
      PORTB= %00000000
      PORTC= %00000000
      PAUSE 500
      IF PORTA.4=0 THEN ALG4

YER12:
      PORTA= %00001100
      PORTB= %00000000
      PORTC= %00000000
      PAUSE 500
      IF PORTA.4=0 THEN ALG4

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

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=4:GOSUB YAZ
YER15:
      PORTA= %00000000
      PORTB= %00000000
      PORTC= %00000000
      PAUSE 500
      GOTO ALG33
     
      POZ=5: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=6: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

Ete hocam çok teşekkür ediyorum çok sağol.Son verdigin kodlarla istedigim şey oldu.
Son bi soru daha sormak istiyorum.Kodların en başındaki "DEFINE OSC 4" komutu kristalin frekansını mı belirtiyor?Senın 4.derslerde program oluşturma genel kurallarında öyle bi komut görmedim de ondan soruyorum

ete

Evet kristal frekansını belirler ve program içinde pause veya pauseus gibi komutların kristal frekansına göre uygun zaman ölçülerinde çalışmasını sağlar.

Bu arada daha iyi bir animasyon programı görmek istersen aşağıdaki linkte yeni verdiğim programa bir bak.

https://www.picproje.org/main/modules.php?name=Forums&file=viewtopic&p=180299#180299

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

aqustic


aqustic

Bu arada bi soru daha sorcam.
Son yazdıgınız kodlarda
POZ var BYTE 58 yazıyor.Bi de burdaki 58 in anlamını neden 58 oldugunu söyleyebilirmisiniz

ete

Poz isismli değişkeni hafızada 58 nolu adrese yerleşmesini sağlar. Böylece isis de çalıştırırken o hafızayı takip ederek poz değişkeninin programın hangi kesimlerinde hangi değerleri aldığını izledim ve istediğini öyle yapabildim.

İsis de Debug menüsünde watch window diye bir seçenek vardır. Programı çalıştırınca görebilirsiniz. O nedenle pause tuşuna basıp debug menüsünden watch window u açın. Kursörü üzerine getirip sağ tıklarsanız bir başka pencere açılır ve oradan  Add Items by Address seçeneğini seçip Name kısmına değişken adı (Poz=) Address kısmınada 58 yazıp aşağıda yer alan seçeneklerden de değişken byte cinsinden ise byte, word cinsinden ise word seçip display format dan ise unsigned integer formatını seçerseniz değişkeni artık izleyebilirsiniz program çalışırken.
Bu işi yapabilmeniz için değişkenlerin pic hafızasında hangi adrese yerleştiğini bulmanız gerekir. Bunu ya benim gibi kendiniz belirlersiniz. Ben genelde 56 veya 58 ve üzerini kullanıyorum. Byte için tek adres word için çift adres kullanarak değerleri sıra ile veriyorum. Yada gerektiği kadar değişkene adres veriyorum.
Siz adres vermez iseniz aynı programı derleyin ve programın ASM uzantılısını açın. Orada değişkenlerin hangi adreslere yerleştiği yazılıdır.

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

aqustic

Ete hocam:
Güzel açıklamaların  için teşekkür ediyorum.
Ama ordaki 58'i kaldırdıgımızda proteusta devre yine gayet iyi çalışıyor.58 i sildim sonra yeniden derledim.Oluşan  Hex dosyasını isiste  pice attıgımıda devre yine çalıştı.Üstelik elektrigi kesince kaldıgı yerden yine devam edebiliyor.58 sayısıs yokken sizce board üzerinde sorun çıkarmadan çalışır mı?

ete

58 rakamının devrenin çalışması ile alakası yokki!!!!!.
O yalnızca senin belirlediğin bir adres. Sen onu oraya yazmaz isen derleyici kendisi rast gele bir hafızaya koyuyor. Hepsi bu.
Ben zaten 58 rakamına bağlı olarak çalışır yada çalışmaz dememiştim.
O rakamın orda olmasının tek sebebi benim o hafızayı isisde izleyebilmemdir.

Devren her halukarda çalışır merak etme. Pic in Besleme uçlarına 100nf kondansatör bağlamayı ihmal etme. Bir çok kişi güç kaynağında 100 nf var deyip bağlamıyor. Halbuki genel kural bu 100 nf kondansatörün picin besleme ayaklarına mümkün olan en yakın yere bağlanmasıdır. Mümkünse direk ayakların üzerine lehimlenmelidir.

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