12f675

Başlatan dagadamı, 21 Eylül 2023, 15:42:07

dagadamı

#15
ete hocam  TRISIO =%00011110 bu şekilde ayarlı bu şekilde çalışıyor
          WPU =%00110010
          ANSEL =%01001000
          ADCON0=%10001100
bu şekilde ayarlı bu şekilde çalışıyor
          OPTION_REG = %01010101 bundan emin değilim...

propblem şu similasyonda çalısırken  ilk açtığımda pot hangi degerdeyse çıkış veriyor ama ayar yapmıyor
similasyonu kapatıp pot değerini başka konuma getiriyorum tekrar silasyonu çalıştırdığımda ayarlanan degerde
çıkış veriyor... main etiketi altına  bir döngü komutu gerekiyor herhalde



Pepe

#16
.

dagadamı

#17
Pepe Ağam bizimle eğlenimisin  :o
bas dosyasıyla hex dosyasının alakası yok...bas dosyasını adnı değitrip derlermisin gönderirken karışıklık oluyor herhalde...
gönderdiğin dosyayı kendinde denersen anlarsın...

Pepe

#18
.

dagadamı

#19
Pepe

Pepe

Espero que con tu sabiduría puedas solucionarlo y sin estornudar

ete

Bahsi geçen sorun tamamen Proton derleyicisinin sorunu. Yada sizin o derleyiciye uygun formatı kullanmamış olmanız diye düşünüyorum.
Programda ufaka tefek lüzumsuz kusurlar olsa da mantığında hata görmüyorum.
Öneri olarak;
Programda yer alan register ayarlarını aşağıdaki şekilde yapmayı deneyebilirsin.

	    TRISIO =%00011110
	    WPU   =%00000010 
	    ANSEL =%00001000 
	    ADCON0=%10001100 

