2 hata 3 uyarı

Başlatan ugures, 15 Nisan 2015, 23:50:12

ugures

Arkadaşlar merhaba. Aşağıdaki yazılımı compile ettiğimde 2 hata3 uyarı veriyor. uğraştım ama bir türlü hatayı ve uyarıları bulamadım. yardımcı olabilirmisiniz.


       ;FUSES INT_RCIO, WDT, PUT, NOLVP, PROTECT;programlama sırasında fuses lere dikkat edilmelidir.RTC_Adr con $A2 ;SIMULASYON $A2 NORMAL DEFINE OSC 4    'Set receive register to reciever enabled DEFINE HSER_RCSTA 90h 'Set transmit register to transmitter enabled DEFINE HSER_TXSTA 20h 'Set baud rate DEFINE HSER_BAUD 2400 'Set SPBRGdirectly (normally set by HSER_BAUD) DEFINE HSER_SPBRG 25    'Set LCD Data port DEFINE LCD_DREG PORTB 'Set starting Data bit (0 or 4) if 4-bit bus DEFINE LCD_DBIT 4 'Set LCD Register Select port DEFINE LCD_RSREG PORTB 'Set LCD Register Select bit DEFINE LCD_RSBIT 2 'Set LCD Enable port DEFINE LCD_EREG PORTB 'Set LCD Enable bit DEFINE LCD_EBIT 3 'Set LCD bus size (4 or 8 bits) DEFINE LCD_BITS 4 'Set number of lines on LCD DEFINE LCD_LINES 2 'Set command delay time in us DEFINE LCD_COMMANDUS 2000 'Set data delay time in us DEFINE LCD_DATAUS 50 ;DEGISKENLER ;stack yedekleme degiskenleri wsave var byte $20 system ssave var byte bank0 system psave var byte bank0 system SOFT_INT VAR BYTE SOFT_TIMER1 var byte SOFT_TIMER2 var byte sys_con var byte new_key var sys_con.0 ;tuslardan birine basildi key_pressed var sys_con.1 ;herhangi bir tusa basili bekleniyor LCD_Tazele var sys_con.2 ;bir oldugunda lcd yenilenir flag2 var sys_con.3 flag3 var sys_con.4 keyb_Data var byte ;tus takimi okunan data menu_ID var byte ;ekran secenekleri ;gecici degiskenler TEMP0 VAR  BYTE    TEMP1 VAR  BYTE    w0 var word    i_ var byte;sicaklik sensor tanimlamalari ve degiskenleritemperature Var Word ' Temperature storagecount_remain Var Byte ' Count remainingcount_per_c Var Byte ' Count per degree Csensor_id var bytesensor1 var porta.0sensor2 var porta.1sensor3 var porta.2sensor4 var porta.3sensor5 var porta.5sicaklik var byte[5]pompa_girisi var portc.7;shift register s_serial io bus pinoutPLC_DO VAR PORTc.1PLC_CLK VAR PORTc.3PLC_PS VAR PORTc.0PLC_QE VAR PORTc.2OUT_Data var byteButon_girisi var PORTb.1;;;;saat degiskenlerimsaniye var bytesaniye var bytedakika var bytesaat var bytegun var byteay var byteyil var wordzaman var byte[8];cpu pinleriDPIN var portc.4CPIN    var portc.5SDA var portc.4SCL     var portc.5EEPROM 0,[0,1];oku/yaz 1.000.000 kezInclude "modedefs.bas";*********************************************BEGIN: GOTO RESET_VECTOR;;;;*********************************************;INTERRUPT YONETICISI'Define interrupt handlerdefine INTHAND MYINT_VECTORASMMYINT_VECTOR BCF INTCON,GIE BTFSC INTCON,GIE GOTO MYINT_VECTOR; movwf wsave swapf  STATUS, W clrf   STATUSmovwf   ssave movf  PCLATH, W movwf psave;Save and restoreENDASM ;TIMER0 INTERRUPT IF INTCON.2=1 THEN INTCON.2=0'Clear interrupt flag GOTO INT0ALG INT0ALG_RETURN: tmr0=0 ;GOTO INT_SEL_END ENDIFINT_SEL_END:ASM;Restore saved registers movf psave, W movwf PCLATH swapf ssave, W movewf STATUS swapf wsave, F    swapf wsave, W ;RETFIE ENDASM RESUME ;INTERRUPT YONETICISI;********************************************;;;********************************************;INTERRUPT BEKLEME DONGUSUWAIT_LOOP: ASM NOP NOP NOP CLRWDT BTFSS INTCON,7 BSF INTCON,7 NOP NOP NOP ENDASMGOTO WAIT_LOOP;INTERRUPT BEKLEME DONGUSU;*****************************************;;;*****************************************RESET_VECTOR:RESET_ALG: ASM BCF INTCON,GIE BTFSC INTCON,GIE GOTO _RESET_ALG ;OSILATOR 4 MHZ AYARLANIR BSF PCON,3 ;1=4, 0=32K ENDASM ;EGER ENERJI ILK KEZ VERILIYORSA;RAM HAFIZA SIFIRLANIRCLEARout_data=0high PLC_QE;ENERJI HATLARINDAKI PARAZITIK ETKI ICIN ACILIS GECIKMESIPAUSE 1000OPTION_REG=%00000001'7.Enable PORTB pullups 2-0 prescalarADCON1=%00000110Gosub Saat_Oku;acilis mesajiLCDOUT $FE, 1 'Clear display;lcdout "Start"pause 250Menu_ID=0 ;ana ekranlcd_tazele=1;HSEROUT ["P2511: ocak 2006",10,13];5 sicaklik sensoru de okunurfor temp0=0 to 4 call sicaklik_sensorlerini_okunextINTCON=%00100000 'Enable INTE interruptGOTO WAIT_LOOP;********************************************;;;********************************************INT0ALG:SELECT CASE         SOFT_INT CASE 0 ;ZAMANLAYICILAR SOFT_TIMER1=SOFT_TIMER1+1 ;IF SOFT_TIMER1=0 THEN SOFT_TIMER2=SOFT_TIMER2+1 if soft_timer1=50 then gosub Saat_Oku lcd_tazele=1 soft_timer1=0 SOFT_TIMER2=SOFT_TIMER2+1 endif if soft_timer1=40 then call sicaklik_sensorlerini_oku endif;CASE 1 Call OTOMASYON;CASE 2;bu bolum shift register surucuye TPIC6B595'e cikis bilgilerini yazar LOW PLC_PS SHIFTOUT PLC_DO,PLC_CLK,1,[out_data] HIGH PLC_PS low PLC_QE;CASE 3 Call Tuslari_Oku;CASE 4 if LCD_Tazele=1 then call LCD_Mesaj_Tazele endifEND SELECT SOFT_INT=SOFT_INT+1 IF SOFT_INT>4 THEN SOFT_INT=0GOTO INT0ALG_RETURN;********************************************;;;********************************************Tuslari_oku:;input Buton_girisi temp1=0 portb=portb|%11100000        portb.7=0 if Buton_girisi=0 then temp1.0=1 portb.7=1 portb.6=0 if Buton_girisi=0 then temp1.1=1 portb.6=1    portb.5=0 if Buton_girisi=0 then temp1.2=1 portb.5=1 if temp1=0 then ;hic tusa basili degil new_key=0 endif ;sadece tusa basildigi an icin bir flag uretilir ;bu sayede sadece tusa ilk basildigi an islem yapilabilir if temp1>0 and new_key=0 then keyb_data=temp1 ;***** tus islemleri if keyb_data=1 then menu_id=menu_id+1 if menu_id>30 then menu_id=0 endif if menu_id=1 then if keyb_data=2 then saat=saat+1 endif if keyb_data=4 then saat=saat-1 endifendif    if menu_id=2 then if keyb_data=2 then dakika=dakika+1endif if keyb_data=4 then dakika=dakika-1 endifendif    if menu_id=3 then if keyb_data=2 then gun=gun+1 endif if keyb_data=4 then gun=gun-1 endifendif    if menu_id=4 then if keyb_data=2 then ay=ay+1 endif if keyb_data=4 then ay=ay-1 endifendif    if menu_id=5 then if keyb_data=2 then yil=yil+1 endif if keyb_data=4 then yil=yil-1 endifendif    if menu_id>0 and menu_id<6 then call saat_yazendif    if menu_id=6 then READ 9,temp0 if keyb_data=2 then temp0=temp0+1 endif if keyb_data=4 then    temp0=temp0-1 endif if temp0>99 then temp0=99 write 9,temp0endif    ;aydinlatma degiskenlerinin girilmesi    If menu_id=>7 then temp1=10+menu_id read temp1,temp0 if keyb_data=2 then temp0=0 if keyb_data=4 then temp0=255 write temp1,temp0endif    ;***** tus islemleri    new_key=1    LCD_Tazele=1endif    return    lcd_bosluk_yaz: for i_=0 to 15 lcdout " " next i_return;    lcd_goto_line1: lcdout $FE,2return;    lcd_goto_line2: lcdout $FE,$C0return    print_sol_parantez: lcdout "["return    print_sag_parantez: lcdout "]"return;*****************************************;;*****************************************LCD_Mesaj_Tazele:call lcd_goto_line1;lcdout $FE, 2call lcd_bosluk_yaz;lcdout"                "call lcd_goto_line2;lcdout $FE, $C0call lcd_bosluk_yaz;lcdout"                "call lcd_goto_line1;lcdout $FE, 2 if menu_ID=0 then lcdout "Fan[",bin5 out_data,"]" if pompa_girisi=0 then lcdout "P" else lcdout " " endif lcdout "LO" if out_data.5=1 then lcdout "n" else lcdout "ff" endif call lcd_goto_line2;lcd 2. satir'a gec if soft_timer2.3=0 then lcdout dec2 saat, ":",dec2 dakika," ",dec2 gun,"/",dec2 ay,"/",dec4 yil else lcdout dec sensor_id+1,":",dec sicaklik[sensor_id],"C" endif endif;if menu_id>0 and menu_id<3 thenlcdout "Saat?"call lcd_goto_line2;lcd 2.satir'a geclcdout " ",dec2 saat, ":",dec2 dakikaendifif menu_id=1 then ;saat ayar ;    lcdout "[",dec2 saat, "]:",dec2 dakika lcdout $FE,$C0:call print_sol_parantez:lcdout $FE,$C0+3:call print_sag_parantezendifif menu_id=2 then ;dakika ayar;lcdout dec2 saat, ":[",dec2 dakika,"]"lcdout $FE,$C0+5:call print_sol_parantez:lcdout $FE,$C0+8:call print_sag_parantez endif;If menu_id>2 and menu_id<6 then Lcdout "Tarih?"call lcd_goto_line2lcdout " ",dec2 gun,"/",dec2 ay,"/",dec4 yilendifif menu_id=3 then ;gun ayar;lcdout "[",dec2 gun,"]/",dec2 ay,"/",dec4 yil call lcd_goto_line2:call print_sol_parantez:lcdout $FE,$C0+3:call print_sag_parantezendifif menu_id=4 then ;ay ayar;lcdout dec2 gun,"/[",dec2 ay,"]/",dec4 yil lcdout $FE,$C0+5:call print_sol_parantez:lcdout $FE,$C0+8:call print_sag_parantez endif if menu_id=5 then ;yil ayar;lcdout dec2 gun,"/",dec2 ay,"/[",dec4 yil,"]" lcdout $FE,$C0+10:call print_sol_parantez:lcdout $FE,$C0+15:call print_sag_parantez endif ; if menu_id=6 then ;maksimum sicaklik lcdout "Sicaklik?";dec sicaklik[0]," C" call lcd_goto_line2 READ 9,TEMP0 lcdout dec2 temp0," C"endif ; If menu_id=>7 then ;Maksimum sicaklik lcdout"Aydinlatma" call lcd_goto_line2;lcd 2.satir'a gec i_=menu_id-7 lcdout dec2 i_,":00-",dec2 i_,":59 O" temp1=10+menu_id READ temp1,temp0 if temp0=0 then lcdout "n" else lcdout "ff" endif endif ; LCD_Tazele=0return;**************************************************;;;**************************************************BCDTOBIN:;input temp0 output temp1 temp1=((temp0>>4)*10)+(temp0&$0f)returnBINTOBCD:;input temp0 output temp1 Temp1=((temp0/10)<<4)+(temp0//10)return;**************************************************;**************************************************Saat_Oku: I2CREAD DPIN,CPIN,RTC_Adr,0,[temp0];kontrol register temp0.3=1 ;gun ve ay okumak icin maske acilir I2CWRITE DPIN,CPIN,RTC_Adr,0,[temp0] ;kontrol register ;zaman entegresi bilgilerifor i_=2 to 6 I2CREAD DPIN,CPIN,RTC_Adr,i_,[temp0] call bcdtobin zaman[i_]=temp1next i_ saniye=zaman[2]    dakika=zaman[3]    saat=zaman[4]    gun=zaman[5]    ay=zaman[6]; I2CREAD DPIN,CPIN,RTC_Adr,$10,[yil.highbyte,yil.lowbyte]; hserout [dec2 saat, ":", dec2 dakika, ":", dec2 saniye,10,13]return;**************************************************;;;**************************************************Saat_Yaz: if saat>23 then saat=0 if dakika>59 then dakika=0 if ay>12 then ay=1 if ay<1 then ay=12;kapatilan fonksiyonlar yerine kodu kucultmek icinzaman[2]=saniyezaman[3]=dakikazaman[4]=saatzaman[5]=gunzaman[6]=ayfor i_=2 to 6 temp0=zaman[i_] call bintobcd I2Cwrite DPIN,CPIN,RTC_Adr,i_,[temp1]next i_;I2Cwrite DPIN,CPIN,RTC_Adr,$10,[yil.highbyte,yil.lowbyte]Return:;**************************************************;**************************************************;otomasyon algoritması ve butun kontrolleri bu bolumdedir;sicakliga bagli role kontrolleri;5 ayri sensor ile 5 ayri bolge istenilen 5 farkli sicaklik için kontrolu;zaman tablosuna bagli cikis konroluOTOMASYON:;sicaklik kontrolu Out_data=0 READ 9,temp0 ;sicaklik set degeri;ayarlanan sicakligin 1 derece altiasm decf_TEMP0,1endasm    if sicaklik[0]>temp0 then out_data.0=1        if sicaklik[1]>temp0 then out_data.1=1        if sicaklik[2]>temp0 then out_data.2=1        if sicaklik[3]>temp0 then out_data.3=1        if sicaklik[4]>temp0 then out_data.4=1    ;aydinlatmanin kontrolutemp1=saat+17read temp1,temp0    if temp0=0 then out_data.5=1;**************************************************;**************************************************;tek hatli sicaklik sensorleri oldukca yavas okunabiliyor.;Bu nedenle fonksiyon her calistiginda sadece 1 sensoru okuyacak;sekilde hazirlanmistir. PIC-Basic sinirlarindan dolayı degiskenler kullanilamamistir.;ds18b20 kullanilmistirsicaklik_sensorlerini_oku: select case sensor_idcase 0; OWOut sensor1,1,[$CC,$44] 'Start  if count_remain=0 thensensor1_oku_dongu: 'okuma yapilir OWOut sensor1,1,[$CC,$BE] 'sicakligi oku OWIn sensor1,0,[temperature.LOWBYTE,temperature.HIGHBYTE];case 1; OWOut sensor2,1,[$CC,$44] 'Startsensor2_oku_dongu: OWIn sensor2,4,[count_remain] 'Check still busyif count_remain=0 then sensor2_oku_dongu:'okuma yapilir OWOut sensor2,1,[$CC,$BE] 'sicakligi okuOWIn sensor2,0,[temperature.LOWBYTE,temperature.HIGHBYTE];case 2; OWOut sensor3,1,[$CC,$44] 'StartSensor3_oku_dongu: OWIn sensor3,4,[count_remain] 'Check still busyif count_remain=0 then sensor3_oku_dongu:'okuma yapılır OWOut sensor3,1,[$CC,$BE] 'sicakligi okuOWIn sensor3,0,[temperature.LOWBYTE,temperature.HIGHBYTE];case 3; OWOut sensor4,1,[$CC,$44] 'StartSensor4_oku_dongu: OWIn sensor4,4,[count_remain] 'Check still busyif count_remain=0 then sensor4_oku_dongu:'okuma yapilir OWOut sensor4,1,[$CC,$BE] 'sicakligi okuOWIn sensor4,0,[temperature.LOWBYTE,temperature.HIGHBYTE];case 4; OWOut sensor5,1,[$CC,$44] 'StartSensor5_oku_dongu: OWIn sensor5,4,[count_remain] 'Check still busyif count_remain=0 then sensor5_oku_dongu:'okuma yapılır OWOut sensor5,1,[$CC,$BE] 'sicakligi okuOWIn sensor5,0,[temperature.LOWBYTE,temperature.HIGHBYTE]end select;w0=temperature>>4i_=w0.lowbyteif temperature.highbyte.4=1 theni_=0;negatif sicaklik olculmuyorendifif i_>99 then i_=0;sensor takili degilse sicaklik sifirlanirsicaklik[sensor_id]=i_sensor_id=sensor_id+1if sensor_id>4 then sensor_id=0return;**************************************************;**************************************************;;programin sonuend

~ENES~

Programı dosya olarak ekleseniz yardimci olalim aşagiya çekmekten parmagim yoruldu
ALLAH'a teslim olmuş bir insan ! Ne sultan tanir , ne sadrazam !

ugures

 :) çok pardon. hemen ekliyorum. program 16f870 e göre yazılmış. onu seçip compile ettim 20 hata verdi :(

ete

#3
Bu program 16F870 işlemcisine sığmayacak kadar uzun. Ancak 16F877A ya sığabilir.
Hataları düzelttim ve 877A ile derleyince sorunsuz derledi.
İlişiktedir.
Ancak işlemci olarak 877A seçilirse komparatör iptali gerekebilir programa CMCON=7 komutu eklenmelidir.
Ayrıca sigorta aayrlarını aktive etmek de gerekiyor ben etmedim çünki amacım hatasız derlenip derlenmediğini görebilmek idi.
Belki 16F876 veya 16F876A ile de derlenebilir deneyin.

Ete

ugures

 :) hay allah razı olsun çok teşekkür ederim. Çok yabancıyım programlamaya. Hemen devreyi 16f877 ye göre kurayım. Daha içinde kendi tezime göre değişiklikler yapmam lazım. Bakalım nasıl olacak :)

