MCP4728 läuft einfach nicht

Gast #2539267
Lesenswert?

Hallo Forum,

Ich arbeite nun schon die ganze nacht daran einen DAC mit einem 
Atmega328 laufen zu bringen. Wenn ich es mit einer fertigen Software 
teste (Arduino) funktioniert alles super. Ich wollte aber selber in 
CodeVision den Converter ansprechen aber ich bekomme einefach kein 
Spannungen aus dem DAC.

Am Anfang des Programmes sende ich dem DAC die vref einstellungen-->

start_i2c(0xc0 + mcp_device_adr);   //Adresse vom DAC
write_i2c(0x8F);                    //Vref int
stop_i2c();                         //Stop IIC

Dann versuche ich die Spannungen auszugeben-->

start_i2c(0xc0 + mcp_device_Adr);
//auf ack wird gewartet

write_i2c(0x90);
//auf ack wird gewartet

write_i2c(0x80 + (dac1 >> 8));
write_i2c(dac1);
//auf ack wird gewartet

write_i2c(0x80 + (dac2 >> 8));
write_i2c(dac2);
//auf ack wird gewartet

write_i2c(0x80 + (dac3 >> 8));
write_i2c(dac3);
//auf ack wird gewartet

write_i2c(0x80 + (dac4 >> 8));
write_i2c(dac4);
//auf ack wird gewartet

stop_i2c();

Könnt Ihr mir weiter helfen ?
Danke!
Gast #2539404
Lesenswert?

Ich benutze TWI.

unsigned char start_i2c(unsigned char address){
  //Senden der START Bedingung
  TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
  //Warten bis TWI Bedingung gesendet wurde
  while(!(TWCR & (1<<TWINT)));
  //TWI Status berprfen
  if((TWSR & 0xF8) != TW_START) return 1;
        //Adresse des anzusprechenden Devices senden
  TWDR = address;
  TWCR = (1<<TWINT) | (1<<TWEN);
  //Warten bis TWI Bedingung gesendet wurde
  while(!(TWCR & (1<<TWINT)));
  //TWI Status berprfen
  if((TWSR & 0xF8) != TW_MT_SLA_ACK) return 2;
  return 0;
}

void stop_i2c(void){
   // Senden der IýC Stopbedingung
         TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
}

unsigned char write_i2c(unsigned char data){
  //Daten schreiben
  TWDR = data;
  TWCR = (1<<TWINT) | (1<<TWEN);
         //Warten bis TWI Bedingung gesendet wurde
  while(!(TWCR & (1<<TWINT)));
  if((TWSR & 0xF8) != TW_MT_DATA_ACK) return 2;
  return 0;
}
Gast #2539561
Lesenswert?

Moin,

TWI (I2C) ist eine Statemachine. Übertragungen werden mit einem 
Protokoll abgewickelt die diese Statemachine in den jeweiligen Zustand 
kippt. In deinen start_, stop_ und write_, Routinen werden diese nicht 
berücksichtigt (und im Aufruf nicht geprüft). Wenn irgendwas schief geht 
klemmt die gesamte Kiste. Die verschiedenen Zustände (sind einige) und 
Reaktionen darauf findet man in den jeweiligen Datenblättern und/oder in 
der twi.h

MfG

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren