Forum: Mikrocontroller und Digitale Elektronik Ds18b20 wird von ATMega328P nicht erkannt


von Led35 (Gast)


Lesenswert?

Hallo Progger und Proggerinnen,

ich bin 16 Jahre und versuche seit 2 Tagen einen Ds18b20 in gang zu 
bekommen.
Ich habe ihn mit Arduino getestet auf Funktionstüchtigkeit, dabei kam 
ein positives Ergebnis.

Jetzt möchte ich diesen Sensor aber über Bascom auslesen lassen, hierbei 
benutze ich einen ATMega328P mit einem internen Quarz von 8 MHz der 
nochmal durch 8 dividiert wird (siehe Standart Fusebits).

Dies habe ich auch im Programm durch $crystal = 1000000 angegeben.
Des Weiteren betreibe ich den Ds18b20 nicht im parasitären Modus, d.h. 
ich habe GND an GNDe und 5V an 5V, sowie DQ an PORTD.1 (zwischen 5V und 
DQ Pullup von 4k7 Ohm (gemessen 3,6 kOhm)).

Ich habe von dieser Website 
http://rn-wissen.de/wiki/index.php?title=Bascom_und_1-Wire das Programm 
SerienNr aller Geräte verwendet um zu kontrollieren ob der Ds18b20 
erkannt wird, diesmal mit einem negativen Ergebnis. Die Pint-Befehle 
habe ich durch lcd-Befehle ausgetauscht.

Nun stehe ich vor einem Rätsel warum der Ds18b20 nicht ausgelesen wird.
Ich hoffe ihr könnt mir helfen und wenn möglich noch erklären woran es 
lag.

Ich progge erst seit rund einem viertel Jahr Mikrocontroller, deshalb 
bitte ich um Nachsicht wenn ich mich etwas dumm anstelle.

PS: Danke für die Hilfe

von grundschüler (Gast)


Lesenswert?

Led35 schrieb:
> Jetzt möchte ich diesen Sensor aber über Bascom auslesen lassen, hierbei
> benutze ich einen ATMega328P mit einem internen Quarz von 8 MHz der
> nochmal durch 8 dividiert wird (siehe Standart Fusebits).

Standard-Bascom_Problem: Der code ist so lamgsam, dass der ds1820 mit 
1Mhz nicht funktioniert.

von Led35 (Gast)


Lesenswert?

Das heißt für mich jetzt was ?
Muss ich den Clock speed höher setzten und das Fusebit ändern ?

von Falk B. (falk)


Lesenswert?

JA!

von Led35 (Gast)


Lesenswert?

Ok Danke für eure Hilfe, auf wie viel muss der denn etwa ?

von S. Landolt (Gast)


Lesenswert?

Wäre ein Umschalten des CLKPR nicht sicherer für einen Anfänger, da gibt 
es doch sicher etwas in Bascom, oder?

von Daniel (Gast)


Lesenswert?

Bin doch einfach den Teiler raus und lass ihn auf 8 MHz laufen.

von Led35 (Gast)


Lesenswert?

Danke für die vielen Antworten ich werde es gleich ausprobieren

von Buhu (Gast)


Lesenswert?

Zeig erst mal das ganze Programm.

von Led35 (Gast)


Lesenswert?

Das ist mein Programm:

$regfile = "m328pdef.dat"
$crystal = 1000000

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , _
   Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Cursor Off
Cls

Config 1wire = Portd.1

Dim Ar(8) As Byte       ' Array für SerienNr.
Dim I As Byte
Dim W As Word

Locate 1 , 1
Lcd "1-Wire"

Wait 1

Ar(1) = 1wsearchfirst()                            ' 8 Bytes lesen, 
beschreibt Ar(1) bis Ar(8)

' gibts überhaupt ein Gerät
If Err = 0 Then

    Do
        ' Ausgabe der SerienNr.
        For I = 1 To 8
            Locate 1 , 1
            Lcd Hex(ar(i));
            Wait 4
        Next


        ' Nach weiterem Gerät suchen
        Ar(1) = 1wsearchnext()                   '  Seriennummer vom 
ächste Sensor, beschreibt Ar(1) bis Ar(8)

    Loop Until Err = 1                       ' solange bis sich kein 
weiteres Gerät mehr meldet.

End If

