Toprak Nem Algılama Modülü

Başlatan eprom_20, 24 Aralık 2016, 11:46:54

eprom_20

Merhaba,
ADC konusunda küçük bir çalışma örneği ETE hocamın ders ve kodları üzerine yazmaya çalıştım,
eksik ve yanlışlarımı söylerseniz sevinirim

eprom_20


eprom_20

Hatır içinde olsa bir öneri,bir hata,kusur yazaydınız iyiydi,,,

MB_77

#3
bu mesaj tarafımdan silinmiştir.

eprom_20

Hocam merhaba,
Konu ile alakalı kodları yazmaya çalıştım,hata ve eksiklerim mutlaka vardır yardım ederseniz çok sevinirim

@ __config _XT_OSC & _WDT_ON & _PWRTE_ON & _LVP_OFF & _CP_OFF

TRISA=%00000001
TRISB=%00000000
TRISC=%11111111
TRISD=%00000000
Define OSC 4   
'-------------------------------------------------------------------------------
DEFINE LCD_DREG PORTB 'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 4 'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 3 'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 1 'LCD RS bacağı Hangi Bite bağlı  ?
DEFINE LCD_BITS 4 'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2 'LCD Kaç sıra yazabiliyor

DEFINE ADC_BITS 10     'A/D çevirim sonucu kaç bit olacak
DEFINE ADC_CLOCK 3     'Clock kaynağı (3=rc)
DEFINE ADC_SAMPLEUS 100 'Örnekleme zamanı mikro saniye cinsinden.
'-------------------------------------------------------------------------------
ADCON1=%10001110 '7. bit 1 yapıldı 10 bit sonuç almak için.
'-------------------------------------------------------------------------------
HAM    var  WORD  'ADC den okunan ham digital değer.                                                                       
VOLT   var  WORD '16 bit değişken tipi seçtik kullanacağımız değer 10 bit olacak.
I      VAR  WORD
TEMP   var  WORD
A_LOW  var BYTE
U_HIGH var BYTE
TOL    var  byte
UHG    VAR BYTE
ALW    VAR BYTE
Mvolt  var  byte
AYR    VAR BYTE
SVY    VAR  BIT

SYMBOL ROLE=PORTD.0
SYMBOL MANUEL=PORTC.0
SYMBOL ASAGI=PORTC.1
SYMBOL YUKARI=PORTC.2
SYMBOL MENU=PORTC.3
SYMBOL BUZER=PORTD.3
SYMBOL SUYABAK=PORTC.4
SYMBOL SEVIYELED=PORTD.4

PORTA=0
PORTB=0
PORTC=0
PORTD=0

'-------------------------------------------------------------------------------

LCDOut $FE,1 ' LCD de CLS yapar
pause 200       ' LCD nin açılması için gerekli süredir.
'-------------------------------------------------------------------------------
LCDOut $FE,1,   "TOPRAK NEM "
LCDOUT $FE,$C0,"OLCME DEVRESI"
pause 1000 


BASLANGIC:
AYR=0
TOL=0
READ 10,SVY
READ 12,ALW
READ 13,UHG

BASLA:
      ADCIN 0,HAM  '0 nolu kanaldan Analog değeri oku ve RAW değişkenine aktar.
     
BAK:  IF ADCON0.2=1 THEN BAK 'Çevirme işlemi tamamlanınca Adcon0.2=0 olacak.
     
       GOSUB SU_SEVIYE
       GOSUB NEM_HESAP
      LCDOut $FE,1,  "NEM DUZEYI:%",DEC VOLT
      GOSUB NEM_AYAR
      GOSUB DURUM
     PAUSE 300
       
       for I=0 to 10000
       IF MENU=1 THEN
       GOTO ANAMENU   
       WHILE MENU=1:WEND
        ENDIF
        IF MANUEL=1 THEN
          GOSUB MANUELKONT
          WHILE MANUEL=1 :WEND
        ENDIF   
       next
      GOTO BASLA
     
NEM_HESAP:   
       Ham=ham+1 'Hesap kolaylığı açısından Ham değerini bir artırdık
      Volt=(ham */ 1250)/100 'Ham ile 1250 yi 32 bit olarak çarp ve 100'böl
     
     VOLT=VOLT*2
   
   ' A_LOW=VOLT/2*2
   ' U_HIGH=VOLT/10*10
   
RETURN


             
KAYDET:
WRITE 10,SVY:PAUSE 10
WRITE 12,ALW:PAUSE 10
WRITE 13,UHG :PAUSE 10
lcdout $FE,1,"AYARLAR"
LCDOUT $FE,$C0,"KAYDEDILDI..."
CALL ZIRLA
CALL ZIRLA
PAUSE 500
AYR=1
TOL=1
GOSUB EKRANI_SIL
GOTO BASLANGIC


AYAR_MENUSU:
WHILE MENU=1:WEND


ANAMENU:
LCDOUT $FE,1," NEM AYARI"
LCDOUT $FE,$C0,"UST SEVIYE:%",DEC UHG
PAUSE 200
IF YUKARI=1 THEN
   UHG=UHG+10
   GOSUB ZIRLA
  WHILE YUKARI=1:WEND
  IF UHG=>100 THEN UHG=100
ENDIF
IF ASAGI=1 THEN
  UHG=UHG-10
  GOSUB ZIRLA
  WHILE ASAGI=1:WEND
  IF UHG=255 THEN UHG=0
  ENDIF
IF MENU=1 THEN
WHILE MENU=1:WEND
  GOTO ARALIK_1
ENDIF
GOTO ANAMENU

ARALIK_1:
LCDOUT $FE,1," NEM AYARI"
LCDOUT $FE,$C0,"ALT SEVIYE:%",DEC ALW
PAUSE 200
IF YUKARI=1 THEN
  ALW=ALW+10
  GOSUB ZIRLA
  WHILE YUKARI=1:WEND
  IF ALW=>50 THEN ALW=50