ugures

Sayın ete yolladığınız yazılımı çok değiştirdim oynadım kurcaladım. Baya değişik bir hale soktum :)
Öcelikle ilginize çok teşekkür ederim.
Bir problemim var. Acaba bu konuda yardımcı olabilir misiniz :-[
Problem şu şekilde;
Ekte yolladığım program ve simulasyonlar üzerinden anlatayım konuyu.
1 nolu dosyadaki yazılım ve devre benim kullanmak istediğim ve baya bir uğraşı ile düzenlediğim yazılım ve devre.
2 nolu dosyadaki yazılım ve devre ise içinden bir kısmını alıp 1 deki yazılıma aktarmak istediğim yazılım ve devresi.
1 nolu yazılımda :
CASE 4
lcdout $fe,$C0,"   KARARTMA SAATI   "
lcdout $fe,$94,"   (GUNDE 1 SAAT)   "
IF MENU=1 theN
GOSUB BIP
WHILE MENU=1:WEND
kısım var. menuden bunu seçtikten sonra alt menusu olarak,
2 nolu dosyadaki devrede, çalıştırılınca ekranda görünen
1.satır-"aydınlatma"  ve 2. satır-"00:00-00:59  On" ; 1.satır-"aydınlatma"  ve 2. satır-"01:00-02:59  On" ;1.satır-"aydınlatma" ve 2. satır-"02:00-02:59  On" . . . . vs (yukarı aşağı tuşlarından On -> Off oluyor ve röle 3 ü kapatıyor.)
yazılımın komutlarının konması gerekiyor. Bir türlü yazılımı doğru şekilde 2. dosyadan 1. dosyaya aktaramadım.
Umarım derdimi anlatabilmişimdir :)
Bana bu konuda yardımcı olursanız çok sevinirim  :'(
Birde ben bu projede sht11 yazılımı bulduğum için onu programa uydurdum ve buna bağlı olarak sht11 nem sensörü kullanacaktım. Fiyatlarına baktım çok pahalı geldi. Sht11 yazılımı ile dht11 sensörü kullansam sorun olur mu ki.
Saygılarımla.

ete

Öncelikle yazdıklarından bir anlam çıkartamadım.
İkincisi Ben program aktarmam. Ne lazımsa oturur mantığına uygun olarak yazarım.
Programda bu şekilde yazılır zaten. Bazı satırlardan yararlanabilirsin belki ama onuda ancak bilen yapar.
Kusura bakma kendim için yapmadığım bir şeyi başkası için hiç yapmam. Zaten mantığıma da ters geliyor bu istek.
O kadar şeyi yapan insan bir kaç satır program mı yazamıyor gülerim buna.

SHT sensörü ile DHT sensörü farklı mantıkla çalışır. Birinin okuma protokolü ile diğer okunamaz.

Ete



ugures

Sayın ete haklısın. onu ona uydurmaya çalışmaktansa yazmak kesinlikle daha mantıklı :(
Ama hiç bilmiyorum. sadece program çalışırkenki menülerden anladığım kadarı ile komutları alıp kullanmaya çalışıyorum :(
İlgine alakana çok teşekkür ederim.

Powered by EzPortal