ADC Potu ile zaman ayarı....

Başlatan onurinci, 03 Ocak 2024, 22:26:24

onurinci

hocam selam..
bir mutfak aletim var. 12F675 Pic ile yapmışlar. Kahveyi koyuyorum kendi potu ile ayar yapıyorum.1,5 dakika ila 5 dakikaya yakın bir ayar yapılabiliyor..fakat eşim üst seviyesi 5 dakika gibi ,ama alt seviyesi 25 saniye gibi olsun diyor..Forumdan araştırma yaparken.tamda benim istediğim gibi bir kod parçacığı buldum,bir kaç deneme yaptım. alt süreyi bozduğum için üst sınır doğru takip etmiyor, yardımınızı talep ediyorum..

DEFINE OSC 4
DEFINE OSCCAL_1K 1
#CONFIG
#LIST_12F675
 __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BODEN_OFF
#ENDCONFIG

TRISIO= %00000101 : GPIO= 0 : CMCON= 7 : VRCON.7= 0 : ANSEL= %00110011 : ADCON0= %10000011 
OPTION_REG.7= 0 : WPU= %00000100 

    

DEFINE ADC_BITS 10	    ' A/D  çevirim sonucu 10 bit olarak ayarlandı
DEFINE ADC_CLOCK 3	    ' Clock  kaynağı (3=rc)  ( 10 )
DEFINE ADC_SAMPLEUS 50 	' Örnekleme zamanı mikro saniye cinsinden. 
 
RAW   VAR WORD
SURE  VAR WORD
ZAMAN VAR WORD
DAK   VAR WORD
X     VAR BYTE
SN    VAR BYTE

symbol TUS= GPIO.2
SYMBOL LED= GPIO.1
SYMBOL ROLE= GPIO.5 : ROLE= 0
      PAUSE 300

Start:     
      ADCIN 0,RAW
SURE =((RAW+1)*/60)+60

 IF TUS= 0 THEN
      TOGGLE ROLE
      pause 100       
 IF ROLE= 1 THEN 
LED= 1
      GOTO SAYDIR
 ELSE
ROLE= 0
LED= 0  
 ENDIF   
 ENDIF

      GOTO Start
           
SAYDIR:
  WHILE TUS= 0
  WEND
ZAMAN= SURE
DAK =  999

SAYBIR:       
     FOR SN= 1 TO  117       'MS SÜRESİ  TOPLAMDA 1 ms SAYAR  117
     NEXT SN
     IF TUS= 0 THEN
    ROLE= 0
    LED= 0
      WHILE TUS= 0
      WEND
    pause 100
          GOTO Start
     ENDIF            
    DAK= DAK-1
     IF DAK > 0 THEN SAYBIR   'BURASI 1000 MS YANİ 1 SN SAYDIRIR.
    DAK= 999
    ZAMAN= ZAMAN - 1           'BUNUN HER 60 TANESİ 1 DAK SAYDIRIR.
     IF ZAMAN > 0 THEN SAYBIR    
    ROLE= 0
    LED= 0
 GOTO Start

ete

Anladığım kadarı ile devredeki pot ile  5 dak(300sn) ile 25 sn aralığında ayar yapmak istiyorsun.
Bu durumda POT maksimumda iken zaman ayarın 5dak(300sn) olacak ama pot min da iken süre=25 sn olacak.
Tespitim doğru ise hesabı şu şekilde yapılmalı;
Bütün birimleri saniye cinsinden ayarlamak gerekecek. 5dak=300 sn idi. min süre ise 25 sn olacağından dolayı ;
- AsılSüre=300-25=275 sn olacaktır.
- Formül=(275/1023)*256= 0,2688172043*256=68,817 bulunur ve bunu 10 ile çarparak 688,17 bulunur. Hala virgülden sonra küsürat olduğu için son haneyi bir artırıp kullanacağız yani sabit çarpanımız 689 olacaktır. Sonucu ise tekrar 10'a bölmemiz gerekecek.
- Formülümüz=(HAM*/689)/10+25 şeklini alacaktır.
Formüldeki +25 in önündeki işlem bize 0-275 arası bir değer verecektir. Buna min saniye değerini ekleyince toplam süre potun maksimum değerinde 300 olarak hesaplanacaktır.
((1023 * 689)/256)/10=275 değerini verir.

Buraya kadar işlem tamam ancak programa bakmak lazım ve baktığımız zaman programın dakika bazında çalıştığını görüyoruz. Aslında kullanılan zaman saydırma tekniğide çok hassas değil bana kalırsa. Bu nedenle hem Timer-1 kullanarak daha hassas zaman saydırma yapıp hemde saydırmayı saniye bazına çevirmek için kodu değiştirdim.
Aşağıdaki kodu bir dene istersen.
DEFINE OSC 4
DEFINE OSCCAL_1K 1
#CONFIG
#LIST_12F675
 __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BODEN_OFF
#ENDCONFIG

TRISIO= %00000101 : GPIO= 0 : CMCON= 7 : VRCON.7= 0 : ANSEL= %00110011 : ADCON0= %10000011 
OPTION_REG.7= 0 : WPU= %00000100     

DEFINE ADC_BITS 10	    ' A/D  çevirim sonucu 10 bit olarak ayarlandı
DEFINE ADC_CLOCK 3	    ' Clock  kaynağı (3=rc)  ( 10 )
DEFINE ADC_SAMPLEUS 50 	' Örnekleme zamanı mikro saniye cinsinden. 
 
RAW   VAR WORD
SURE  VAR WORD
ZAMAN VAR WORD 70
DAK   VAR WORD
X     VAR BYTE
SN    VAR BYTE

symbol TUS= GPIO.2
SYMBOL LED= GPIO.1
SYMBOL ROLE= GPIO.5 : ROLE= 0
      PAUSE 300

Start:     
      ADCIN 0,RAW
      SURE =((RAW)*/689)/10+25

      IF TUS= 0 THEN SAYDIR
 
      GOTO Start
           
SAYDIR:
       WHILE TUS= 0:WEND
       pause 100
       ZAMAN= SURE
       T1CON=%00110001      'bölme oranı 1/8 ve timer1 aktif edildi
       SN=0
       ROLE=1
       LED= 1
SAY_BIR:        
        TMR1H=$0B:TMR1L=$DC  'timer'a ön yükleme değeri verdik  'her kesme 500ms süre alıyor.        
        PIR1.0=0             'Kesme bayrağı sıfırlandı
        WHILE PIR1.0=0
           IF TUS=0 THEN
             ROLE=0:LED=0:T1CON=0
             WHILE TUS=0:WEND             
             PAUSE 100
             GOTO START
           ENDIF
        WEND
        SN=1-SN:IF SN=1 THEN SAY_BIR    
        ZAMAN=ZAMAN-1
        IF ZAMAN>0 THEN SAY_BIR
        ROLE=0:LED=0    
        GOTO START
 

ete

 

onurinci

hocam , hem eşim hemde ben teşekkür ediyoruz , ilk kahvemizi içtik bile......

ete

Afiyet olsun ne mutlu bana.

Ete

Powered by EzPortal