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