Cls
Locate 1 , 1
Lcd "Fertig"

W = 1wirecount()                                ' Anzahl der gefundenen 
Geräte zählen

Wait 2

Cls
Locate 1 , 1
Lcd "Anzahl ";
Lcd W

Do
Loop

End

PS:
Kommentare bitte ignorieren

von Alex D. (allu)


Lesenswert?

Led35 schrieb:
> Jetzt möchte ich diesen Sensor aber über Bascom auslesen lassen, hierbei
> benutze ich einen ATMega328P

Für einen einzigen DS18B20 am Bus möchte ich folgendes vorschlagen (ist 
aus einem meiner Programme herauskopiert, allerdings in dieser Form 
nicht getestet, also Vorsicht:

- Temperaturmessung starten mit: Gosub Temperatur_messen
- ca 2 sekunden warten
- DS18B20 auslesen mit: Gosub Temperatur_wert_holen
- Inhalt von Text_temperatur auf das LCD schreiben
- 30 Sekunden warten, usw.




'********************************************************************
'*****        Temperaturmessung im Gerät durchführen            *****

' Befehlsliste
Const Read_rom = &H33
Const Skip_rom = &HCC
Const Read_ram = &HBE
Const Convertt = &H44
Const Ds18s20 = &H10
Const Ds18b20 = &H28

' Ergebnisse:

' Für LCD-Display in 1/10-Grad, Dezimalpunkt immer gleiche Stelle
Dim Text_temperatur As String * 8
' Temperatur als Integerzahl
dim Temperatur_int as integer

Dim Array_1wire(10) As Byte
Dim Temperatur As Integer At Array_1wire(2) Overlay


' Zahlen-Formatierung
Dim T_vorzeichen As String * 1
Dim T_einer As String * 2
Dim T_punkt As String * 1
Dim T_zehntel As String * 1
Dim Merker_a As Integer
Dim Merker_b As Integer

'
'----------------------------------------------------------------------- 
-
'  Temperaturmessung starten

Temperatur_messen:

   Disable Interrupts                   '###
      1wreset                           ' Sensor wecken
      1wwrite Skip_rom                  ' Command Skip ROM
      1wwrite Convertt                  ' Messung starten
   Enable Interrupts                    '###

Return

'----------------------------------------------------------------------- 
-
'  Temperaturwert holen

Temperatur_wert_holen:

   Disable Interrupts                   '###
      1wreset                           ' Sensor wecken
      1wwrite Skip_rom                  ' Command Skip ROM
      1wwrite Read_ram                  ' Sensor abfragen
      Array_1wire(2) = 1wread(9 )
   Enable Interrupts                    '###

'----------------------------------------------------------------------- 
-
'  Temperaturwert berechnen

'     1Wire-CRC überprüfen
   If Array_1wire(10) = Crc8(array_1wire(2) , 8) Then

'     Temperatur in zehntel-Grad-Schritte umrechnen und runden
      Temperatur = Temperatur * 10
      Temperatur = Temperatur + 8
      Shift Temperatur , Right , 4      'geteilt durch 16

      Temperatur_int = Temperatur

'     String für LCD-Anzeigefeld aufbauen
      If Temperatur < 0 Then
         T_vorzeichen = "-"
         Elseif Temperatur = 0 Then
         T_vorzeichen = " "
      Else
         T_vorzeichen = "+"
      End If

      Merker_a = Temperatur / 10
      Merker_b = Merker_a * 10
      Merker_b = Temperatur - Merker_b
      Merker_a = Abs(merker_a)
      Merker_b = Abs(merker_b)

      T_einer = Str(merker_a)
      T_einer = "  " + T_einer
      T_einer = Right(t_einer , 2)
      T_punkt = "."
      T_zehntel = Str(merker_b)
      Text_temperatur = T_einer + T_punkt + T_zehntel

   Else
      Text_temperatur = "-ERROR"

   End If                               'If Wire-CRC überprüfen
Return



1Mhz erscheint mir allerdings auch knapp, einfach den Vorteiler durch 8 
herausnehmen.

: Bearbeitet durch User
von Led35 (Gast)


Lesenswert?

Wirklich vielen dank für die Ratschläge und die Tipps und das Programm 
ich werde es nachher testen.

von Led35 (Gast)


Lesenswert?

Danke seit heute wurde er erkannt !!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.