Bir Projede Kod Çevrimi

Başlatan tekniker_murat, 15 Şubat 2009, 07:32:17

tekniker_murat

Öncelikle herkese selamun aleyküm ve günaydın...
Daha önceden pic basicde yapılmış çalışan ve çalıştığını da kendimin denediğim bir proje kodu vardı elimde DS18B20 yi okutup ekrana yazdırıyordu 16f628A ile yapılmış kodları şu şekilde :

@ DEVICE pic16F628A
@ DEVICE pic16F628A, WDT_OFF
@ DEVICE pic16F628A, PWRT_OFF
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16f628a , INTRC_OSC_NOCLKOUT
@ DEVICE pic16f628a , MCLR_OFF
cmcon=7
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 1
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 0
DEFINE LCD_BITS 4
DEFINE LCD_LINES 4
pause   500
lcdout  $fe,1,"artvin_li_murat"
lcdout  $fe,$c0,"  @hotmail.com"
pause   2500
lcdout  $fe,1
SYMBOL DQ=PORTA.0
MEM VAR BYTE
ISI VAR WORD
HAM VAR WORD
TA1 VAR WORD
TA2 VAR WORD
TA3 VAR WORD
TA4 VAR WORD
TA5 VAR WORD

PAUSE 200
BASLA:
OWOUT DQ,1,[$CC,$44]
DONGU:
OWIN DQ,4,[ISI]
IF ISI=0 THEN DONGU
OWOUT DQ,1,[$CC,$BE]
OWIN DQ,2,[HAM.LOWBYTE,HAM.HIGHBYTE]

IF HAM.BIT11=0 THEN HESAPLA
IF HAM.BIT11=1 THEN HESAPLA1
GOTO BASLA


HESAPLA:
TA2=HAM.LOWBYTE
TA2=TA2//16
TA2=TA2/2
TA2=TA2*125
ta2=ta2/10

   
TA1=HAM//16
TA1=HAM-TA1
TA1=TA1/16
lcdout  $fe,1," tekniker_murat"
LCDOUT $FE,$C0,"+",#TA1,".",#TA2
LCDOUT $FE,$C5,"C"
GOTO BASLA

HESAPLA1:
TA3=$FFFF-HAM+1
TA4=TA3//16
TA4=TA4/2
TA4=TA4*125
ta4=ta4/10


TA5=TA3//16
TA5=TA3-TA5
TA5=TA5/16
lcdout  $fe,1," tekniker_murat"
LCDOUT $FE,$C0,"-",#TA5,".",#TA4
LCDOUT $FE,$C5,"C"
GOTO BASLA

END

Sonra ben bu kodları aldım proton basicde çalışacak bir şekilde dizayn etmeye çalıştım bu projedeki amacım şöyle olcak;Devrede 1 tane 12F675 bir tanede 18F4550 var bu 12F675 DS18B20 yi okuyacak sonra bu okuduğu kodu GP1 pininden 18f4550 nin RC1 pinine asenkron seri iletişim yolu ile yollayacak bunu alan 18f4550 de ekrana yazdıracak.
12F675 için yazdığım kodlar şunlar yani proton diline çevirmeye çalıştığım yukarıdaki programın son şekli...

Device  12F675
Config  CPD_OFF,CP_OFF,BODEN_OFF,MCLRE_OFF,PWRTE_OFF,WDT_OFF,INTRC_OSC_NOCLKOUT
Include "modedefs.bas"
ANSEL=0
CMCON=7
Symbol gon=GPIO.1
Symbol DQ=GPIO.5
Dim mem As  Byte
Dim isi As  Word
Dim ham As  Word
Dim ta1 As  Word
Dim ta2 As  Word
Dim ta3 As  Word
Dim ta4 As  Word
Dim ta5 As  Word

DelayMS 200
BASLA:
OWrite DQ,1,[$CC,$44]
'OWOUT DQ,1,[$CC,$44]
DONGU:
ORead DQ,4,[isi]
'OWIN DQ,4,[ISI]
If isi=0 Then DONGU
OWrite DQ,1,[$CC,$BE]
ORead DQ,2,[ham.LowByte,ham.HighByte]
'OWOUT DQ,1,[$CC,$BE]
'OWIN DQ,2,[HAM.LOWBYTE,HAM.HIGHBYTE]

If ham.11=0 Then HESAPLA
If ham.11=1 Then HESAPLA1
GoTo BASLA


