MCP4728 läuft einfach nicht

Gast #2539267
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
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.