Micro code studio yardım!

mehmetcfb

Üye
Katılım
24 Tem 2009
Mesajlar
9
Puanları
1
Yaş
44
Arkadaşlar merhaba,

Ds18B20 den aldığım sıcaklığı pic16f84 ile set ettğim sıcaklık ile karşılaştırıp portb.0 üzerinden role çektirerek fanları çalıştırıyorum .Altta bütün kodları vereceğim sorum şu programdaki karşılaştırma etiketi bu :

karsilastirma
temp=temp/8
if temp >= set then
portb.0 = 1
else
portb.0 = 0
Burda " if temp >= set then " koşulu sağlandığında portb.0 ' ın 2 dakika yada 1 dakika gibi bir süre portb.0=1 olarak kalmasını ve sonra döngüye devam etmesini istiyorum. yada yine " if temp >= set then " koşulu sağlandığında ortam sıcaklığı set ettiğim sıcaklığın 2 derece altına düşene kadar portb.0 = 1 olarak kalmasını isiyorum.
Bütün program :

' Picbasic Pro program to read DS1820 1-wire temperature sensor
' and display temperature on LCD

' Allocate variables
command var byte ' Storage for command
i2 var byte ' Storage for loop counter
temp var word ' Storage for temperature
ayar var word ' Storage for temperature
set var word ' Storage for temperature
DQ var PORTB.4 ' Alias DS1820 data pin
DQ_DIR var TRISB.4 ' Alias DS1820 data direction pin
output portb.0
'output portb.1
'output portb.2

Pause 500 ' Wait for LCD to start
LCDOUT $fe,1,"MEHMET OZLAV"
LCDOUT $FE, $C0, "DIJITAL TERMO"
Pause 1000 ' Wait for LCD to start
LCDOUT $fe,1,"ORTAM SICAKLIGI"
LCDOUT $FE, $C0,"OKUNUYOR"
PAUSE 1000
c var byte
c = 0
while c =< 22
Lcdout $fe, $80 + c , "."
Lcdout $fe, $7f + c , "."
Lcdout $fe, $7e + c , "."
Lcdout $fe, $7d + c , "."
Lcdout $fe, $7c + c , "."
Lcdout $fe, $7b + c , "."
Lcdout $fe, $7a + c , "."
Lcdout $fe, $79 + c , "."
Pause 50

Lcdout $fe,1
c = c + 1
wend

mainloop:

read 10,ayar
set=ayar
if portb.7=0 and portb.6=0 then
gosub ayarlama
else
gosub okuma
endif

ayarlama:

if portb.7 = 0 then 'DERECE ARTTIR
ayar = ayar + 1
pause 100
endif

if portb.6 = 0 then 'DERECE AZALT
ayar = ayar - 1
pause 100
endif

' Display the decimal temperature
Lcdout $fe, 1, "Set:",dec (set >> 1 ), ".", dec (set.0 * 5),223,"C"
lcdout $fe,$c0,"Ayar:",dec (ayar >> 1 ), ".", dec (ayar.0 * 5),223,"C"
pause 100
if portb.5 = 0 then 'DERECE SET
set = ayar
WRITE 10,set

Lcdout $fe, 1, "Set: ",dec (set >> 1 ), ".", dec (set.0 * 5),223,"C"
lcdout $fe,$c0,"Ayarlandi..."

pause 1000
else
gosub ayarlama
endif

'------------------------------------------------------------------------------
okuma:
read 10,set
Gosub init1820 ' Init the DS1820

command = $cc ' Issue Skip ROM command
Gosub write1820

command = $44 ' Start temperature conversion
Gosub write1820

'LCDOUT $FE, $C0, "Termometre"

Pause 1500 ' Wait 2 seconds for conversion to complete

Gosub init1820 ' Do another init

command = $cc ' Issue Skip ROM command
Gosub write1820

command = $be ' Read the temperature
Gosub write1820
Gosub read1820
' karsilastirma
temp=temp/8
if temp >= set then
portb.0 = 1
else
portb.0 = 0
endif