ENDIF
IF ASAGI=1 THEN
  ALW=ALW-10
  GOSUB ZIRLA
  WHILE ASAGI=1:WEND
  IF ALW=255 THEN ALW=0
ENDIF
IF MENU=1 THEN
WHILE MENU=1:WEND
GOTO KAYDET
PAUSE 100
GOTO AYAR_MENUSU
ENDIF
GOTO ARALIK_1


SU_SEVIYE:
I=0
IF SUYABAK=1 THEN
SVY=1
ENDIF
IF SUYABAK=0 THEN
SVY=0
ROLE=0
GOSUB EKRANI_SIL
LCDOut $FE,1,  " SU BITTI   "
LCDOUT $FE,$C0," SU DOLDURUN"
for I= 1 to 12
CALL ZIRLA
CALL ZIRLA
CALL ZIRLA
SEVIYELED=1
pause 400
SEVIYELED=0
pause 400
SEVIYELED=1
GOTO SU_SEVIYE
next
ENDIF
RETURN


NEM_AYAR:
READ 10,SVY
READ 12,ALW
READ 13,UHG
LCDOUT $FE,$C0,"ALT:%",DEC ALW ,$88,"UST:%",DEC UHG
RETURN


DURUM:
READ 10,SVY
READ 12,ALW
READ 13,UHG
IF VOLT<=ALW THEN
GOSUB SU_SEVIYE
PORTD=%00000100
SVY=1
ROLE=1
ENDIF
IF VOLT=>UHG THEN
ROLE=0
SVY=0
PORTD=%00000010
ENDIF
RETURN


MANUELKONT:
  IF MANUEL=1 THEN
ROLE=1
LCDOut $FE,1,  "NEM DUZEYI:%",DEC3 Volt
LCDOUT $FE,$C0,"MOTOR CALISIYOR"
IF VOLT=>90 THEN
ROLE=0
SVY=0
GOSUB EKRANI_SIL
LCDOUT $FE,$C2,"SEVIYE TAMAM"
  ENDIF
  ENDIF
RETURN 

EKRANI_SIL:
LCDOUT $fe,1
return

ZIRLA:
HIGH BUZER
PAUSE 30
LOW BUZER
PAUSE 100
RETURN

END
                                       

MB_77

#5
bu mesaj tarafımdan silinmiştir.

eprom_20

Hocam ilginiz için teşekkür ederim,
benim merakım programda
ALW (alt seviye)
UHG (üst seviye)
bunlara programda matematiksel formül ile hesap yapmadığım halde çalışıyor
alt ve üst değerleri neyi baz alarak işlem yapıyor onu anlayamamıştım
aydınlatırsanız sevinirim

ete

Söz konusu değerleri eepromdan okuyorsun. Epromda bu bilgileri değiştirmemiş isen epromdan okunan default değer 255 dir. Dolayısıyla bu değişkenlere otomatikman 255 değeri verilecektir. Programda onları bu şekilde değerlendiriyor olması gerekir.
Bu çalıştığı anlamına gelmiyor tabiiki. İşin doğrusu bu değişkenlerin bir default değeri olması gerekir. Şayet epromdan okunan değer 255 ise bu o değerlerin hgam değer olduğunun bir göstergesi olup bu durumda o değişkenlere default değerleri verilmelidir Nasıl dersen;
BASLA satırından evvel epromdan;
READ 12,ALW
şeklinde ALW değerini okuyorsun. hemen altında;
IF ALW=255 THEN
   ALW=10  'ben rast gele default değer olarak 10 verdim sen ne gerekiyor ise onu ver
   WRITE 12,ALW:pause 10
ENDIF
şeklinde bu değeri vermelisin.
Benzer şekilde diğerlerinede aynı işlemi uygularsın.

Ete

eprom_20

Ete hocam teşekkür ederim,sağolun dediğiniz gibi satırları ekleyip default değerlerini verdim,sanırım başka bir sorun yok değilmi hocam

BASLANGIC:
READ 12,ALW
IF ALW=255 THEN
ALW=20                 'ben rast gele default değer olarak 10 verdim sen ne gerekiyor ise onu ver
WRITE 12,ALW:pause 10
ENDIF
READ 13,UHG
IF UHG=255 THEN
UHG=50                 'ben rast gele default değer olarak 10 verdim sen ne gerekiyor ise onu ver
WRITE 12,UHG:pause 10
ENDIF

ete

Bütün programa bakıp da şurada sorun var demek zor gerçekten. Çünki sorun olan şey o anda size sorun olarak gözükmez.
Bu işin doğrusu çalıştırırsın programı aksaklıkları görürsün ona görede programda sorun ararsın.
Programında sorun varmı yokmu diye anlamak için o programa hakim olmak gerekir. Kim hakimdirprograma? yazan kişi elbette.
Yazmayan benim gibi kişiler önce programı satır satır inceleyip olaya vakıf olması gerekir. Bu ise neredeyse 1 günlik iş. Yada en azından yarım günlük iş. Çoğu zaman bu bile yetmez illaki programı çalıştırmak gerekir. Çünki genellikle çok fazla mantık hatası yapılır ve onları yakalamanın tek yolu program çalışırken izlemektir başka yolu yok. tabiiki belirgin hataları insan görebilir ama onu sende görebilirsin zaten. Kimsenin en azından yarım gün program inceleyecek kadar boş vakti olduğunu sanmıyorum. Bu nedenle, nerede sorun var diye ısrarla soruyoruz.

Ete

eprom_20

Herşey için çok teşekkür ederim hocam.çok sağolun..selametle

Powered by EzPortal