Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

relay on / of cod problemi

Başlatan yysbd, 17 Şubat 2012, 06:51:27

ete

Programı düzenledim.

Ete

ADCON1=7
TRISA=0
TRISC=0 			'C portu çıkış olarak ayarlandı
TRISD=0
TRISE=0
TRISB=%11111111     'B.0 pini giriş  olarak ayarlandı.
option_reg.7=0
HAM         VAR	WORD
Float       VAR WORD
SIGN        VAR BYTE 
ISI         VAR BYTE  'sıcaklık tam sayı kısmı
ONDA        VAR BYTE  'sıcaklık ondalık kısım
 
Busy        VAR BIT  
SIGN_BITI   VAR HAM.Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
NEGAT_ISI   CON 1  
symbol  Comm_Pin=PortE.0    ' One-wire Data-Pin "DQ" PortB.0 da
'*****LCD TANIMLAMALARI*****
DEFINE LCD_DREG         PORTD
DEFINE LCD_DBIT         4
DEFINE LCD_RSREG        PORTD
DEFINE LCD_RSBIT        2
DEFINE LCD_EREG         PORTD
DEFINE LCD_EBIT         3
DEFINE LCD_BITS         4
DEFINE LCD_LINES        4


'BUTON TANIMLARI
SYMBOL BUTON0=PORTB.0  ' PortB.0 pinine sembol ismi olarak BUTON adı verildi
SYMBOL BUTON1=PORTB.1         
SYMBOL BUTON2=PORTB.2
SYMBOL BUTON3=PORTB.3
SYMBOL BUTON4=PORTB.4
SYMBOL BUTON5=PORTB.5
SYMBOL BUTON6=PORTB.6
SYMBOL BUTON7=PORTB.7
'RÖLE ÇIKIŞ  TANIMLARI
SYMBOL RELAY0=PORTC.0   ' PortC.0 pinine sembol ismi olarak RELAY adı verildi.      
symbol RELAY1=PORTC.1
SYMBOL RELAY2=PORTC.2
SYMBOL RELAY3=PORTC.3
SYMBOL RELAY4=PORTC.4
SYMBOL RELAY5=PORTC.5
SYMBOL RELAY6=PORTC.6
SYMBOL RELAY7=PORTC.7

Y var byte

PORTC = 0
CLEAR  'tüm değişkenler sıfırlandı
lcdout $FE,1 
pause 200

                       
LCDOUT $FE,$80,"ANA EKRAN 1 "             	
LCDOUT $FE,$C0,"ANA EKRAN 2 "
LCDOUT $FE,$94,"ANA EKRAN 3 "             	
LCDOUT $FE,$D4,"ANA EKRAN 4 "
PAUSE 500
LCDOUT $FE,1

ana_ekran:
lcdout $fe,02," IC ISI CONTROL"
      gosub SENSOROKU     'SONSÖR OKU VE SICAKLIĞI EKRANA YAZ
      lcdout $fe,$94," SICAKLIK=",DEC ISI,",",DEC1 ONDA

tus_bekle:
    pause 1
if PORTB = 255 then ANA_EKRAN


BASLA:
        ' RELAY......0
    IF BUTON0 = 0 THEN         ' Anahtar basılı ise
        TOGGLE RELAY0               ' Rölenin durumunu değiştir                                   

        LCDOUT $FE,1," BIRINCI BUTON  "
       
        if RELAY0 = 1 then
            goto acmis
        else
            goto kapatmis
        endif 

'        gosub butonbirak        '' buton bırakmayı bekle

    ENDIF                       
      
        ' RELAY......1               	   		           	
    IF BUTON1 = 0 THEN         '  
        TOGGLE RELAY1               ' Rölenin durumunu değiştir                                   

        LCDOUT $FE,1," IKINCI BUTON    "
        
        if RELAY1 = 1 then
            goto acmis
        else
            goto kapatmis
        endif 

'        gosub butonbirak        '' buton bırakmayı bekle
    ENDIF  
    		                   
        ' RELAY......2
    IF BUTON2 = 0 THEN         '  
        TOGGLE RELAY2               ' Rölenin durumunu değiştir                                   

        LCDOUT $FE,1," UCUNCU BUTON  "
        
        if RELAY2 = 1 then
            goto acmis
        else
            goto kapatmis
        endif 

'        gosub butonbirak        '' buton bırakmayı bekle
    ENDIF 
     
        ' RELAY......3  
    IF BUTON3 = 0 THEN         '  
        TOGGLE RELAY3               ' Rölenin durumunu değiştir                                   

        LCDOUT $FE,1," DORDUNCU BUTON "
        
        if RELAY3 = 1 then
            goto acmis
        else
            goto kapatmis
        endif 

