ısı kontrol devresi menuden cıkış

Başlatan hkalaycioglu, 06 Nisan 2014, 11:57:54

hkalaycioglu


Elimdeki devreyi kuluçka makinası için kullanıyorum. Bu arada gayet güzel çalışıyor eksi sıcaklıklarda da set edebiliyorsunuz. Kuluçka makinasındanda  ilk yavrular çıktı. Kanatlı hayvan severler için tavsiye ederim. Fakat şöyle bir şey var menü tuşuna basılınca programdan biz çıkmadığımız sürece menüde bekliyor. Tabiki bu kuluçka makinası olduğu için yumurtalar dan artık ancak kızarmış piliç çıkıyor. Bu menüye nasıl bir sey yapılabilir ki belli bir süre sonra kendini otomatik program başlangıcına atsın. Ben işin içinden çıkamadım. Yardım edeceklere şimdiden teşekkürler.

Kod

@  __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_ON & _LVP_OFF & _CP_OFF

CMCON = 7
TRISA=%00111111
TRISB=%00011110

PORTA=0
PORTB=0

DEFINE LCD_DREG		PORTB   'lcd picin hangi bacagından baslayacak	
DEFINE LCD_DBIT		4		'portb nin 4 ünden baslayacak
DEFINE LCD_RSREG	PORTB	'lcd rs biti portb ye baglı olacak
DEFINE LCD_RSBIT	2	    'rs bit portb nin 2 sine baglı olacak
DEFINE LCD_EREG		PORTB	' e biti portb ye baglı olacak
DEFINE LCD_EBIT		3	    ' e biti portb nin 3 üne baglı olacak
DEFINE LCD_BITS		4	    'lcd 4 bit baglanacak
DEFINE LCD_LINES	2       'lcd 2 satır olacak
      
'---------------------------değişkenler----------------------------------------- 
    zaman    var    byte
    SYC      VAR    BYTE   
    TERM     VAR    BYTE
    SAYI     VAR    BYTE 
    AYAR     VAR    BYTE
    TSEN     VAR    WORD
    TSET     VAR    WORD
    ALT      VAR    WORD
    EK       VAR    BYTE       
    ALARM1   VAR    word
    ALARM2   VAR    word
    E1        VAR    BYTE
    E2        VAR    BYTE
    i var byte
    MENU    VAR     PORTA.0
    YUKARI  VAR     PORTA.1
    ASAGI   VAR     PORTA.2
    Busy       VAR BIT         ' Busy Status-Bit
    a var byte
    
HAM         VAR	WORD        ' Sensör HAM okuma değeri
ISI         VAR WORD        ' Hesaplanmış ISI değeri
Float       VAR WORD        ' Holds remainder for + temp C display
 
eksi var byte    
ISARET_BITI   VAR HAM.Bit12   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
EKSI_ISI   CON 1           ' Sıfır altında isaret biti=1  oluyor kontrol için
DERECE     CON 223         ' ° işareti
ISARET     VAR BYTE        '  ISI değeri için  +/-  işaret
TEMP        VAR BYTE       ' Div32 bit hesap için geçici değişken
SYMBOL COMM_PIN=PORTB.1  'ds18b20 portb nin 1 inden veri alacak


lCDOUT $FE,$48,$6,$9,$9,$6,$0,$0,$0,$0        'derece işareti 

GIRIS: 
    
   LCDOUT $FE,$80,"    Z I Y A     "            	
   lcdout $FE,$C0,"  K U L U C K A " 
   PAUSE 2000
   LCDOUT $FE,1 
    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
     '-------------------------------------------------------------------------------
BASLANGIC:
SYC=0 

READ $01,A:IF A=255 THEN A=0
READ $11,term:IF term=255 THEN term=1
read $02,eksi
read $03,ISARET

read $38,EK:IF EK=255 THEN EK=0
                  
BASLA:  

        GOSUB SENSOROKU
        GOSUB EKRAN1
        GOSUB ISIKONTROL
        
   
IF MENU=1 THEN  GOTO AYAR_MENUSU
goto BASLA       
'---------------------------------------EKRANA YAZ -----------------------------	
EKRAN1:
  ALARM1=ALT/10:ALARM2=ALT//10
  lcdout $FE,$80,"ISI =",ISARET,DEC3 ISI,",",DEC1 (FLOAT),1,"C"
  
  lcdout $fe,$C0,"SET =",eksi,DEC3 term,",",DEC1 A,1,"C"

   RETURN


  
SENSOROKU: 
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
           OWIN    Comm_Pin, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle    ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
           RETURN
