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