🇩🇪
Zitat von: vloki in 01.06.2021, 14:41:50 CESTDie MCLR Pins sind aber schon ordentlich beschaltet, bzw. deaktiviert?Hoffe, wir kommen hier nicht vom Fredthema ab....wäre wohl besser, einen eigenständigen Fred über Empfindlichkeit zu erstellen. Bis dahin...
Zitat von: picass in 31.05.2021, 09:19:13 CESTDie MCLR Pins sind aber schon ordentlich beschaltet, bzw. deaktiviert?Zitat von: Peter in 29.05.2021, 21:47:36 CESTDachte nicht das die Pic Controller so empfindlich sind.... Dann fand ich raus, dass manchmal schon die Annäherung eines Fingers an den Sende-PIC reichte, um den zur Arbeit zu bewegen.
Zitat von: Peter in 29.05.2021, 21:47:36 CESTDachte nicht das die Pic Controller so empfindlich sind.Deine Problemschilderung erinnert mich an ein irgendwie ähnliches Erlebnis beim Experimentieren mit meiner Rollladenschaltung. Die Prototyp-Anlage aus drei Platinen - zwei davon enthalten je einen PIC - funktionierte, will sagen, der Datentransport via Kabel klappte. Aber gelegentlich startete eine Datenübermittlung vom sendenden PIC, obwohl keine Startbedingung (Taste / Portänderung) vorlag. Dann fand ich raus, dass manchmal schon die Annäherung eines Fingers an den Sende-PIC reichte, um den zur Arbeit zu bewegen. Es half da auch nur wenig, mit einer Hand in der Steckdose - also am Erdungsbügel - zu sein, und dieserart "eigentlich" die Elektrostatik ausgebremst zu haben. Dieses Phänomen habe ich noch nicht im Griff, mag sein, dass der nun bevorstehende Einbau in ein Alugehäuse da weiterhilft.
Zitat von: pic18 in 18.03.2021, 12:52:09 CETStimmt das Timing in der Abfrage? Ich meine -0,5°C sind lauter 1er im Datenbyte.Da könntest du recht habent. Auf jeden Fall ein guter Hinweis!
LCD_Init();
LCD_ConstTextOut(0,0,"DS18B20");
LCD_ConstTextOut(1,0," . ");LCD_CharOut(0x27);LCD_CharOut('C');
//----------------------------------------------------------------------- main()
while(ds18x20_res()){
ds18x20_wr(SKIP_ROM);
ds18x20_wr(CONV_T);
__delay_ms(750);
ds18x20_res();
ds18x20_wr(SKIP_ROM);
ds18x20_wr(RD_SCRATCH);
// __delay_ms(1);
ds18x20_rdTemp();
if(ds18x20.t_int < 0)
LCD_ValueOut_00(1,0,ds18x20.t_int,2);
else
LCD_ValueOut_00(1,0,ds18x20.t_int,3);
LCD_ValueOut_00(1,4,ds18x20.t_dec,1);
}
LCD_ConstTextOut(1,0," ERROR ");
while(1){;}
ds18x20_t ds18x20;
uint8_t ds18x20_data[9];
uint8_t ds18x20_res(void)
{
uint8_t rec;
DS18X20_OUT = 0; // set the (I)O to low level
DS18X20_DIR = 0; // config as output (-> low)
__delay_us(480); // reset pulse >=480 us
DS18X20_DIR = 1; // config as input (high-z -> pull up)
__delay_us(80);
rec = ~DS18X20_IN; // read the level (if low, slave available)
__delay_us(400); // wait for end of slot
return (rec);
}
void ds18x20_wr(uint8_t value)
{
for(uint8_t i = 0; i < 8; i++){
DS18X20_DIR = 0;
__delay_us(1);
if(value & 0x01){ DS18X20_DIR = 1; }
__delay_us(60);
DS18X20_DIR = 1;
value = value >> 1;
}
}
uint8_t ds18x20_rd(void)
{
uint8_t value = 0;
for(uint8_t i = 0; i < 8; i++){
DS18X20_DIR = 0;
__delay_us(1);
DS18X20_DIR = 1;
__delay_us(9);
value |= DS18X20_IN << i;
__delay_us(51); // 60+1 us minimum
}
return value;
}
int8_t ds18x20_rdTemp(void)
{
for(uint8_t i = 0; i < 9; i++){
ds18x20_data[i] = ds18x20_rd();
}
ds18x20.t_int = *(int16_t *)&ds18x20_data[0] >> 4;
ds18x20.t_dec = ((ds18x20_data[0] & 0x0F)*10) >> 4;
if(ds18x20.t_int < 0)
ds18x20.t_dec = 9 - ds18x20.t_dec;
return ds18x20.t_int;
}
typedef enum {
CONV_T = 0x44,
RD_SCRATCH = 0xBE,
WR_SCRATCH = 0x4E,
COPY_SCRATCH = 0x48,
RECALL_EE = 0xB8,
RD_PWR_SUPLY = 0xB4,
SKIP_ROM = 0xCC,
FIND_ROM = 0xF0,
RD_ROM = 0x33,
MATCH_ROM = 0x55,
FIND_ALRM = 0xEC
}DS18x20_Command_t;
typedef struct{
uint8_t t_dec;
int8_t t_int;
}ds18x20_t;