Hesapla:                 ' Ham değerden Santigrat derece hesabı
    ISARET  = "+"
    IF ISARET_BITI = EKSI_ISI THEN
       ISARET   = "-" 
        
       ham=~ham+2
    endif
    float = (HAM*10)/16   
    ISI=float/10
    write $03,ISARET
    RETURN  
'----------------------------ISI KONTROL----------------------------------------

ISIKONTROL:
 READ $38,EK
 READ $11,term:IF term=255 THEN term=1
read $02,eksi
 read $03,ISARET

TSET=(term*10)+a:TSEN=FLOAT
       if eksi=ISARET then             
     
        if tseN=<(TSET-EK) then
         high PORTa.3
         endif
         
           if TSET=<tsen then          
         LOW PORTa.3  
        endif          
         endif 
                  
       
      IF MENU=1 THEN  GOTO AYAR_MENUSU
RETURN 


 
 BIP:
    HIGH PORTB.0   
 pause 20
     LOW PORTB.0  
  RETURN
BIPBIP:
     HIGH PORTB.0   
    PAUSE 20  
      LOW PORTB.0 
    PAUSE 20
     HIGH PORTB.0
    PAUSE 20
      LOW PORTB.0 
RETURN
'-------------------------------------------------------------------------------




AYAR_MENUSU:

WHILE MENU=1:WEND
GOSUB TEMIZLE
SYC=0
 
AYARLAR:
IF YUKARI=1 THEN
WHILE YUKARI=1:wend
        
SYC=SYC+1                    
  IF SYC=3 THEN SYC=0
ENDIF

IF ASAGI=1 THEN
GOSUB BIP
WHILE ASAGI=1:WEND

SYC=SYC-1
  IF SYC=255 THEN SYC=2
ENDIF
GOSUB DURUM
GOTO AYARLAR
GOSUB EKRAN1

DURUM:
SELECT CASE SYC 
CASE 0
lcdout $fe,$80,"ISITICI AYARLARI"
LCDOUT $FE,$C0,"              "


IF MENU=1 then 
WHILE MENU=1
WEND
  
GOSUB BIP 
GOTO TERM_KONTROL
ENDIF



CASE 1
lcdout $fe,$80,"ISI HASSASIYET  "
LCDOUT $FE,$C0,"   A Y A R I "

                             
IF MENU=1 then 
WHILE MENU=1:WEND
GOSUB BIP
GOTO HASSASIYET
ENDIF

CASE 2
lcdout $fe,$80,"MENUDEN CIKIS   " 
LCDOUT $FE,$C0,"              " 

  
IF MENU=1 THEN AYARLANDI
END SELECT

RETURN

TERM_KONTROL:
       GOSUB TEMIZLE 
       if term=255 then term=0  
       term=0
       
      READ $01,a:READ $11,term:read $02,eksi    
SET_AYAR: 
ALARM1=ALT/10:ALARM2=ALT//10 
LCDOUT $FE,$80,"ISI LIMITINI SEC"
LCDOUT $FE,$C0,"AYAR:",eksi,DEC3 term,",",DEC1 A,1,"C"
   write $02,eksi
 
  
           IF YUKARI=1 then
              if eksi="+" then
                a=a+1
                gosub bip
                if a=10 then
                 a=0:term=term+1
                  if term>125 then term=125
                endif
              else
                a=a-1
                gosub bip
                if a=255 then
                  
                A=9 :term=term-1
                if term=255 then
                 term=0:eksi="+":A=1 
                                
                 endif
                endif
              endif   
              PAUSE 150
           ENDIF
           
           IF ASAGI=1 then
             if eksi="+" then
              
               A=A-1
               gosub bip
               if a=255 then 
               a=9:
                   term=term-1
               IF TErm=255 then 
                     term=0:eksi="-":A=1
                    
                   endif 
                 endif   
                 goto CIK
             else                       
             a=a+1
              gosub bip
             if a=10 then 
               a=0:
                  term=term+1
             IF term=55 then term=55
               endif  
             endif
             pause 100
            endif       
             
CIK:             
             PAUSE 150
          
          
iF MENU=1 THEN 
         
         WRITE $01,a
         WRITe $11,term
        
         GOTO AYAR_MENUSU
         ENDIF 
                      
GOTO SET_AYAR  

HASSASIYET:
GOSUB TEMIZLE
HASSAS:
E1=EK/10:E2=EK//10
LCDOUT $FE,$80,"HASSASIYET"
LCDOUT $FE,$C0,"AYARI:",DEC1 E1,",",DEC1 E2,1,"C"
IF YUKARI=1 THEN 
EK=EK+1
PAUSE 100
gosub BIP

