atmega 32 8mhz ile ds18s20 okuma problemi

Başlatan gokhangokcen, 13 Aralık 2010, 12:40:55

gokhangokcen

arkadaşlar merhaba,
atmega32 ile 8mhz de ds18s20 sensörü okumaya çalışıyorum ama bir türlü çalıştıramadım internette ve forumda belki yüzlerce örnek var fakat geneli 18b20 için kullandığım derleyici bascom avr 1.11.90  isis 7.6   birde şöyle bir sıkıntım var devremde 64*128 glcd var isisde at32nin kristal frekansını dahili 8mhz seçip yazılımdanda kristal hızını 8mhz ayarladığım zaman grafik lcd çalışmıyor mecburen yazılımdan 4mhz ayarlayıp isisde 8mhz kristal seçerek çalıştırıyorum ama reelde bu şekilde değil tabiki.Dolayısı ile ds sensörünü simüle edemiyorum.Reelde denemeye çalışıyorum ama bir türlü sensörü okutamadım.Devre olarak bread boarda kurduğum için şemayı ekleyemeyeceğim.Fakat bağlantı olarak şöyle atmeganın a.0 pinine ds18s20 nin dq bacağı bağlı ve 4.7k ile pullup yapılı.
$regfile = "m32def.dat"
$crystal = 4000000
'$baud = 19200
$hwstack = 32
$swstack = 10
$framesize = 20
$lib "glcdKS108.lib"
'$lib "mcsbyte.lbx"
$lib "ds1307clock.lib"
Config Graphlcd = 128 * 64sed , Dataport = Portd , Controlport = Portc , Ce = 2 , Ce2 = 3 , Cd = 5 , Rd = 4 , Reset = 6 , Enable = 7


Setfont Font8x8
'configure the scl and sda pins
Config Sda = Portc.1
Config Scl = Portc.0

'address of ds1307
Const Ds1307w = &HD0                                        ' Addresses of Ds1307 clock
Const Ds1307r = &HD1

Config Clock = User                                         ' this will dim the bytes automatic
Dim Weekday As Byte
Dim X As Byte



Dim Odczyt(2) As Byte , A As Byte , Licznik As Byte , T As Integer , T1 As Single , Napis As String * 5






Config 1wire = Porta.0                                      ' ?? ??? ????? ????????? DS18B20 ? ????????????? ???????? ?? 4,7 ??? ? + ???????



Cls
Waitms 150


Lcdat 2 , 1 , "Gokhan" , 1
Lcdat 3 , 1 , "Gokcen" , 1
 Wait 1


Time$ = "03:00:00"                                          ' to watch the day changing value
Gosub Settime
Date$ = "11-13-02"                                          ' 13 november 2002
Gosub Setdate

Gosub Getdatetime

Cls
Waitms 150



Do

Incr X

If X <= 10 Then
Gosub Saat_goster
End If

If X >= 11 Then
Gosub Derece_goster
End If

If X >= 17 Then X = 0




Loop







'called from ds1307clock.lib
Getdatetime:
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' start address in 1307

  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307r                                          ' send address
  I2crbyte _sec , Ack
  I2crbyte _min , Ack                                       ' MINUTES
  I2crbyte _hour , Ack                                      ' Hours
  I2crbyte Weekday , Ack                                    ' Day of Week
  I2crbyte _day , Ack                                       ' Day of Month
  I2crbyte _month , Ack                                     ' Month of Year
  I2crbyte _year , Nack                                     ' Year
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 4                                                ' starting address in 1307
  I2cwbyte _day                                             ' Send Data to SECONDS
  I2cwbyte _month                                           ' MINUTES
  I2cwbyte _year                                            ' Hours
  I2cstop
Return

Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' starting address in 1307
  I2cwbyte _sec                                             ' Send Data to SECONDS
  I2cwbyte _min                                             ' MINUTES
  I2cwbyte _hour                                            ' Hours
  I2cstop
