877 hafızaya yazma

Başlatan ufuk0106, 07 Mayıs 2015, 13:44:26

ufuk0106

pic16f877 ile 23 kanal karaşimşek yaptım. hız ayarını buton ile arttırıp azaltacak şekilde. elektrik kesildiğinde hafızasındaki hız ayarını korumasını istiyorum. yazdım ama dengesiz çalışıyor. programda hata nerededir acaba?

TRISA = 1 'A portu giriş olarak ayarlandı
TRISB = 0   ' B PORTLAR ÇIKIŞ
TRISC = 0
TRISD = 0
ADCON1=7


p var word
P=50

READ 0,P.LOWBYTE
READ 1,P.HIGHBYTE
 

BASLA:
if PORTA.1=0 THEN
P=P+100
WRITE 0,P.LOWBYTE
WRITE 1,P.HIGHBYTE
PAUSE 50
ENDIF 

gosub yak

GOTO BASLA


yak:         
PORTB=%00000000
PORTC=%00000000
PORTD=%00000000
PAUSE 50
PORTB=%01000000   
PAUSE p
PORTB=%11000000   
PAUSE p
PORTB=%11100000   
PAUSE P
PORTB=%11110000     
PAUSE P         
PORTB=%11111000     
PAUSE P     
PORTB=%11111100   
PAUSE P
PORTB=%11111110       
PAUSE P
PORTB=%11111111         
PAUSE P
                 
    PORTD=%00100000 
    PAUSE P
    PORTD=%00110000 
    PAUSE P
    PORTC=%10000000 
    PAUSE P
    PORTC=%11000000 
    PAUSE P
    PORTC=%11100000 
    PAUSE P
    PORTC=%11110000 
    PAUSE P
    PORTD=%00111000 
    PAUSE P
    PORTD=%00111100 
    PAUSE P
   
       
    PORTD=%01111100 
    PAUSE P
    PORTD=%11111100 
    PAUSE P
     
   

    PORTC=%11111000 
    PAUSE P
       
    PORTD=%11111101 
    PAUSE P
    PORTD=%11111111
    PAUSE P
       
   
    PORTC=%11111100 
    PAUSE P
    PORTC=%11111110 
    PAUSE P
return

END
BİR AĞAÇ GİBİ TEK VE HÜR VE BİR ORMAN GİBİ KARDEŞÇESİNE.

rodyum

Animasyonları alt alta yazmak sağlıklı değildir. butona bastığın anda hepsinin tamamlanmasını beklemek zorunda kalırsın.
Programı döngü yaparak yazarsan daha iyi olur.
şu örneği incele:
DEFINE OSC 4
ANMS VAR BYTE
SAYI VAR BYTE
SAY VAR WORD
ZAMAN VAR WORD
           

TRISA=%11111111
TRISB=0                 
PORTA=0
PORTB=0
CMCON=7 '16F877A İÇİN
ADCON1=6
ANMS=0
SAY=0
SAYI=0
READ 0,ZAMAN.LOWBYTE
READ 1,ZAMAN.HIGHBYTE
    IF ZAMAN<100 THEN
        ZAMAN=100
        WRITE 0,ZAMAN.LOWBYTE
        PAUSE 10
        WRITE 1,ZAMAN.HIGHBYTE
    ENDIF
PAUSE 250

BASLA:
FOR SAYI=0 TO 7
    SELECT CASE ANMS
     CASE 0
     LOOKUP SAYI,[1,2,4,8,16,32,64,128],PORTB
     CASE 1
     LOOKUP SAYI,[128,64,32,16,8,4,2,1],PORTB
     CASE 2
     LOOKUP SAYI,[255,127,63,31,15,7,3,1],PORTB
     CASE 3
     LOOKUP SAYI,[1,3,7,15,31,63,127,255],PORTB
    END SELECT 
       FOR SAY=1 TO ZAMAN
        PAUSE 1
        IF PORTA.0=0 THEN
         ANMS=ANMS+1
         IF ANMS=4 THEN ANMS=0
        ENDIF
        WHILE PORTA.0=0
           PORTB=0
           SAYI=255
           PAUSE 100
          WEND
        IF PORTA.1=0 THEN
            ZAMAN=ZAMAN+100
            IF ZAMAN<100 THEN ZAMAN=100
            WRITE 0,ZAMAN.LOWBYTE
            PAUSE 10
            WRITE 1,ZAMAN.HIGHBYTE
            WHILE PORTA.1=0
            PAUSE 100
            WEND
        ENDIF
       NEXT SAY
NEXT SAYI
GOTO BASLA

END

Burada animasyonları ve sayısını isteğine göre değiştirebilirsin. RA0'a bağlı buton animasyonu türünü değiştirir. RA1 butonu ise animasyon hızını ayarlar.
"FOR SAYI=0 TO 7" ise tablolardaki animasayon sayısı kadar ekleme yapabilirsin. bu örnekte 7 adet animasyon döngüsü var.
"IF ANMS=4 THEN ANMS=0" ise farklı animasyon adetini belirler. örnekte 4 farklı animasyon türü bulunuyor.

ufuk0106

#2
Öncelikle programlama açısından benim için güzel bir örnek oldu Teşekkürler. Dediğin gibi butonun işlem yapması için animasyonun Bittiği an Olmalı Haklısın biraz kolaya kaçtım. Kesme kullanmalıydım veya senin yolunu dememeliydim galiba;) portlarda sıralı dizilmediğinde uzun - tek tek yazdım:( Fakat sorunum sadece hızını arttırıp, azaltıp Hafıza kaydetmek. Sende hepsi var.
   Programımda hafızaya hiç kaydetmiyor. Hatam adcon ayarlamalarından mıdır?
Teşekkürler
BİR AĞAÇ GİBİ TEK VE HÜR VE BİR ORMAN GİBİ KARDEŞÇESİNE.

Powered by EzPortal