HESAPLA:
ta2=ham.LowByte
ta2=ta2//16
ta2=ta2/2
ta2=TA2*125
ta2=ta2/10

   
ta1=ham//16
ta1=HAM-TA1
ta1=ta1/16
SerOut  gon,N2400,[#ta1,ta2]
GoTo BASLA

HESAPLA1:
ta3=$FFFF-HAM+1
ta4=ta3//16
ta4=ta4/2
ta4=TA4*125
ta4=ta4/10


ta5=ta3//16
ta5=TA3-TA5
ta5=ta5/16
SerOut  gon,N2400,[#ta5,ta4]
GoTo BASLA

End

Bunlarda 18F4550 için yazdığım kodlar...

Device  18F4550
Include "modedefs.bas"
@CONFIG_REQ
@__CONFIG CONFIG1H, FOSC_HS_1  
@__CONFIG CONFIG2L, PWRT_OFF_2 & VREGEN_OFF_2 & BOR_OFF_2
@__CONFIG CONFIG2H, WDT_OFF_2
@__CONFIG CONFIG3H, MCLRE_OFF_3 & LPT1OSC_OFF_3 & PBADEN_OFF_3 & CCP2MX_OFF_3
@__CONFIG CONFIG4L, STVREN_OFF_4 & LVP_OFF_4 & ICPRT_OFF_4 & XINST_OFF_4 & DEBUG_OFF_4
@__CONFIG CONFIG5L, CP0_OFF_5 & CP1_OFF_5 & CP2_OFF_5 & CP3_OFF_5
@__CONFIG CONFIG5H, CPB_OFF_5 & CPD_OFF_5
@__CONFIG CONFIG6L, WRT0_OFF_6 & WRT1_OFF_6 & WRT2_OFF_6 & WRT3_OFF_6
@__CONFIG CONFIG6H, WRTB_OFF_6 & WRTC_OFF_6 & WRTD_OFF_6
@__CONFIG CONFIG7L, EBTR0_OFF_7 & EBTR1_OFF_7 & EBTR2_OFF_7 & EBTR3_OFF_7
@__CONFIG CONFIG7H, EBTRB_OFF_7
ADCON1=$0F
ALL_DIGITAL TRUE
XTAL 10
Declare LCD_DTPIN PORTB.4
Declare LCD_ENPIN PORTB.3
Declare LCD_RSPIN PORTB.2
Declare LCD_INTERFACE 4
Declare LCD_LINES 4
Symbol  lcd_isik=PORTD.3
Symbol  saat_al=PORTC.0
Symbol  isi_al=PORTC.1
Dim     tam     As  Byte
Dim     onda    As  Byte
Dim     saat    As  Byte
Dim     dakika   As  Byte
Dim     saniye  As  Byte
Dim     gun     As  Byte
Dim     ay      As  Byte
Dim     yil     As  Byte
Low     lcd_isik
Low     saat_al
Low     isi_al
basla:
       GoSub   reklam
       GoSub   isi_oku
       'GoSub   saat_oku
       GoSub   yaz
GoTo    basla
reklam:
       Low     lcd_isik
       DelayMS 100
       High    lcd_isik
       DelayMS 100
       Print   $fe,1
       Print   At  1,1,"ELEKTRONiK TEKNiK ER"
       Print   At  2,1,"MURAT YAGCI"
       Print   At  3,1,"artvin_li_murat@hot-"
       Print   At  4,1,"mail.com"
       DelayMS 2500
       Low     lcd_isik
       DelayMS 100
       High    lcd_isik
       DelayMS 100
       Return
isi_oku:
       SerIn   isi_al,N2400,[tam,onda]
       Return
saat_oku:
       'SerIn   saat_al,N2400,[saat,dakika,saniye,gun,ay,yil]
       Return
yaz:
Print   $fe,1
Print   At  1,1,"isi=","+",#tam,".",#onda
DelayMS 3000
       Return
       GoTo    basla

Sorun ise şu:Pic12F675 DS12B20 yi okuyup 18F4550 ye attığı değeri ben ekranda görüyorum ama saçma sapan değerler.
Sonra ds18b20 yi söküyorum bu defa değer okumaması gerekirken yine daha abuk sabuk değerler okuyo ve ekrana basıyo.
Bu çalışmada yapılan hata acaba nerede pic basic kodlarını protona çevirirken yanlış yapmış olabilirmiyim özellikle şu komutlarda:

OWOUT DQ,1,[$CC,$BE]
OWIN DQ,2,[HAM.LOWBYTE,HAM.HIGHBYTE]

OWrite DQ,1,[$CC,$44]
ORead DQ,4,[isi]

OWrite DQ,1,[$CC,$BE]
ORead DQ,2,[ham.LowByte,ham.HighByte]
'OWOUT DQ,1,[$CC,$BE]
'OWIN DQ,2,[HAM.LOWBYTE,HAM.HIGHBYTE]

bu komutlarda OWOUT ve OWIN komutları picbasic dili için OWrite ile ORead da proton basic komutları
Bu durumda:
OWOUT un yaptığı işi OWrite
OWIN in yaptığı işi de ORead yapıyo olarak değerlendirdim bu değerlendirme yanlış mı tam tersi mi olcak bu konuda yardımcı olursanız çok memnun olurum...
[email]murat.yagci.1984@gmail.com[/email]

Maxim

neden zaten proton+ kodu varken ,picbasicten protona çevirelimki ?

DS18B20 ile bende deneme yapmıştım ,
ama şimdi bulamadım çalışmayı diskte .


şöyle birkaç proton kodu var ,
en azından örnek olur

' 1-wire temperature DS18B20
Symbol DQ = PORTD.7

Dim dum As Word
Dim Temp As Word ' On board temperature
Dim sTemp As Bit ' sign of the temperature


'-----------------------------------------------------------------
' ONLY WITH DS18B20 THERMOMETER 
' Set thermometer resolution mode (9..12 bits)
OWrite DQ, 1, [$CC, $4E, $7F, $80, %00111111]
' TH TL Config
' Config = %01111111 : 12 bits / 750 ms 
' %01011111 : 11 bits / 325 ms
' %00111111 : 10 bits / 187.5 ms
' %00011111 : 9 bits / 93.75 ms 
'-----------------------------------------------------------------

Gosub Read_Temp
...
...
...

End



'---------------------------------------------------------------- 
' Read the temperature from the DS18B20
'---------------------------------------------------------------- 
Read_Temp:
Dim k As Byte
OWrite DQ, 1, [$CC, $44] ' Send Calculate Temperature command 
Repeat 
DelayMS 1 ' Wait until conversion is complete 
ORead DQ, 4, [k] ' Keep reading low pulses until
Until k <> 0 ' the DS1820 is finished.
OWrite DQ, 1, [$CC, $BE] ' Send Read ScratchPad command
ORead DQ, 2,[dum.LowByte,dum.HighByte]
' Calculate the temperature in degrees Centigrade
sTemp = dum.11
If sTemp = 0 Then
Temp = dum * 625 ' positive temp
Else
Temp = (~dum+1) * 625 ' negative temp
EndIf
dum = Div32 1000 ' temp in 0.1 deg C
Return dum


başka bir tane

DIM Raw_Temp AS Word
DIM DS18b20_temp AS Float

Get_ds18b20_temp:

OWRITE DQ, 1, [$CC,$44] 'Send calculate temperature command
REPEAT
DELAYMS 25 'Waiting loop until reading complete
OREAD DQ, 4, [C] 'Monitor for pin high transition ... 
UNTIL C <> 0 'Reading complete
OWRITE DQ, 1, [$CC, $BE] 'Send read scratchpad command
OREAD DQ, 2, [Raw_Temp.LOWBYTE,Raw_Temp.HIGHBYTE] 

Sign = Raw_Temp.15
if Sign = 0 then
Raw_Temp = ABS(Raw_Temp) >> 4 ;convert for positive value, 
DS18b20_temp = Raw_Temp * 0.0625 ;12bit res.
ENDIF 

if Sign = 1 then 
Raw_Temp = ~Raw_Temp + 1 ;convert for negative value
DS18b20_temp = Raw_Temp * 0.0625 ;12bit res.
DS18b20_temp = -DS18b20_temp 
ENDIF

Print AT 1,1,DEC Sign," ", DEC DS18b20_temp
;PRINT AT 2,1,
return



yanlış hatırlamıyorsam ,
bir ayak 4k7 direnç ile pull-up yapılıyordu .

birde şöyle bir yol izlenmeli ,
önce ds18b20 kodu tam sorunsuz çalıştırılmalı ,
sonra seri haberleşme ,
sonra ekrana verme kodu .

Maxim

16F628A
bu kod çalışıyor .


Device 16F628A
XTAL 4

ALL_DIGITAL = TRUE
CMCON=7

TRISA=%11111111
TRISB=%00000001

Symbol Gon=PORTB.2 
Symbol DQ=PORTB.0 

Dim ham As Word 
Dim ta1 As Word 
Dim ta2 As Word 
Dim ta3 As Word 
Dim ta4 As Word 
Dim ta5 As Word 

DelayMS 200
 
BASLA: 
OWrite DQ, 1, [$CC, $44]
While ORead DQ, 4 = 0 : Wend
OWrite DQ, 1, [$CC, $BE]
ORead DQ, 0, [ham.LowByte,ham.HighByte]

If ham.11=0 Then HESAPLA 
If ham.11=1 Then HESAPLA1 
GoTo BASLA 

HESAPLA: 
ta2=ham.LowByte 
ta2=ta2//16 
ta2=ta2/2 
ta2=TA2*125 
ta2=ta2/10 

ta1=ham//16 
ta1=HAM-TA1 
ta1=ta1/16 
SerOut Gon,396,[Dec ta1,Dec ta2] 
GoTo BASLA 


HESAPLA1: 
ta3=$FFFF-HAM+1 
ta4=ta3//16 
ta4=ta4/2 
ta4=TA4*125 
ta4=ta4/10 

ta5=ta3//16 
ta5=TA3-TA5 
ta5=ta5/16 
SerOut Gon,396,[Dec ta5,Dec ta4] 
GoTo BASLA

tekniker_murat

Arkadaşlar benim yukarıda verdiğim pic basic dilindeki komutlarda çalışıyor sorunumuz bu ısı değerini 12f675 entegresinden asenkron seri iletişim ile pic18f4550 ye aktarabilmek soruyu dikkatli okursanız orada iki şeyi belirtmek istedim sensör takılı değilse bile bir bilgiyi alıyor ve derece olarak 18f4550 ye gönderiyor en çokta burada tökezledim ama verdiğiniz bilgileriniz ve paylaşımlarınız için sizlere sonsuz şükranlarımı sunuyorum teşekkürler arkadaşlar....
[email]murat.yagci.1984@gmail.com[/email]