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
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.
Das heißt für mich jetzt was ? Muss ich den Clock speed höher setzten und das Fusebit ändern ?
Ok Danke für eure Hilfe, auf wie viel muss der denn etwa ?
Wäre ein Umschalten des CLKPR nicht sicherer für einen Anfänger, da gibt es doch sicher etwas in Bascom, oder?
Bin doch einfach den Teiler raus und lass ihn auf 8 MHz laufen.
Danke für die vielen Antworten ich werde es gleich ausprobieren
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
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
Wirklich vielen dank für die Ratschläge und die Tipps und das Programm ich werde es nachher testen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.