Forum: Mikrocontroller und Digitale Elektronik MCP4728 läuft einfach nicht


von Jörg (Gast)


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!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jörg schrieb:
> Ich wollte aber selber in CodeVision den Converter ansprechen
Du hast die I2C Routinen also selber geschrieben? Wie sehen die denn 
aus? Ist das ein Soft-I2C? Wo ist der Baustein angeschlossen?

von Jörg (Gast)


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;
}

von Sauger (Gast)


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

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.