Forum: Mikrocontroller und Digitale Elektronik Verzweifle an TWI Code Mega8-TDA 8444


von Andreas Kramer (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe versucht an einen Mega8 einen Digital - Analog Wandler von 
Philips anzuschließen, aber leider scheint irgendwie in meinem Code der 
Wurm drinn zu sein es bleibt immer an der Stelle stehen wo eigendlich 
die Daten zum ersten mal gesendet werden sollten. Um erstmal zu 
überprüfen wo es stehen bleibt stehen überall im Code USART sendungen 
die mir den jeweiligen Punkt mitteilen. Damit hab ich auch 
herausgefunden das es an der Stelle in einer Endlosschleife stehen 
bleibt:

void TWI_data(char DATA)
{
  USART_write("TWI data");
  TWDR = DATA;
  USART_write("TWI 1");
  TWCR = (1<<TWINT) | (1<<TWEN);
  USART_write("TWI 2");
  //Load DATA into TWDR Register. Clear TWINT bit in TWCR to start 
transmission of data
  while (!(TWCR & (1<<TWINT)))
  {
        USART_write("Endlosschleife ?"); //hier bleibt es hängen
        }
    //Wait for TWINT Flag set. This indicates that the DATA has been 
transmitted, and ACK/NACK has been received.
  USART_write("TWI 3");
}

Der gesammte code ist aus dem Datenblatt vom Mega8 und nur in einzelne 
teile gespalten wobei ich einige teile weglassen musste da der compiler 
meinte die Funktion würde dort zum ersten mal benutzt:

void TWI_start(void)
{
  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)  // Send START condition
  while (!(TWCR & (1<<TWINT)));
  // Wait for TWINT Flag set. This indicates that the START condition 
has been transmitted
    if ((TWSR & 0xF8) != START)ERROR();//Gemeint ist diese Stelle mit 
!=START
    // Check value of TWI Status Register. Mask prescaler bits. If 
status different from START go to ERROR
}

Habe ich irgendein include vergessen ? (Gesammter Code im Anhang)
Der Bus befindet sich zur Zeit nur kurz auf zwei Lochraster Platinen mit 
1a Verbindung ca 10 cm und hat jeweil einen 10k pullup.
Der TDA wird momentan mit 5V versorgt genauso wie der Mega8 (hängen 
beide an der gleichen Festspannungsquelle) Momentan sind die Ausgänge 
des DAC durchgehend nur 0,28 V. Am merkwürdigsten ist auch wenn ich die 
verbindung zwischen den Beiden trenne und dann die TWI komunikation 
starte , dann bleibt der Mega8 an der gleichen Stelle hängen. Deshalb 
vertrau ich meinem code überhaupt nicht. Ich hoffe mir kann irgendjemand 
zumindest nen Tipp geben wo mein Fehler ist ich Poste auch gleich noch 
das Datenblatt für den DAC.
Was auch super wäre wenn jemand ein Beispiel für ein Twi-Komunikation 
kennt außer die von Atmel.

von Andreas Kramer (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist noch das Datenblatt für den TDA 8444 die 3 Auswählbaren 
Adressbits liegen auf LOW also Masse und Vcc = Vmax.

Gruß Andreas. Ich bin echt für jede Hilfe dankbar. Ich sitz da schon 
über ne Woche an diesem/n bekloptten Fehler(n).

von Christian S. (kriki)


Lesenswert?

Also ich kann dir nur den Code in Assembler anbieten.

Was ich mir mal anschauen würde, ist, wer Master in dem ganzen spielt.
Evtl. mal probieren, dem ATmega die Adresse 0 zu geben.

von Andreas Kramer (Gast)


Lesenswert?

Erstmal danke für dein Angebot aber ich kann Assambler leider überhaupt 
nicht und da ich den Rest auch in c hab wollte ich das eigendlich nicht 
ändern. Nur zu dem Atmega die adresse 0 zuweisen ich dachte das dürfte 
man nicht weil das als "general call" reserviert ist. Ich versuch es 
nochmal alles im Datenblatt zu vergleichen ich glaub Atmel weiß wie es 
seine eigenen Devices programmiert.

Gruß Andreas

von Christian S. (kriki)


Lesenswert?

Ok, hab mich in der Adresse geirrt =)

1. Meinte eigentlich den Startwert für Mastermode (0b11111110 oder 0xFE)
2. Probier mal, wenn du die Statuscodes ausliest.
 --->>> Die Zeilen mit if ((TWSR & 0xF8) != MT_SLA_ACK)
