Forum: Mikrocontroller und Digitale Elektronik I2C-ds1621


von Peter Eberle (Gast)


Lesenswert?

Mein Programm läuft nicht mehr wenn ich ds1621_init() aufrufe.Ohne den
Aufruf läuft das Programm.
Ich benutze zum programmieren CodeVisionAVR und einen ATMega8-16P.
Ist ein Fehler in der ds1621.lib?
Bin noch Anfänger und finde den Fehler nicht.

Danke an alle im Voraus.

Hier folgt die ds1621.lib

/*
  Dallas Semiconductor DS1621 I2C bus
  thermometer/thermostat functions

  CodeVisionAVR C Compiler
  (C) 1998-2000 Pavel Haiduc, HP InfoTech S.R.L.
*/

union ds1621_temp {
                  unsigned char b[2];
                  int w;
                  };

unsigned char ds1621_get_status(unsigned char chip)
{
unsigned char i2c_address,status;
i2c_address=0x90|(chip<<1);
i2c_start();
i2c_write(i2c_address);
i2c_write(0xac);
i2c_start();
i2c_write(++i2c_address);
status=i2c_read(0);
i2c_stop();
return status;
}

void ds1621_set_status(unsigned char chip,unsigned char status)
{
i2c_start();
i2c_write(0x90|(chip<<1));
i2c_write(0xac);
i2c_write(status);
i2c_stop();
}

void ds1621_set_temp(unsigned char chip,unsigned char cmd,char data)
{
i2c_start();
i2c_write(0x90|(chip<<1));
i2c_write(cmd);
i2c_write(data);
i2c_write(0);
i2c_stop();
while (ds1621_get_status(chip) & 0x10);
}

void ds1621_start(unsigned char chip)
{
i2c_start();
i2c_write(0x90|(chip<<1));
i2c_write(0xee);
i2c_stop();
}

#if funcused ds1621_stop
void ds1621_stop(unsigned char chip)
{
i2c_start();
i2c_write(0x90|(chip<<1));

von Tobi (Gast)


Lesenswert?

wo ist denn besagte 'ds1621_init()' funktion?

von Peter (Gast)


Lesenswert?

Sorry !
Habe aus Versehn nicht die ganze Datei kopiert.
Hier folgt alles.

/*
  Dallas Semiconductor DS1621 I2C bus
  thermometer/thermostat functions

  CodeVisionAVR C Compiler
  (C) 1998-2000 Pavel Haiduc, HP InfoTech S.R.L.
*/

union ds1621_temp {
                  unsigned char b[2];
                  int w;
                  };

unsigned char ds1621_get_status(unsigned char chip)
{
unsigned char i2c_address,status;
i2c_address=0x90|(chip<<1);
i2c_start();
i2c_write(i2c_address);
i2c_write(0xac);
i2c_start();
i2c_write(++i2c_address);
status=i2c_read(0);
i2c_stop();
return status;
}

void ds1621_set_status(unsigned char chip,unsigned char status)
{
i2c_start();
i2c_write(0x90|(chip<<1));
i2c_write(0xac);
i2c_write(status);
i2c_stop();
}

void ds1621_set_temp(unsigned char chip,unsigned char cmd,char data)
{
i2c_start();
i2c_write(0x90|(chip<<1));
i2c_write(cmd);
i2c_write(data);
i2c_write(0);
i2c_stop();
while (ds1621_get_status(chip) & 0x10);
}

void ds1621_start(unsigned char chip)
{
i2c_start();
i2c_write(0x90|(chip<<1));
i2c_write(0xee);
i2c_stop();
}

#if funcused ds1621_stop
void ds1621_stop(unsigned char chip)
{
i2c_start();
i2c_write(0x90|(chip<<1));
i2c_write(0x22);
i2c_stop();
}
#endif

void ds1621_init(unsigned char chip,signed char tlow,signed char
thigh,
unsigned char pol)
{
//set configuration register
ds1621_set_status(chip,8+(pol<<1));
//set low temperature
ds1621_set_temp(chip,0xa2,tlow);
//set high temperature
ds1621_set_temp(chip,0xa1,thigh);
//start temperature conversions
ds1621_start(chip);
//while ((ds1621_get_status(chip) & 0x80)==0);
}

#if funcused ds1621_temperature_10
int ds1621_temperature_10(unsigned char chip)
{
union ds1621_temp tt;
unsigned char i2c_addr;
i2c_addr=0x90|(chip<<1);
i2c_start();
i2c_write(i2c_addr);
i2c_write(0xaa);
i2c_start();
i2c_write(++i2c_addr);
tt.b[1]=i2c_read(1);
tt.b[0]=i2c_read(0);
i2c_stop();
return (tt.w>>7)*5;
}
#endif

von franz Hund (Gast)


Lesenswert?

Hallo Peter, ich hab im mikrocontroller.net Forum gelesen, dass du mit
dem DS 1621 bastelst. Ich hab da etwa den gleichen Effekt wie den, den
Du beschrieben hast. Läuft das Programm bei dir inzwischen? Könnt ich
da bei Dir mal ne geistige Anleihe bekommen? Ich bekommnämlich langsam
nen Vogel.

Wär schön, wenn du mir per Mail mal deinen Code schicken könntest. Ich
mach da in C rum.

Danke

Franz

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.