Return
'''''''''''''''''''''''''''''''''''''''''''''''

Saat_goster:

  Lcdat 2 , 1 , "Tarih: " ; Date$
  Lcdat 5 , 1 , "Saat : " ; Time$
  Waitms 500

Return


Derece_goster:

Cls

 1wreset                                                   'reset
  1wwrite &HCC                                              'jedna kostka, wiêc wykorzystujemy rozkaz SKIP ROM
  1wwrite &H44                                              'dokonaj konwersji
  Waitms 750                                                'przeczekaj czas konwersji
  1wreset                                                   'reset
  1wwrite &HCC                                              'rozkaz adresowy SKIP ROM
  1wwrite &HBE                                              'rozkaz funkcyjny - polecenie odczytu DS18x20
  Odczyt(1) = 1wread(2)                                     'odczytaj dwa pierwsze bajty
  T = Odczyt(2)                                             'przepisz starszy bajt do zmiennej typu Integer
  Shift T , Left , 8                                        'przesuñ ten bajt w lewo na wy¿sze pozycje
  T = T + Odczyt(1)                                         'przepisz - dodaj m³odszy bajt

  T1 = T * 0.0625                                               'wyraŸ w stopniach Celsjusza, wynik wpisz do zmiennej Single
   T1 = T1 / 2
Napis = Fusing(t1 , "#.#")
  Cls
  Lcdat 2 , 2 , Napis ; " " ; Chr(1) ; "C"
  Wait 2

  Cls
Return

'---------------------------Temperature request---------------------------------



$include "font8x8.font"



exra olarak ds1307 donanımı var o gayet düzgün bir şekilde çalışıyor.ekrandaki görüntü;

[IMG]http://img204.imageshack.us/img204/9900/foto705.jpg[/img]

Uploaded with ImageShack.us


iyi çalışmalar iyi günler dilerim..


Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

gokhangokcen

arkadaşlar sorunu sonunda halledebildim ilgilenen ve benim gibi sorun yaşayan arkadaşlara faydalı olacağını düşünerekten yeni ve çalışan kodları ekleyeyim
$regfile = "m32def.dat"
$crystal = 8000000
'$baud = 19200
$hwstack = 32
$swstack = 10
$framesize = 20
$lib "glcdKS108.lib"
'$lib "mcsbyte.lbx"
$lib "ds1307clock.lib"
Config Graphlcd = 128 * 64sed , Dataport = Portd , Controlport = Portc , Ce = 2 , Ce2 = 3 , Cd = 5 , Rd = 4 , Reset = 6 , Enable = 7


Setfont Font8x8
'configure the scl and sda pins
Config Sda = Portc.1
Config Scl = Portc.0

'address of ds1307
Const Ds1307w = &HD0                                        ' Addresses of Ds1307 clock
Const Ds1307r = &HD1

Config Clock = User                                         ' this will dim the bytes automatic
Dim Weekday As Byte
Dim X As Byte




''''


Dim Bd(9) As Byte
Dim I As Byte , Tmp As Byte
Dim Crc As Byte
Dim T As Integer , T1 As Integer
Dim V As Byte
Dim Temph As Integer , Templ As Integer
Dim Ia As String * 4
Dim Wd As Integer

Config 1wire = Porta.0


Declare Sub Read1820
Declare Sub Crcit
Declare Sub Temperature


'Deflcdchar 1 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32
Temph = 0
Templ = 999
Wd = 0




''''





Cls
Waitms 150


Lcdat 2 , 1 , "Gokhan" , 1
Lcdat 3 , 1 , "Gokcen" , 1
 Wait 1


Time$ = "03:00:00"                                          ' to watch the day changing value
Gosub Settime
Date$ = "11-13-02"                                          ' 13 november 2002
Gosub Setdate

Gosub Getdatetime

Cls
Waitms 150

Basla:

Do

Incr X

If X <= 10 Then
Gosub Saat_goster
End If

If X >= 11 Then
Gosub Derece_goster
End If

If X >= 17 Then X = 0




Loop







'called from ds1307clock.lib
Getdatetime:
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' start address in 1307

  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307r                                          ' send address
  I2crbyte _sec , Ack
  I2crbyte _min , Ack                                       ' MINUTES
  I2crbyte _hour , Ack                                      ' Hours
  I2crbyte Weekday , Ack                                    ' Day of Week
  I2crbyte _day , Ack                                       ' Day of Month
  I2crbyte _month , Ack                                     ' Month of Year
  I2crbyte _year , Nack                                     ' Year
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 4                                                ' starting address in 1307
  I2cwbyte _day                                             ' Send Data to SECONDS
  I2cwbyte _month                                           ' MINUTES
  I2cwbyte _year                                            ' Hours
  I2cstop
Return

Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' starting address in 1307
  I2cwbyte _sec                                             ' Send Data to SECONDS
  I2cwbyte _min                                             ' MINUTES
  I2cwbyte _hour                                            ' Hours
  I2cstop
Return
'''''''''''''''''''''''''''''''''''''''''''''''

