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 degiskenleri
temperature Var Word ' Temperature storage
count_remain Var Byte ' Count remaining
count_per_c Var Byte ' Count per degree C
sensor_id var byte
sensor1 var porta.0
sensor2 var porta.1
sensor3 var porta.2
sensor4 var porta.3
sensor5 var porta.5
sicaklik var byte[5]


pompa_girisi var portc.7


;shift register s_serial io bus pinout
PLC_DO VAR PORTc.1
PLC_CLK VAR PORTc.3
PLC_PS VAR PORTc.0
PLC_QE VAR PORTc.2
OUT_Data var byte

Buton_girisi var PORTb.1
;
;
;
;saat degiskenleri
msaniye var byte
saniye var byte
dakika var byte
saat var byte
gun var byte
ay var byte
yil var word
zaman var byte[8]

;cpu pinleri
DPIN var portc.4
CPIN    var portc.5
SDA var portc.4
SCL     var portc.5



EEPROM 0,[0,1];oku/yaz 1.000.000 kez
Include "modedefs.bas"
;*********************************************
BEGIN:
GOTO RESET_VECTOR
;
;
;
;*********************************************

;INTERRUPT YONETICISI
'Define interrupt handler
define INTHAND MYINT_VECTOR
ASM
MYINT_VECTOR
BCF INTCON,GIE
BTFSC INTCON,GIE
GOTO MYINT_VECTOR
;
movwf wsave
swapf  STATUS, W
clrf   STATUS
movwf   ssave
movf  PCLATH, W
movwf psave
;Save and restore
ENDASM
;TIMER0 INTERRUPT
IF INTCON.2=1 THEN
INTCON.2=0'Clear interrupt flag
GOTO INT0ALG
INT0ALG_RETURN:
tmr0=0
;GOTO INT_SEL_END
ENDIF

INT_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 DONGUSU
WAIT_LOOP:
ASM
NOP
NOP
NOP
CLRWDT
BTFSS INTCON,7
BSF INTCON,7
NOP
NOP
NOP
ENDASM

GOTO 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 SIFIRLANIR
CLEAR
out_data=0
high PLC_QE
;ENERJI HATLARINDAKI PARAZITIK ETKI ICIN ACILIS GECIKMESI
PAUSE 1000

OPTION_REG=%00000001'7.Enable PORTB pullups 2-0 prescalar
ADCON1=%00000110
Gosub Saat_Oku
;acilis mesaji
LCDOUT $FE, 1 'Clear display
;lcdout "Start"
pause 250

Menu_ID=0 ;ana ekran
lcd_tazele=1

;HSEROUT ["P2511: ocak 2006",10,13]

;5 sicaklik sensoru de okunur
for temp0=0 to 4
call sicaklik_sensorlerini_oku
next

INTCON=%00100000 'Enable INTE interrupt
GOTO 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
endif

END SELECT
SOFT_INT=SOFT_INT+1
IF SOFT_INT>4 THEN SOFT_INT=0

GOTO 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
endif
endif
    if menu_id=2 then
if keyb_data=2 then
dakika=dakika+1
endif
if keyb_data=4 then
dakika=dakika-1
endif

endif
    if menu_id=3 then
if keyb_data=2 then
gun=gun+1
endif
if keyb_data=4 then
gun=gun-1
endif

endif
    if menu_id=4 then
if keyb_data=2 then
ay=ay+1
endif
if keyb_data=4 then
ay=ay-1
endif

endif
    if menu_id=5 then
if keyb_data=2 then
yil=yil+1
endif
if keyb_data=4 then
yil=yil-1
endif

endif

    if menu_id>0 and menu_id<6 then
call saat_yaz
endif

    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,temp0
endif
    ;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,temp0
endif
    ;***** tus islemleri
    new_key=1
    LCD_Tazele=1
endif

    return

    lcd_bosluk_yaz:
for i_=0 to 15
lcdout " "
next i_
return
;
    lcd_goto_line1:
