avatar_elektro77

Süresi değiştirilebilir TMR0 kesmesi

Başlatan elektro77, 05 Ekim 2023, 09:44:00

elektro77

#15
Şimdi farkettim ben buraya dosyanın çok yanlışı olan ilk halini iliştirmişim.
Siz yine de çözmüşsünüz. Bravo Hocam.
Eksik olan sadece TMR0 kesmesi içindeki US değerini ayarlayan us_artır ve us_azalt kodları olmuş. O da benim yanlış dosyayı koymamdan olmuş zaten.
Kodları akşam deneyeceğim.
Duty değerinin default değerini en fazla 1 veya 2 yapabilirim. Çünkü 5-6 lara doğru çarpma etkisi inanılmaz çoğalıyor.
Ya da T2CON bölme oranını, pwm frekansını ve çözünürlüğü yüksek bir değere çekmem gerekiyor.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

#16
Hocam aşağıdaki kodlarda, us değerine bağlı olarak, PCA_ENB her 0 olduğunda ve 0 olduğu süre boyunca geçen zamanı "Total_tıme" adında bir değişkende, dakika veya saat birimi olarak tutmak ve eproma yazmak istiyorum.
Bunu nasıl bir mantıkla yapabilirim. Denedim ama olmadı...
BASLA:'*************************************************************************
IF VER=1 AND PCA_ENB=0 THEN  'TOTAL ŞOK SÜRESİNİ TUTMA KODLARI
T=T+1
IF T=12000 THEN    
T=0
TOTAL_TIME=TOTAL_TIME+1
      WRITE 0,TOTAL_TIME.BYTE1,TOTAL_TIME.BYTE0:PAUSE 100 
ENDIF
ENDIF
'-------------------------------------------------------------------------------------
IF START=1 THEN  ' BAŞLATMA
          VER=1:duty=0
          PCA_ENB=0:gosub softver
          WHILE START=1:WEND
        ENDIF
        
IF DUR=1 THEN  'PWM DURDURMA
          VER=0:PCA_ENB=1:IF PCA_ENB=1 THEN LED=0
          CCP1CON=0
          duty=0
          TUS_DUTY=1
        ENDIF

 IF US_UP=1 THEN '---UYGULAMA SÜRESİ ARTIR------PCA ENB NİN AKTİFLİK SÜRESİ
        US=US+10
        IF US=110 THEN US=100  
        while US_UP=1:wend
      ENDIF


IF US_DOWN=1 THEN '---UYGULAMA SÜRESİ AZALT------PCA ENB NİN AKTİFLİK SÜRESİ
      US=US-10
      IF US=0 THEN US=10    
          while US_DOWN=1:wend
          'gosub delay
    ENDIF

softver:
IF VER=1 THEN  'PWM BAŞLATMA
 SAY=SAY+1  
 IF SAY=US then
TOGGLE PCA_ENB
        IF PCA_ENB=1 THEN CCP1CON=0
        IF PCA_ENB=0 THEN DUTY=0:gosub soft_gec            
  ENDIF
ENDIF    
return 
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Orada iki farklı süre söz konusu hangisini kayıt edeceksin acaba?
Birincisi PCA_ENBL değerinin sıfır olup sonra 1 olması ve tekrar sıfır olmasına kadar geçen süremidir?
Yoksa PCA_ENBL değeri sıfırlandığı andan itibaren zaman tutup değerin değiştiği (1 olduğu) ana kadar olan süremidir?

Aslında bu kadar küçük program parçasından böyle bir şeyin kararınıda vermek zor programın bütününe bakmak gerekecek. Bu nedenle nasıl yapacağını ancak akıl olarak verebilirim.
Ortada ikinci bir zaman söz konusu olunca diğer sayaçlardan birini devreye almak gerekir mesela Timer-1 sayacı. Sayılacak zaman 65535 us lik dilim içinde oluyor ise bölme oranının 1/1 alırsın. Elinde 1/1, 1/2 1/4 ve 1/8 alternatifleri var başka da yok zaten. Zamanın büyüklüğüne bağlı olarak bölme oranını ayarla. T1CON üzerinden sayacı aktif et ve başlangıç değerlerini sıfırla (TMR1H ve TMR1L) sonra işin bittiğinde sayac değerlerin alıp kayıt edersin olur biter.
Unutma zaman aşımı olur ise PIR1.0 değeri 1 olur. Bu sayacın 65535 değerini aştığını yada kesme oluşturduğunu gösterir. Bu aşma olmasın diye zaten uygun bölme oranı alacaksın.
Ete

elektro77

Hocam beceremediğim tımer1 kodları ektedir.
US değişkenine bağlı olarak, P_ENB ın "0"  olduğu ve "1" oluncaya kadar geçen süreleri toplayıp eproma yazmak ve epromu okuduğumda ise dakika olarak görmek istiyorum.
Lütfen yardımcı olur musunuz?
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Kafandan geçen program mantığını anlamadım. Süreler diye çoğul kullanmışsın.
Burada 1 tane süre var. P_ENB değişkeni ilk defa 0 olunca Timer-1 aktif eedilecek ve yeniden 1 olduğunda ise aradan geçen süre TMR1H ve TMRL sayaclarından alınıp eproma yazılacak.
Bu benim bildiğim tek bir süredir. Neden toplama yapıyorsun onuda anlamadım.
Madem toplama yaptın ne zamandan hangi zamana kadar toplanacak bu süreler.
Benim açımdan anlamak zor. Söylüyorum ama anlamıyorsun. Programın tamamına hakim olmak lazım. Benim gözümle değil sein kafanla hakim olmak lazım.
Bu durumda pek bir şey yapabileceğimi sanmıyorum.

Ete

elektro77

Alıntı yapılan: ete - 25 Aralık 2023, 09:14:17Kafandan geçen program mantığını anlamadım. Süreler diye çoğul kullanmışsın.
Burada 1 tane süre var. P_ENB değişkeni ilk defa 0 olunca Timer-1 aktif eedilecek ve yeniden 1 olduğunda ise aradan geçen süre TMR1H ve TMRL sayaclarından alınıp eproma yazılacak.
Bu benim bildiğim tek bir süredir. Neden toplama yapıyorsun onuda anlamadım.
Madem toplama yaptın ne zamandan hangi zamana kadar toplanacak bu süreler.
Benim açımdan anlamak zor. Söylüyorum ama anlamıyorsun. Programın tamamına hakim olmak lazım. Benim gözümle değil sein kafanla hakim olmak lazım.
Bu durumda pek bir şey yapabileceğimi sanmıyorum.

Ete
Peki Hocam. Teşekkürler. Önemi yok. Çok lazım değil zaten. Beyin jimnastiği yapıyor ama takıldığım yerde soruyordum.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

Powered by EzPortal