endif

IF EK=01 THEN EK=51

IF ASAGI=1 THEN 

EK=EK-1
gosub BIP
PAUSE 100
endif
IF EK=51 THEN EK=01
IF MENU=1 THEN 
WRITE $38,EK:PAUSE 10
GOTO AYAR_MENUSU
ENDIF
GOTO HASSAS    
	


 
 AYARLANDI:
           IF MENU=1 then AYARLANDI
           
       lcdout $fe,1
      LCDOUT $FE,$80,"AYARLAR  ....  " 
      LCDOUT $FE,$C0,"KAYDEDILDI....  "
       GOSUB BIPBIP
       AYAR=1
       SYC=0
       PAUSE 800
        
        GOSUB TEMIZLE
        goto BASLANGIC       
TEMIZLE:
        lcdout $fe,1
 RETURN        
 END
    
   
 

   
Proteus çizimi aşağıda

http://www.filedropper.com/628ile_1     

Maxim

program hata veriyor derlenmiyor
ayrıca upload.gen.tr için norton antivirüs uyarı veriyor

hkalaycioglu

microcode studio x (MSCX) kullanıyorum mplab ile beraber asm ile derliyorum. Bende bir sorun yok ama linkide değiştirdim

Erol YILMAZ

Bu aralar aslında hep aynı konularda soru soruluyor,

Kısacası "Multitasking" tekniğini iyice düşünüp, planlayıp, test edip, uygulamamız gerek.

Temel fikirleri oturtursak, gerisi ihtiyaç ve hayal gücümüze kalmış olacak.

Test ortamımız: 8 bit, 10 MIPS PIC18 Mcu
Hedef : Kuluçka için Sıcaklık Kontrol Sistemi ! (LCD Menülü)

1. adım

Tek çekirdekli bir Mcu, mikro manada aynı anda tek bir işi yapabilir. (100nS de 1 komut !)
Fakat ardı sıra işlemleri hızlı bir şekilde yapabilir. (Sn de 10 milyon komut !)

2. adım

Bir Mcu, basitçe!
birçok işi (fonksiyon, task?)
makro manada aynı anda! (makro mana: 100 uS farkla diyelim)
Takip ve Kontrol edebilir.

3. adım

Sistemin bütünü için görev parçaları oluşturmalıyız.
Bunları birbirinden izole etmeliyiz !
Bunları birbirine bağlamalıyız !

Birbirine zıt şeyleri söylüyor gibi görünüyorum ama daha yakından bakarsak anlam bulacaktır.

Örnek:
LCD ekrana veri yazma rutini ile sıcaklık sensörü okuma arasında hiçbir ilişki yoktur !
Dolayısı ile bunlar birbirinden farklı görev parçalarına aittir.
Birbirinden izole edilmelidir.
LCD ye birşey yazıcam diye sensörü okumamazlık edemem !

Bütün bunları görevlere ayırmaz, iç-içe koyup LCD den gelecek onay için sistemi kilitlerseniz,
LCD ve kontrolü sistemin herşeyi olur.
Veya kullanıcı menüyü Onaylamadı diye yavru adayları pişerek ölür.
Bunların birbiri ile hiç (neredeyse) alakası olmadığını net bir şekilde anlamak lazım.

Tercih yapacak olsam, Sıcaklık kontrolünü, LCD nin önüne koyardım.
Her neyseki böyle bir tercih yapmam gerekmiyor,
2 esaslı görev de MAKRO manada aynı anda olabilir.

Sıcaklık kontrolü ayrı bir şeydir,
Menü (LCD kontrolü, Tuş Takımı, değer değişimi) ayrı birşeydir.

Init ettikten sonra birinin diğerini beklemesi anlamsızdır.
Bu izole etmemiz gereken kısımdı.

Gelelim bağlantı noktasına :
Sıcaklık Kontrolü ile menü arasında 1 tane ilişki var.
O da menüde onaylanmış olan değerler !
Bu verileri Sıcaklık kontrol görevine aktarmak durumundayız.
Ve Misal olarak Menüde bir değer onaylanıncaya kadar eski değer geçerlidir !


Nispeten basit bu sistem için,
LCD ve Tuş takımı için Ana programı,
Sıcaklık için de Timer INT i kullanabilirsin.

Her ikisi de aynı anda, bağımsız olarak çalışır.


Şimdi, yazdığınız kodu biraz inceledim.
Gördüklerim:

BASLA: 
        GOSUB SENSOROKU
        GOSUB EKRAN1
        GOSUB ISIKONTROL