'        gosub butonbirak        '' buton bırakmayı bekle
    ENDIF 
     
        ' RELAY......4               
    IF BUTON4 = 0 THEN         '  
        TOGGLE RELAY4               ' Rölenin durumunu değiştir                                   

        LCDOUT $FE,1," BESINCI BUTON  "
        
        if RELAY4 = 1 then
            goto acmis
        else
            goto kapatmis
        endif 

'        gosub butonbirak        '' buton bırakmayı bekle
    ENDIF 
     
        ' RELAY......5    
    IF BUTON5 = 0 THEN         '  
        TOGGLE RELAY5               ' Rölenin durumunu değiştir                                   

        LCDOUT $FE,1," ALTINCI BUTON   "
        
        if RELAY5 = 1 then
            goto acmis
        else
            goto kapatmis
        endif 

'        gosub butonbirak        '' buton bırakmayı bekle
    ENDIF   
        ' RELAY......6          
    IF BUTON6 = 0 THEN         '  
        TOGGLE RELAY6               ' Rölenin durumunu değiştir                                   

        LCDOUT $FE,1," YEDINCI RELAY   "
        
        if RELAY6 = 1 then
            goto acmis
        else
            goto kapatmis
        endif 

'        gosub butonbirak        '' buton bırakmayı bekle
    ENDIF         
        ' RELAY......7  
    IF BUTON7 = 0 THEN         '  
        TOGGLE RELAY7               ' Rölenin durumunu değiştir                                   

        LCDOUT $FE,1," SEKIZINCI RELAY   "
        
        if RELAY7 = 1 then
            goto acmis
        else
            goto kapatmis
        endif 

'        gosub butonbirak        '' buton bırakmayı bekle
    ENDIF           
         	       		
GOTO BASLA 	             ' BASLA isimli etikete git.
END