lcdout $FE,2
return
;
    lcd_goto_line2:
lcdout $FE,$C0
return
    print_sol_parantez:
lcdout "["
return
    print_sag_parantez:
lcdout "]"
return

;*****************************************
;
;*****************************************
LCD_Mesaj_Tazele:
call lcd_goto_line1;
lcdout $FE, 2
call lcd_bosluk_yaz;
lcdout"                "
call lcd_goto_line2;
lcdout $FE, $C0
call 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 then
lcdout "Saat?"
call lcd_goto_line2;lcd 2.satir'a gec
lcdout " ",dec2 saat, ":",dec2 dakika
endif
if 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_parantez
endif
if 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_line2
lcdout " ",dec2 gun,"/",dec2 ay,"/",dec4 yil
endif
if 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_parantez
endif

if 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=0
return
;**************************************************
;
;
;**************************************************
BCDTOBIN:
;
input temp0
output temp1
temp1=((temp0>>4)*10)+(temp0&$0f)
return
BINTOBCD:
;
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 bilgileri
for i_=2 to 6
I2CREAD DPIN,CPIN,RTC_Adr,i_,[temp0]
call bcdtobin
zaman[i_]=temp1
next 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 icin
zaman[2]=saniye
zaman[3]=dakika
zaman[4]=saat
zaman[5]=gun
zaman[6]=ay
for 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 konrolu
OTOMASYON:
;sicaklik kontrolu
Out_data=0

READ 9,temp0 ;sicaklik set degeri
;ayarlanan sicakligin 1 derece alti
asm
decf_TEMP0,1
endasm

    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 kontrolu
temp1=saat+17
read 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 kullanilmistir
sicaklik_sensorlerini_oku:
select case sensor_id
case 0
;
OWOut sensor1,1,[$CC,$44] 'Start  if count_remain=0 then
sensor1_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] 'Start
sensor2_oku_dongu:
OWIn sensor2,4,[count_remain] 'Check still busy
if count_remain=0 then sensor2_oku_dongu:
'okuma yapilir
OWOut sensor2,1,[$CC,$BE] 'sicakligi oku
OWIn sensor2,0,[temperature.LOWBYTE,temperature.HIGHBYTE]
;
case 2
;
OWOut sensor3,1,[$CC,$44] 'Start
Sensor3_oku_dongu:
OWIn sensor3,4,[count_remain] 'Check still busy
if count_remain=0 then sensor3_oku_dongu:
'okuma yapılır
OWOut sensor3,1,[$CC,$BE] 'sicakligi oku
OWIn sensor3,0,[temperature.LOWBYTE,temperature.HIGHBYTE]
;
case 3
;
OWOut sensor4,1,[$CC,$44] 'Start
Sensor4_oku_dongu:
OWIn sensor4,4,[count_remain] 'Check still busy
if count_remain=0 then sensor4_oku_dongu:
'okuma yapilir
OWOut sensor4,1,[$CC,$BE] 'sicakligi oku
OWIn sensor4,0,[temperature.LOWBYTE,temperature.HIGHBYTE]
;
case 4
;
OWOut sensor5,1,[$CC,$44] 'Start
Sensor5_oku_dongu:
OWIn sensor5,4,[count_remain] 'Check still busy
if count_remain=0 then sensor5_oku_dongu:
'okuma yapılır
OWOut sensor5,1,[$CC,$BE] 'sicakligi oku
OWIn sensor5,0,[temperature.LOWBYTE,temperature.HIGHBYTE]
end select
;
w0=temperature>>4
i_=w0.lowbyte

if temperature.highbyte.4=1 then
i_=0;negatif sicaklik olculmuyor
endif
if i_>99 then i_=0
;sensor takili degilse sicaklik sifirlanir

sicaklik[sensor_id]=i_
sensor_id=sensor_id+1
if sensor_id>4 then sensor_id=0
return
;**************************************************
;**************************************************
;
;programin sonu
end


~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