IF MENU=1 THEN  GOTO AYAR_MENUSU
goto BASLA   


Gördüğüm kadarıyla sizin yazılımı kilitleyen, Menü den dönmemek oluyor.
Kısaca Sensör okuma ve Isı Kontrol fonksiyonları bir Timer INT ile çağırılırsa bu problemden kurtulmuş olursunuz.
Bu arada "Isı" değil "Sıcaklık" Kontrol olması gerekiyor.

Ama dediğim gibi sadece o iş için kurtulmuş olursunuz.
İşin doğrusu için, ben bu işi yapacağım diyorsanız, Multitasking tekniklerini öğrenmeniz çok yerinde olacaktır.
Diyeceksiniz ki, Basic ile M.T. olur mu ?
Multitasking ASM, Basic yada C dili ile alakalı birşey değil, temelde bir bakış açısıdır.

frederic

Allegro'nun bu yazısı forumda sabit bir yere konulmalı bence, amatörlerin en çok kilitlendiği nokta burası çünkü. rtos yapısını bütün programcılar içselleştirmeli diye düşünüyorum.

hkalaycioglu

menüden  kendi isteğimle dönebiliyorum hocam belirli bir süre menü nün içinde kalırsa bunu otomatik yapmasını istiyorum. Nispeten size göre kolay bir durum ama bana göre zor bir olay tavsiyeleriniz için teşekkür ederim sağolun.

mustafa_cmbz

for next ile bir döngü kurup menu fonksiyonlarında kullandığın tusların altına koy.

mesela toplamda 100 saydığında tuşlara 10sn kadar basılması menuden çık ana çalışma ekranına dön gibi birşeyler olabilir..Benimde böyle birşeye 2-3 güne ihtiyacım olacak.Bakalım..

hkalaycioglu

Teşekkürler bunlar daha açıklayıcı olmuş sağolun.

Erol YILMAZ

Alıntı yapılan: hkalaycioglu - 06 Nisan 2014, 13:26:07
menüden  kendi isteğimle dönebiliyorum hocam belirli bir süre menü nün içinde kalırsa bunu otomatik yapmasını istiyorum. Nispeten size göre kolay bir durum ama bana göre zor bir olay tavsiyeleriniz için teşekkür ederim sağolun.

Menu içine bir sayıcı koyarsın, menuye ilk geldiğinde ve bir tuşa bastığında değeri SIFIR olur.
Menu içinde belli bir değere gelirse geri dönersin.

-------
Bu şekilde çalışabilir ama bu aç karna, soslu cips yemek gibi olur.

Karnın doydu mu ? en azından çok aç değilim.
Tavsiye eder misin ? etmem :) Mümkünse bir daha da yapmam.

hkalaycioglu

Allegro hocam bizler profesyonel devreler ticari devreler yapmıyoruz sonuçta yaptığımız amatör bir çalışma bu programında çoğunu ben yazdım yardım almadımmı aldım. yanı buna kızdınızmı bilmiyorum soslu veya sossuz karnımızın açlığını gidersek bize yeter

Maxim

#10
bende aynı şekilde düşünmüştüm
öyle yada böyle isteneni verecektir

bir word değeri tanımlardım ve menü altında her alt bölümde bunu arttırırdım
inc menusay gibi mesela

ama herhangi tuşa bastığım anda bu değer sıfır olacak
menusay=0

ve sonunda şöyle birşey çıkardı ortaya

inc menusay
if tus=0 then menusay=0
if menusay> 35000 then goto BASLA

bunu menu altında her bolume eklemek lazım


edit:
birkaç düzeltme
menusay değeri deneyerek bulunmalı, belki 450 olacak belki 35000

hkalaycioglu

Teşekkürler maxim hocam deneyeceğim

F.T

bence kesme kullanıp bir sayaç konursa diğer işlerde rahat yapılabilir. menü girişinde sayaç sıfırlanır.menü içinde işlem yaparken sürekli sayaç sıfırlanır.işlem yapmıyorsak zaten ayarlanan sayaç değerine gelince ana sayfaya gönderilir.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

hkalaycioglu

F.T. Hocam hangi kesmeyi kullanmamı tavsiye edersiniz.

Veli B.

Timerlar, bu tip kullanımlar için tasarlanmıştır. Herhangi bir timer ile durumlardan bağımsız olarak sayma yapar ve istenilen süre sonunda çıkış yaparsınız. Burada dikkat etmeniz gereken nokta, menü içerisinde iken; her türlü kullanıcı işleminde timerın sıfırlanarak, baştan saymaya başlamasını sağlamaktır.