'''''''''''

acmis:
    LCDOUT $FE,$C0,"     YANDI       "
goto butonbirak


kapatmis:
    LCDOUT $FE,$C0,"    KAPATTI     "
goto butonbirak


butonbirak:
    for Y = 1 to 200
        pause 1
        if PORTB <> 255 then butonbirak '' basılı buton varsa
    next
    
    for Y = 1 to 250    ''' tuş durumu gösterme süresi 250 * 8 = 2000 ms
        pause 6
        if PORTB <> 255 then BASLA      ''' Tuşa basılırsa hemen geç
    next
goto ana_ekran

SENSOROKU: 

           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini çevir
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ı
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-"  
       ham=~ham+2
    endif
    float = (HAM*10)/16        ' 
    ISI=FLOAT/10 
    ONDA=FLOAT//10
    RETURN 
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

OG

Yeni arkadaşın kafasını zorlayalım ki öğrenmesi kolaylaşsın. Şimdi de kod optimizasyonu.

ADCON1=7
TRISA=0
TRISC=0 			'C portu çıkış olarak ayarlandı
TRISD=0
TRISE=0
TRISB=%11111111     'B.0 pini giriş  olarak ayarlandı.
option_reg.7=0
HAM         VAR	WORD
Float       VAR WORD
SIGN        VAR BYTE 
ISI         VAR BYTE  'sıcaklık tam sayı kısmı
ONDA        VAR BYTE  'sıcaklık ondalık kısım
 
Busy        VAR BIT  
SIGN_BITI   VAR HAM.Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
NEGAT_ISI   CON 1  
symbol  Comm_Pin=PortE.0    ' One-wire Data-Pin "DQ" PortB.0 da
'*****LCD TANIMLAMALARI*****
DEFINE LCD_DREG         PORTD
DEFINE LCD_DBIT         4
DEFINE LCD_RSREG        PORTD
DEFINE LCD_RSBIT        2
DEFINE LCD_EREG         PORTD
DEFINE LCD_EBIT         3
DEFINE LCD_BITS         4
DEFINE LCD_LINES        4


'BUTON TANIMLARI
SYMBOL BUTON0=PORTB.0  ' PortB.0 pinine sembol ismi olarak BUTON adı verildi
SYMBOL BUTON1=PORTB.1         
SYMBOL BUTON2=PORTB.2
SYMBOL BUTON3=PORTB.3
SYMBOL BUTON4=PORTB.4
SYMBOL BUTON5=PORTB.5
SYMBOL BUTON6=PORTB.6
SYMBOL BUTON7=PORTB.7
'RÖLE ÇIKIŞ  TANIMLARI
SYMBOL RELAY0=PORTC.0   ' PortC.0 pinine sembol ismi olarak RELAY adı verildi.      
symbol RELAY1=PORTC.1
SYMBOL RELAY2=PORTC.2
SYMBOL RELAY3=PORTC.3
SYMBOL RELAY4=PORTC.4
SYMBOL RELAY5=PORTC.5
SYMBOL RELAY6=PORTC.6
SYMBOL RELAY7=PORTC.7

Y var byte
my_bit var bit

PORTC = 0
CLEAR  'tüm değişkenler sıfırlandı
lcdout $FE,1 
pause 200

                       
LCDOUT $FE,$80,"ANA EKRAN 1 "             	
LCDOUT $FE,$C0,"ANA EKRAN 2 "
LCDOUT $FE,$94,"ANA EKRAN 3 "             	
LCDOUT $FE,$D4,"ANA EKRAN 4 "
PAUSE 500
LCDOUT $FE,1

ana_ekran:
lcdout $fe,02," IC ISI CONTROL"
      gosub SENSOROKU     'SONSÖR OKU VE SICAKLIĞI EKRANA YAZ
      lcdout $fe,$94," SICAKLIK=",DEC ISI,",",DEC1 ONDA

tus_bekle:
    pause 1
if PORTB = 255 then ANA_EKRAN


BASLA:
        ' RELAY......0
    IF BUTON0 = 0 THEN         ' Anahtar basılı ise
        TOGGLE RELAY0               ' Rölenin durumunu değiştir                                   

        LCDOUT $FE,1," BIRINCI BUTON  "
        
        my_bit = RELAY0
        goto acik_kapali 
       
'        if RELAY0 = 1 then
'            goto acmis
'        else
'            goto kapatmis
'        endif 

'        gosub butonbirak        '' buton bırakmayı bekle

    ENDIF                       
      
        ' RELAY......1               	   		           	
    IF BUTON1 = 0 THEN         '  
        TOGGLE RELAY1               ' Rölenin durumunu değiştir                                   

        LCDOUT $FE,1," IKINCI BUTON    "
        
        my_bit = RELAY1
        goto acik_kapali 
        
'        if RELAY1 = 1 then
'            goto acmis
'        else
'            goto kapatmis
'        endif 

'        gosub butonbirak        '' buton bırakmayı bekle
    ENDIF  
    		                   
        ' RELAY......2
    IF BUTON2 = 0 THEN         '  
        TOGGLE RELAY2               ' Rölenin durumunu değiştir                                   

        LCDOUT $FE,1," UCUNCU BUTON  "
        
        my_bit = RELAY2
        goto acik_kapali 
        
'        if RELAY2 = 1 then
'            goto acmis
'        else
'            goto kapatmis
'        endif 

'        gosub butonbirak        '' buton bırakmayı bekle
    ENDIF 
     
        ' RELAY......3  
    IF BUTON3 = 0 THEN         '  
        TOGGLE RELAY3               ' Rölenin durumunu değiştir                                   

        LCDOUT $FE,1," DORDUNCU BUTON "
        
        my_bit = RELAY3
        goto acik_kapali 
        
'        if RELAY3 = 1 then
'            goto acmis
'        else
'            goto kapatmis
'        endif 

'        gosub butonbirak        '' buton bırakmayı bekle
    ENDIF 
     
        ' RELAY......4               
    IF BUTON4 = 0 THEN         '  
        TOGGLE RELAY4               ' Rölenin durumunu değiştir                                   

        LCDOUT $FE,1," BESINCI BUTON  "
        

        my_bit = RELAY4
        goto acik_kapali 
        
'        if RELAY4 = 1 then
'            goto acmis
'        else
'            goto kapatmis
'        endif 

'        gosub butonbirak        '' buton bırakmayı bekle
    ENDIF 
     
        ' RELAY......5    
    IF BUTON5 = 0 THEN         '  
        TOGGLE RELAY5               ' Rölenin durumunu değiştir                                   

        LCDOUT $FE,1," ALTINCI BUTON   "
        
        my_bit = RELAY5
        goto acik_kapali 
        
'        if RELAY5 = 1 then
'            goto acmis
'        else
'            goto kapatmis
'        endif 

'        gosub butonbirak        '' buton bırakmayı bekle
    ENDIF   
        ' RELAY......6          
    IF BUTON6 = 0 THEN         '  
        TOGGLE RELAY6               ' Rölenin durumunu değiştir                                   

        LCDOUT $FE,1," YEDINCI RELAY   "
        
        my_bit = RELAY6
        goto acik_kapali 
        
'        if RELAY6 = 1 then
'            goto acmis
'        else
'            goto kapatmis
'        endif 

'        gosub butonbirak        '' buton bırakmayı bekle
    ENDIF         
        ' RELAY......7  
    IF BUTON7 = 0 THEN         '  
        TOGGLE RELAY7               ' Rölenin durumunu değiştir                                   

        LCDOUT $FE,1," SEKIZINCI RELAY   "
        
        my_bit = RELAY7
        goto acik_kapali 
        
'        if RELAY7 = 1 then
'            goto acmis
'        else
'            goto kapatmis
'        endif 

'        gosub butonbirak        '' buton bırakmayı bekle
    ENDIF           
         	       		
GOTO BASLA 	             ' BASLA isimli etikete git.
END

'''''''''''
acik_kapali:
    if my_bit = 0 then kapatmis


