Shiftout sayısı

Başlatan onurinci, 12 Eylül 2020, 00:49:37

onurinci

hocam selam bir PLL devrem var ,bir kere çalıştımı kusursuz devam ediyor, fakat akşam elektriği kestiğim zaman bazen çalışmıyori aç kapa anahtarınını üç kez kapatıp açarsam normale dönüyor,bir For Next döngüsü ile 3 kez ShiftOut yapıp dursun diye uğraştım,uzun süre ayrı kaldığım için aklımda bazı şeyler kopmuş,bir göz gezdirirseniz sevinirim.

bu hali ile PLL sıkıntısız çalışıyor kilitlenme falan yok. fakat peşpeşe gelen datalar seste tık,tık diye sorun çıkarıyor.

kısacası 3 kez tekrarlasın ve dursun istiyorum.

@ Device PIC12F675,WDT_OFF,PWRT_ON,PROTECT_OFF, CPD_OFF,MCLR_OFF,BOD_OFF,INTRC_OSC_NOCLKOUT
DEFINE OSC 4
DEFINE OSCCAL_1K 1

PAUSE 300           ' Discipline wait

TRISIO= %00000000 : GPIO= 0
CMCON= 7 : ANSEL= 0 : VRCON.7= 0

DEFINE SHIFT_PAUSEUS 10

DTT VAR GPIO.0   
CL  VAR GPIO.1   
LE  VAR GPIO.2     
X VAR BYTE
  
Send:


 
DTT= 0
CL= 0
LE= 0      			'Data,clock ve enable Pins Low Clear
                 
	SHIFTOUT DTT,CL,1,[0\1,512\13,1\1]  'Sending reference train   Decimal Value
	PULSOUT LE,10 
	PAUSE 50 
                     
	SHIFTOUT DTT,CL,1,[39\11,08\7,0\1] 'Sending second train   Decimal Value
	PULSOUT LE,10        			
	PAUSE 50
     

 
DTT= %0
CL= %0
LE= %0  			'Data,clock ve enable Pins Low Clear

 FOR X= 1 TO 3 ' yukarıdaki dizini 3 kez yolla ve dur 
      PAUSE 10                
      GOTO Send
     
       NEXT

	RETURN  'Stack Overflow 
                                     
END

ete

Kusurlar;
Açılış gecikmesini çok erken vermişsin. Bu gecikme değişken öncelikle işlemcinin kendi registerlerini setup (yerleştirmesi) etmesi için gereklidir. Ardından kendi değişkenlerinin pic data hafızasına yerleştirilmesi için ve ön değerlerinde yerli yerine koyulması için gerekiyor. Biliyorsun bu işlemlerin tamamı zaman alır ve gecikme koymaz isen pic bunların bir kısmını atlayabilir veya yarım bırakır. Böylece bazen rastgele açılış değerleri ile karşılaşırsın.
Genel anlamda açılış gecikmesi değişken tanımlamalarından hemen sonra verilmelidir. Tabiiki işlemcinin kendi registerleri (PORT atamaları, TRIS atamaları diğer özel atamalı registerler) değişkenlerden önce değer almalıdır.

For next döngüsü ise tamamen hatalı,
 FOR X= 1 TO 3 ' yukarıdaki dizini 3 kez yolla ve dur 
      PAUSE 10                
      GOTO Send
     
       NEXT
RETURN  'Stack Overflow 
birinci satırda 1 ile 3 arasında çalışacak bir X döngüsü kuruluyor.
İkinci satırda 10 ms gecikme veriliyor
Üçüncü satırda ise Goto Send komutu ile döngüden çıkılıp tekrar başa dönülüyor. Anlayacağın bu döngü hiç bir zaman 1 den 3 e kadar sayamıyor.
İstediğini yapmanın bir kaç yolu var. Birincisi
Send:  
    DTT= 0
    CL= 0
    LE= 0      
'Data,clock ve enable Pins Low Clear

 FOR X= 1 TO 3 ' yukarıdaki dizini 3 kez yolla ve dur 
SHIFTOUT DTT,CL,1,[0\1,512\13,1\1]  'Sending reference train   Decimal Value

PULSOUT LE,10 

PAUSE 50 

SHIFTOUT DTT,CL,1,[39\11,08\7,0\1] 'Sending second train   Decimal Value

PULSOUT LE,10        

PAUSE 50

DTT= %0
CL= %0
LE= %0  
next
WHILE 1:WEND
şeklinde döngüyü send etiketinden sonra kurar ve gönderme işlemini 3 kez yaptıktan sonra programı bloke ederiz. En altta yer alan while 1:wend satırı programın orada çakılı kalmasını sağlar. Böylece sistem 3 kez gönderme yaptıktan sonra beklemeye girer taaki elektirk kesilinceye kadar.

İkinci yöntem gönderme kısmını bir alt programa almaktır.
Send:  'Data,clock ve enable Pins Low Clear
     DTT= 0
     CL= 0
     LE= 0      

     FOR X= 1 TO 3 ' yukarıdaki dizini 3 kez yolla ve dur 
       GOSUB GONDER
     NEXT
     WHILE 1:WEND

GONDER:   
       SHIFTOUT DTT,CL,1,[0\1,512\13,1\1]  'Sending reference train   Decimal Value
       PULSOUT LE,10 
       PAUSE 50 

       SHIFTOUT DTT,CL,1,[39\11,08\7,0\1] 'Sending second train   Decimal Value

       PULSOUT LE,10        

       PAUSE 50

       RETURN

Unutma bir programda GOSUB var ise birde RETURN olmalıdır. GOSUB yok ise RETURN olmamalıdır. Senin programda bu mevcut.
Doğru kullanım şekli benim ikinci örnekte.
Ete


onurinci

hocam çok teşekkür ederim her iki yöntemde işe yaradı,

bütün katarlar yollanıldıktan sonra birde @ SLEEP koyabilip uyutabilseydim harika olurdu zira Pil ile çalıştırmak harika olurdu..o da başka bir sefere

ete

While 1:wend yerine
@ Sleep
yaz derle çalıştır. Bu satıra sıra geldiğinde otomatikman işlemci uyku moduna girecektir.
Ancak uyandırma gerekmiyor ise işe yarar. değilse uyandırmak için cihazı kapatıp yeniden açman gerekir.
Bu verdiğim komut ASM modundaki uyku komutudur. Uykudan ancak bir kesme oluşursa uyandırılabilir. Bunun için harici INT kesmesi, PORT değişiklik kesmesi gibi kesmelerden birisi kullanılabilir.

Ete

onurinci

hocam çok teşekkürler

ilginçtir bu önerdiğinizi denemiştim ve işe yaramamıştı, @Sleep bitişik yazmışım,hata ve uyarı vermedi fakat derlendi ,sizinde dediğiniz üzere düzelttim ve uyudu,tekrar teşekkürler hocam..

Powered by EzPortal