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!
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?
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 berprfen
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 berprfen
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;
}
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.