Saat_goster:

  Lcdat 2 , 1 , "Tarih: " ; Date$
  Lcdat 5 , 1 , "Saat : " ; Time$
  Waitms 500

Return


Derece_goster:

Cls

Temph = 0
Templ = 999
Wd = 0

Cls

Locate 1 , 6 : Lcd Chr(1) ; "C"

Do
Temperature
Waitms 250
Wd = Wd + 1
Select Case Wd
Case 1 To 2 :
Locate 1 , 8
Lcd " "
Case 3 To 4:
Locate 1 , 8
Lcd "*"
Wd = 0
Case Else:
Wd = 0
End Select

Loop
End

Sub Temperature                                             ' actual measuring
1wwrite &HCC : 1wwrite &H44                                 ' start measure
Waitms 300                                                  ' 300                       ' wait for end of conversion
Read1820                                                    ' read 9 bytes
If Err = 1 Then                                             ' if there is no sensor
Locate 1 , 1 : Lcd "-- "                                    ' we put "-- " on LCD
Else
If Crc = 0 Then                                             ' sensor present, check CRC
Locate 1 , 1
Ia = Str(t)
Lcd Left(ia , 2) : Lcd "."
Lcd Mid(ia , 3 , 1)
Else
Locate 1 , 1 : Lcd "** "                                    ' CRC NOT OK, "** " on LCD
End If
End If
End Sub

Sub Read1820                                                ' reads sensor ans calculate
                                                      ' T for 0.1 C
1wreset                                                     ' reset the bus
1wwrite &HCC                                                ' read internal RAM
1wwrite &HBE                                                ' read 9 data bytest
Bd(1) = 1wread(9)                                           ' read bytes in array
1wreset                                                     ' reset the bus
Crcit                                                       ' ckeck CRC
If Crc = 0 Then                                             ' if is OK, calculate for
Tmp = Bd(1) And 1                                           ' 0.1C precision
If Tmp = 1 Then Decr Bd(1)
T = Makeint(bd(1) , Bd(2))
T = T * 50 : T = T - 25 : T1 = Bd(8) - Bd(7) : T1 = T1 * 100
T1 = T1 / Bd(8) : T = T + T1 : T = T / 10
End If
End Sub

Sub Crcit
If Bd(8) = Crc8(bd(1) , 7) Then
Crc = 0
End If
End Sub



$include "font8x8.font"

Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

ilhan_mkp

glcdKS108.lib hocam bu dosya bende yok nereden buluruz

SERRO EFE

kurulduğu klasör içinde lib klasörü olması lazım orada vardır yoksa gönderebilirim

ilhan_mkp

library klasöründekilerin içindkiler   xxxxxx.lbx şeklindler uzantısı lib olması gerekiyor gibi görünüyor gönderirseniz çok iyi olur lcdyi bağladım ışık var birde şu lib hatasını atlatırsam deneyeceğim

SERRO EFE

programda tools altında lib manager var oradan compile etmeniz gerekebilir bi deneyin

ilhan_mkp

üstat lib manecer add ile almıyor lbx uzantılı olduğu için almayıncada compiler olmuyor  :'(

Mucit23

Cahilliğimi Mazur görün.
Cye benzemiyor. Basic de AVR yok. Acaba programlama dili nedir?

SERRO EFE


ilhan_mkp

Alıntı yapılan: Mucit23 - 24 Ekim 2011, 00:02:24
Cahilliğimi Mazur görün.
Cye benzemiyor. Basic de AVR yok. Acaba programlama dili nedir?

üstat bu atmel için basic softwarenin adı bascom
http://www.mcselec.com/index.php?option=com_content&task=category&sectionid=7&id=79&Itemid=57

buda sitesi örnekleri biraz incele istersen


ilhan_mkp

gönderin oradan alayım link falan ugraşmayın bu saatte