Die Codes sind unterhalb des Referenzbeispiels.
allenfalls warte solange, bis der richtige Statuscode ausgelesen wird.


ansonsten kann ich softwaremäßig nicht viel finden.
Fein wäre die Anschlussbelegungen an Mega8 und TDA.


von Andreas Kramer (Gast)


Lesenswert?

Ich hatte vorher das mit dem  if ((TWSR & 0xF8) != MT_SLA_ACK) auch im 
code übernommen aber mein compiler hat dann behauptet er wüsste nicht 
was für eine Funktion das wäre also hab ich das weggelassen. Fehlt da 
irgendein Include ? Leider ist Atmel da etwas ungenau was die Angaben zu 
den Includes in den Beispielen angeht. Und ich glaube ich weiß was du 
mit dem Startwert für mastermode meinst korregier mich bitte wenn ich 
mich irre du meinst die Deviceadresse (7-bit) und R/W teil ? Leider ist 
die Adresse von dem DAC größtenteils vorgegeben und die drei letzten 
bits konnte man nur ändern die habe ich alle auf 0 gelegt.

Den Schaltplan muss ich erst zeichenen da der bis jetzt aus einer 
Zusammenstellung aus verschiedensten Teilen ist,  aber sonnst bis auf 
die TWI-Komunikation einwandfrei funktioniert.( Ich muss nur leider 
Jetzt für ne Stunde weg und kann das erst wenn ich wiederkomme aber nur 
als Frage den Gesammten schaltplan oder nur die für TWI relevanten Teile 
? )

Gruß Andreas

von Oliver (Gast)


Lesenswert?


von Andreas Kramer (Gast)


Angehängte Dateien:

Lesenswert?

Es scheint irgendwie entweder ein gravierender Denkfehler meinerseits zu 
sein oder aber irgendeiner hardwaretechnisch. Ich hab das jetzt mit dem 
zip probiert und auch alles ohne Probleme umgeschrieben. Aber es bleibt 
wieder an der selben Stelle hängen wieder beim schreiben der Daten nach 
der Angabe der Deviceadresse. Hardware ist im Prinzip ein Mega8 in 
Minimalbeschaltung wie hier auf der Seite zu finden mit Anschluss über 
nen Max232 an den Pc und dann das Twi ist ja an den Pins 28 und 27 die 
sind jeweils mit 10k ( habs auch nachgemessen ) gegen High ( +5 V ) die 
gehen über ein kurzes kabel dann auf eine andere Platine ( hatte keinen 
Platz auf der mehr die war etwas klein ) und ist dort mit dem DAC 
verbunden.

Der DAC : TDA 8444 mit der Pinbelegung 1+2 gegen +5V, 4 an 28 (SCL) und 
3 an 27 (SDA), 4-8 gegen Masse und den Rest also 9-16 an ner Stiftleiste 
zum messen gegen Masse, kommt immer 0,28V.

Clock ist 16mhz durch nen Quarzoszillator von Reichelt funktioniert auch 
super. Die Pc-RS232 Komunikation funktioniert super mit Baud 9600. Nur 
halt das verdammte Twi nicht.

Gruß Andreas

von Hermann-Josef (Gast)


Lesenswert?

Hallo Andreas,

mir scheint bei der Benutzung von P.Fleurys i2cmaster.zip (Dein letztes 
Posting) fehlt
- der Aufruf von i2c_init()
- und F_CPU sehe ich auch nirgends, dann wird es zu 4 MHz angenommen

Der SCL-Clock wird zu 100 kHz initialisiert (in twimaster.c).

Viel Erfolg
Hermann-Josef

von Andreas Kramer (Gast)


Lesenswert?

Weißt du was du verdienst nen Orden =).
ES GEHT ^^
Was am anfang falsch war ist egal aber am ende war es jetzt das Fehlen 
der Initalisierung. Die F_CPU hab ich in der Datei geändert gehabt 
außerdem ist das auch in meinem "timer"-include und der Makefile 
angegeben.

Gruß ein glücklicher Andreas

von Klute P. (Gast)


Lesenswert?

Hi,
ich hab erst seit Kurzem mit dem ATMega zu tun und würde gerne einen 
D/A-Wandler mit dem TDA8444 realisieren.
Da ich außerdem nicht sehr große Kenntnisse in der C-Programmierung 
habe, bitte ich euch, das funktionierende Programm hochzuladen und wenn 
möglich es etwas zu erläutern.

Vielen Dank schon mal, Klute

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.