' Display the decimal temperature
Lcdout $fe, 1,"Ortam:", dec (temp >> 1 ), ".", dec (temp.0 * 5),223,"C"
Lcdout $fe, $C0, "Set: ",dec (set >> 1 ), ".", dec (set.0 * 5),223,"C"
Goto mainloop ' Do it forever


' Initialize DS1820 and check for presence
init1820:
Low DQ ' Set the data pin low to init
Pauseus 500 ' Wait > 480us
DQ_DIR = 1 ' Release data pin (set to input for high)

Pauseus 100 ' Wait > 60us
If DQ = 1 Then
Lcdout $fe, 1, "HAZIR DEGIL"
'LCDOUT $FE, $C0, "Mehmet OZLAV"
Pause 500
Goto mainloop ' Try again
Endif
Pauseus 400 ' Wait for end of presence pulse
Return


' Write "command" byte to the DS1820
write1820:
For i2 = 1 to 8 ' 8 bits to a byte
If command.0 = 0 Then
Gosub write0 ' Write a 0 bit
Else
Gosub write1 ' Write a 1 bit
Endif
command = command >> 1 ' Shift to next bit
Next i2
Return

' Write a 0 bit to the DS1820
write0:
Low DQ
Pauseus 60 ' Low for > 60us for 0
DQ_DIR = 1 ' Release data pin (set to input for high)
Return

' Write a 1 bit to the DS1820
write1:
Low DQ ' Low for < 15us for 1
@ nop ' Delay 1us at 4MHz
DQ_DIR = 1 ' Release data pin (set to input for high)
Pauseus 60 ' Use up rest of time slot
Return


' Read temperature from the DS1820
read1820:
For i2 = 1 to 16 ' 16 bits to a word
temp = temp >> 1 ' Shift down bits
Gosub readbit ' Get the bit to the top of temp
Next i2
Return

' Read a bit from the DS1820
readbit:
temp.15 = 1 ' Preset read bit to 1
Low DQ ' Start the time slot
@ nop ' Delay 1us at 4MHz
DQ_DIR = 1 ' Release data pin (set to input for high)
If DQ = 0 Then
temp.15 = 0 ' Set bit to 0
Endif
Pauseus 60 ' Wait out rest of time slot
Return

End

Yardımlarınızı bekliyorum . şimdiden sağolun.

Arkadaşlar cevaplarınızı bekliyorum :)
 
Moderatör tarafında düzenlendi:
koşul sağlandığında PAUSE komutuyla bekleme yapabilirsin. "PAUSE XXX" şeklinde kullanılıyor. PAUSE nin yanına yazdığın sayı mikrosaniye cinsinden bekleme süresini ifade ediyor. Bu şekilde bekleme yapabilirsin 1-2 dakika..

Ör: PAUSE 500

fakat kötü yanı şu.. bu bekleme süresinde mikroişlemci programı okumadığı için bu sürede veri girişi olmaz. yani sıcaklık "aniden değişse" buna tepki vermez..
 
pato53 arkadaşım benimde aklıma geldi ama şimdi 150 000 000 mikrosaniye = 2,5 dakika yapıyor ben PAUSE 150000000 yazdığımda " WARNING Line 105: 100000000 Numeric overflow, value truncated. (DS1820-1.pbp) " diye bir hata veriyor sanırım bu PAUSE komutunu bir sınırı var ?
 
evet PAUSE komutunun bir sınırı vardır illaki..

o zaman bi döngü yapıp içine pause komutunu yazıp bi numara yapabiliriz belki :)

mesela bir for döngüsü olur... 10000 tekrar yapar.. içinde pause komutları olur..
 

Yeni mesajlar

Forum istatistikleri

Konular
128,190
Mesajlar
915,724
Kullanıcılar
449,960
Son üye
katzeimar

Yeni konular

Çevrimiçi üyeler

Geri
Üst