Bunun haricinde bildiğim kadarı ile Proton da Kesme alt programı programın başında yer alması gerekir.
Ana (Main) bölümü daha sonra yer almalıdır.
Bu değişikliği ben yapıp aşağıda veriyorum. Bu şekilde deneyin.
Programın başında ADC ölçümü için FRC CLK kaynağı olarak seçiliyor ama alt kısımlardaki komutlarla bu bozuluyor. Kafa karışıklığı yaratan bu durumu yukarıda verdiğim register ayarları ile düzeltmeye çalıştım. Ayrıca hiç kullanılmayan pinleri giriş olarak ayarlamış gözüküyorsun. Bunlarıda kaldırdım.
Diğer bir konu da POT dan okunacak değer aralığının tespiti.
Sıfır geçiş yakalandıktan sonra 10ms (10.000 us) lik bir süreniz var bu süre içinde triac'ı kesimde tutup son konumlarda ateşlerseniz çıkışı dimlemiş olursunuz. Komut gecikmeleri nedeni ile 10.000 us lik süre yaklaşık 9800us olarak kullanılır. Bu süreden birde Triac ateşleme süresin, çıkartmak gerekir. Zira sıfır geçişinde gecikmeyş uygulamaya başladınız. Gecikme süresi bitince Triacı ateşlediniz 100us beklediniz ve kesmeden çıkmadan önce çıkış komutlarınıda verecek bir kaç us lik süreniz olması gerekir. Bu komut gecikmeleri içinde bir 100us harcanacağını varsayarsak gecikme aralığınız 9800-100-100=9600 us olacaktır. O halde timer0 sayacı size 9600 ile 200 us aralığında bir süre ayarlamalıdır. 1/64 bölme oranı ile bunu sağlayacak TMR0 değerleri ise ,pot en düşük konumda iken 200 verecek ve en yüksek konumda ise 9600 verecek şekilde 106 olmalı. Anlayacağınız pot 0-106 arasında bir değer üretmeliki buna karşılık gelen zaman gecikmesi 0-9600 us arasında olsun.
106 rakamını nasıl hesapladığımıda anlatayım.
9600 us lik gecikme yaratılacak (max. değer) bölme oranı 64 olduğundan 9600/64=150 . Bu değer timer0 sayacının sayacağı adım sayısıdır. O halde sayacı 256-150=106 dan başlatmak lazım ki 150 adım sayabilsin. Böylece 150*64=9600us lik gecikme yaratılmış olacaktır.
Şimdi die pot un max konumda 106 vermesi için formülümüzü hesaplayalım.
(106/1023)*256=26,5259 Bu sayıyı 2653 olarak kullanıp hesap sonucu çıkan sayıyı 100 e bölmeliyiz.
Böylece formül LOad_Value=(Ham*/2653)/100+150 şeklinde olabilir.Olayı görsel açıklamak gerekir ise;
A----------------B-----C--D
A noktasında sıfır geçiş başladı 9600us gecikme uyguladık ve B noktasına geldik. Bu noktada triacı ateşledik ve 100us bekleme yaptık. C noktasına geldik. Bu noktada kesmeden çıkış komutları yani bayrakları sıfırladık ve D noktasında kesmeden çıktık.
Bu sistemin düzgün çalışacağını umuyorum. Sadece 100us lik komut gecikmesi fazla gelebilir bunuda sonucu gördükten sonra anlayabiliriz. Şayet çıkış tam sıfırlanmıyor ise süre fazla gelmiş olacaktır. Zira triacı ateşledikten sonra Triac=0 verseniz de o sıfır noktasında kesime gidecektir. Aradaki -(C-D)noktaları aralığında aktif kalacaktır. Buda tam kısılmayı engelleyebilir.
Sonucu duymak isterim.
Ete
 

	[code]Device = 12F675
	Xtal = 4
	 
	Declare Create_Coff On
	 
	Declare Adin_Res 10
	Declare Adin_Tad frc
	Declare Adin_Stime 50
	 
	Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BODEN_ON, CP_OFF, MCLRE_OFF
	 
	;I/O symbols
	Symbol Triac_out = GPIO.0 ;triac pin
	Symbol Test = GPIO.1 ; No hay entrada de red
	Symbol Zero_cross = GPIO.2 ; zero-cross pin sensor
	Symbol Low_limit = 101
	;interrupt symbols
	Symbol GIE = INTCON.7 ; Global Interrupt Enable 1 = enable, 0 = disable
	Symbol T0IE = INTCON.5 ;TMR0 Overflow Interrupt Enable bit
	Symbol INTE = INTCON.4 ;GP2/INT External Interrupt Enable 1 = enable, 0 = disable
	Symbol T0IF = INTCON.2 ;TMR0 Overflow Interrupt Flag bit
	Symbol INTF = INTCON.1 ;External Interrupt Flage 1 =
	  ;external interrupt occurred (must be cleared in software)
	 
	'variables
	Dim Load_Value As Byte
	Dim Ham As Word 
	'***********************************************************************************	  
	  CMCON=7    'comparatörler iptal
	  OPTION_REG = %01010101 ;presc 1:64 ,External Interrupt Edge to rising edge
	  'OPTION_REG=%00000011 '(000=1/2, 001=1/4 , 010=1/8  011=1/16
      TRISIO =%00011110
      WPU   =%00000010 
      ANSEL =%00001000 
      ADCON0=%10001100                      	  
	  ;interLrupt definitions
	  T0IF = 0 ;TMR0 overflow flag
	  INTF = 0 ;External Interrupt flag
	  
	  Load_Value = Low_limit
	  DelayMS 500	 
  	  On_Hardware_Interrupt GoTo Interrupt_Detect
        	 
	  INTE = 1 ' Enable External Interrupt
	  GIE = 1 ' Enable global interrupts
	  goto MAIN
	  
Interrupt_Detect:
	Context Save
	If INTF = 1 Then
	  TMR0 = Load_Value
	  T0IE = 1 ' Enable TMR0 overflow interrupt
	  INTF = 0 ' Clear INT Flag (be ready for the next)  
	EndIf
	 
	If T0IF = 1 Then
	  High GPIO.0 
	  DelayUS  100 'disparador triac 100 uS
	  Low GPIO.0
	  T0IF = 0
	EndIf
	Context Restore	  
	  
	 
MAIN:
	   If Test=0 Then
	       INTE=0:T0IE=0
	       DelayMS 100
	       While Test=0:Wend
	       INTE=1:T0IE=1
	       Clear
	       @ clrf PCLATH
	       @ GoTo 0
	   EndIf
	   
	  GoSub ADC_BAK
	 
	GoTo MAIN
	 
	'********************************************************************
	' Subroutines
	'********************************************************************
	 
ADC_BAK:
	  ADCIN 3, Ham 
	  Load_Value = (Ham */3609)/100  + 100 ' Adjust scaling if needed
	  Return
	 
	 end

dagadamı

#22
ete hocam program aslında çalışıyor pot ayar yapmıyor similosyanda açtığında potun o anki konumunu okuyup çıkış değeri veriyor pot ayar yapmıyor  similosyonu kapatıp pot konumunu değiştidiğinde
bulunduğu konumun çıkışını veriyor...poteğerini bir kere okuyor öyle çıkış veriyor
main etiketi altına bir döngü yazılmazı grikiyormu bilmiyorum?

ete

Tüm dosyaları buraya koy bir de ben bakayım ne oluyor.

Ete

dagadamı

#24
Ete Hocam Dosyayı ekliyorum
olazsa Microcode studio ile derliyelim

ete

Olmadı çünki Proton derleyicisi ile yapabileceğim bir şey yok kullanmıyorum.
Programı PBP ye çevirdim. Sİmulasyonda denedim çalışıyor.
İlişiktedir.

Ete

dagadamı

#26
ETE Hocam emeğinize teşekkürler   çalışıyor ama stabil değil salınım var....

Hayırlı akşamlar...

dagadamı

Pepe Gracias por tu ayuda y esfuerzo.

dagadamı

konu çözüldü  problem proton kaynaklı
emeğeği geçenlere teşekkür ederim..

onurinci

@dagadamı PEPE Proton forumlarında önemli bir yere sahip .bir çok soruna mantıklı çözüm bulmuştur.

tek sorunu asla yazılım vermez ,sadece HEX dosyasını çekinmeden verir, fakat hatanın nerede olduğunu bilemezsek o hatayı hep tekrarlarız....

Powered by EzPortal