Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > > > <basic>// Beispielprogramm um den DS18S20 Temperatur Sensor von Dallas Maxim zu lesen > > > // mit Berechnung der CRC Prüfsumme - bei Fehler extra Zeile > > > char Text[40]; > > > int ret,Heiz,i,Secure; > > > int temp, Heiztemp; > > > byte rom_code[8]; > > > byte scratch_pad[9]; //'9ehemals > > > byte Serienschutz[8]; > > > char Fehler; > > > byte CRC_Wert; > > > #define One_Wire_Port 35 //'e3, hier das Port für den Sensor > > > > > > > > > > > > > > > void main(void) > > > { > > > do > > > { > > > ret = OneWire_Reset(One_Wire_Port); > > > if (ret == 0) > > > { > > > Text= "Kein Sensor gefunden"; > > > Msg_WriteText(Text); > > > goto Ende; > > > } > > > // Ändern der Konfiguration (Default 12 Bit) nun 9 Bit > > > // OneWire_Write(0xcc) ' ROM überspringen Kommando > > > OneWire_Write(0x4e); // Master issues Write Scratchpad command > > > OneWire_Write(0x7F); // Master sends three data bytes to scratchpad ..TH > > > OneWire_Write(0xFF); // sicherheitshalber niedrigste Temp in Tl .....TL > > > // OneWire_Write(0b00011111) // für 9 Bit und config Bitanzahl ..9-12 > > > // OneWire_Write(0b00111111) // für 10 Bit > > > // OneWire_Write(0b01011111) // für 11 Bit > > > OneWire_Write(0b01111111); // für 12 Bit > > > ret = OneWire_Reset(One_Wire_Port); // #define One_Wire_Po > > > if (ret == 0) > > > { > > > Text= "Kein Sensor gefunden"; > > > Msg_WriteText(Text); > > > goto Ende; > > > } > > > OneWire_Write(0xcc); //' ROM überspringen Kommando > > > OneWire_Write(0x44); //' starte Temperatur Messung Kommando > > > > > > AbsDelay(1000); > > > > > > OneWire_Reset(One_Wire_Port); // ' PortA.7 > > > OneWire_Write(0xcc); //' ROM überspringen Kommando > > > OneWire_Write(0xbe); //' lese scratch_pad Kommando > > > for (i=0; i<9; i++) //' komplettes scratchpad lesen > > > { > > > scratch_pad[i]= OneWire_Read(); > > > Msg_WriteText(" " ); > > > Msg_WriteWord(i ); > > > Msg_WriteText(":=" ); > > > Msg_WriteHex(scratch_pad[i]); > > > } > > > //'SCRATCHPAD (Power-up State) > > > //'byte 0 Temperature LSB (50h) > > > //'byte 1 Temperature MSB (05h) EEPROM > > > //'byte 2 TH Register or User Byte 1* TH Register or User Byte 1 > > > //'byte 3 TL Register or User Byte 2* TL Register or User Byte 2 > > > //'byte 4 Configuration Register* Configuration Register > > > //'byte 5 Reserved (FFh) > > > //'byte 6 Reserved (0Ch) > > > //'byte 7 Reserved (10h) > > > //'byte 8 CRC* > > > Msg_WriteText(" crc=" ); > > > CRC_Wert=CRC_8(); > > > Msg_WriteHex(CRC_Wert); //Berechnete CRC ausgeben > > > Fehler = CRC_Wert - scratch_pad[8]; > > > if (Fehler == 0) Msg_WriteText(" ok" ); > > > else > > > { > > > Msg_WriteChar(13); > > > Msg_WriteText(" Fehler=" ); > > > Msg_WriteInt(Fehler); > > > } > > > Msg_WriteChar(13); > > > Text = "Temperatur: "; > > > Msg_WriteText(Text); > > > temp = scratch_pad[1] * 256 + scratch_pad[0]; > > > Msg_WriteFloat(temp /16.0); //'hier das Komma wichtig .. für 12Bit > > > //'mit DS1822 > > > Msg_WriteChar(99); > > > Msg_WriteText(" Dez=" ); > > > Msg_WriteWord(scratch_pad[0] ); > > > Msg_WriteChar(13); > > > > > > } > > > while(1); > > > > > > Ende: // Label Ende > > > > > > } > > > > > > > > > > > > byte CRC_8(void) > > > { > > > int Schleifen_count; > > > byte Pruf_Byte, CRC, Bit_Count, Wert_Bit; > > > CRC = 0; > > > for (Schleifen_count = 0; Schleifen_count < 8; Schleifen_count++) > > > { // die 8 Byte werden berechnet (0-7) > > > Bit_Count = 8; > > > Pruf_Byte = scratch_pad[Schleifen_count]; > > > do > > > { // jedes Bit wird extra hinzuberechnet > > > Wert_Bit = (CRC ^ Pruf_Byte) & 0x01; > > > if ( Wert_Bit == 0x01 ) CRC = CRC ^ 0X18; // 0X18= X^8+X^5+X^4+X^0 > > > CRC = 0x7F & (CRC >> 1); > > > if ( Wert_Bit == 0x01 ) CRC = CRC | 0x80; > > > Bit_Count--; > > > Pruf_Byte = Pruf_Byte >> 1; > > > } while (Bit_Count > 0); > > > } > > > return CRC; > > > }</basic> > > > > Hallo, > > > > ich hatte auch erst diese Variante realisiert. Sie braucht nur sehr viel Rechenzeit. > > Ich habe mich dann für die Tabellenversion entschieden. > > Da ich die Tabelle mit 'flash' abgelegt habe, benötigt sie auch kein Ram. > > > > Grüße Joerg > Hallo Joerg! > Die Rechenzeit stört mich auch, habe 13ms gemessen das ist enorm. > > Ich habe auch Tests wegen Leitungslänge gemacht - mit einen erstaunlichen Ergebnis: > bei ca 10m 4pol Kabel (für RJ12 Telefonstecker) kein crc Felher entdeckt. > bei ca 90m (ganze Spule dazwischengeschalten) nur jedes ca 20x ein Fehler. > Systembedingt habe ich die 5V direkt am Sensor mit 100 Ohm belastet, nach den 90m ist > dann die Versorgungsspannung nur mehr 3,8V trotzdem nur geringe Probleme!. > Zu bemerken ist aber das das Kabel aufgespult und nicht verlegt ist. Angeschlossen ist der > Sensor nicht parisitär, also mit 5V Versorgung - aber ohne Pull Up Widerstände. > Am Oszi verbessert sich das Impulsverhalten mit 2x 2k2 Pull Up bringt aber nicht viel. > (die Pull up Wid. gerhören meiner Ansicht auf beiden Seiten - da einmal der Prozessor auf > Low zieht, dann der Sensor) > Bei ca 40m Cat 5 verlegten Netzwerkkabel sind die Fehler dann schon häufiger. > > > Ich wäre sehr dankbar wenn Du die Tabellenversion hier Posten würdest - diese 13ms Rechenzeit > passt mir nämlich nicht ins Konzept. > > Vielen Dank! > Ernst H. >