acmis:
    LCDOUT $FE,$C0,"     YANDI       "
goto butonbirak


kapatmis:
    LCDOUT $FE,$C0,"    KAPATTI     "
goto butonbirak


butonbirak:
    for Y = 1 to 200
        pause 1
        if PORTB <> 255 then butonbirak '' basılı buton varsa
    next
    
    for Y = 1 to 250    ''' tuş durumu gösterme süresi 250 * 8 = 2000 ms
        pause 6
        if PORTB <> 255 then BASLA      ''' Tuşa basılırsa hemen geç
    next
goto ana_ekran

SENSOROKU: 

           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini çevir
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ı
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-"  
       ham=~ham+2
    endif
    float = (HAM*10)/16        ' 
    ISI=FLOAT/10 
    ONDA=FLOAT//10
RETURN 
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

yysbd

ete hocamın verdiği kodları isiste denemeye çalıştım ve ana ekran geliyor belli süre ok:ıc ısı yazıyor ve bekliyor sensör gelsin diye uzun bir süre tabi.birde butonlar işlem yapmıyor aca diyorum kodlarda mı problem var yoksa bendemi çünki ete hocam düzenledim dediği kod bu şekilde bir durum sergiliyor. :-[ syn og anlamaya çalışıyorum ama olmuyor isiste 16f877a krıstal seçimi ne olması gerekiyor ? yardımlarınız için tekrar teşekkür ederim.sağ

yysbd

syn ete hocam vermiş olduğunuz kod gerçekten kafayı yedırtti.açıkçası.bir türlu saçma apan birşeyler yapıyor hocam bu devreye sizden isteğim kararlı çalışan üç adet  e portuna ds18b20 okutmanız.ne olur hocam ne gecem ne gündüzüm kaldı bu 18b20 yüzünden.yaparsanız benim yptıklrımla karşılaştırıp hatmı bulmaya çalışayım en azında nerede hta yapıyorum öğrenmiş olurum.birde bu devrede kırıstell seçimi ne olmalıdır.hocam yardımlarınız için çok teşek ederim sağhttp://www.upload.gen.tr/d.php/www/p4ezyv5a/ETEYE.rar.html

ete

Sana verdiğim kodu deneyip de verdim. Bende sorunsuz çalışıyor. Üstelik OG ninde denediğinden eminim. O halde? kusur sende olmalı.
Başka ne yapabilirimki?. Sen çalıştıramadın diye yeniden başka mantıkla kod yazamam herhalde.
Yükleme yaptığın sitenin sorunlu olduğunu söylemiştim. Her nedense Avast bu siteye takmış durumda virüs var deyip çıkıyor.
Bu nedenle başka bir yere yüklemen gerek dosyalarını.
Açıklamanıda anlamıyorum. "3 adet E portuna DS18B20 okutmanız" lafı ne demeye geliyor. Yoksa 3 ayrı sensörümü okumaya çalışıyorsun.?
İnsan bunu yazarken 3 ayrı DS18B20 sensörünü E portuna bağlayıp 3 ayrı sıcaklık değeri okumak istiyorum diye açıklar. Ben kalın kafalıyımdır leb den leblebi anlamını çıkartamıyorum maalesef.
Şayet tahminim doğru ise 3 ayrı Comm_pin tanımlaman gerekiyor. 3 ayrı okuma alt programı yazman gerekiyor.
Her biri için ayrı sıcaklık değişkeni tanımlaman gerekiyor. Bunları yaptıktan sonra GOSUB SENSORBIR , GOSUB SENSORIKI, GOSUB SENSORUC şeklinde komut kullanıp 3 ayrı sıcaklığı okuyup ekrana verdirmen gerekiyor. Artık bu kadarınıda başar . Eline her türlü bilgiyi ve ip ucunu hatta çözümü verdik. Geriye bunları satırlara dökmek kalıyor. Başaramıyorsanda bırak kalsın otur çalış ve öğren derim artık.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com