Forum: Mikrocontroller und Digitale Elektronik Probleme mit USI - Sendet kein ACK


von Dennis H. (t1w2i3s4t5e6r)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich versuche gerade eine TWI-Komunikation zwischen einem Atmega8 und 
einem ATTiny261 aufzubauen. Der Atmega soll der sendente Master sein, 
der Attiny demzufolge der empfangende Slave. Der Atmega hat ja 
bekanntlich ein richtiges TWI-Modul in HArdware welches ich mit dem 
Beispiel-Code aus dem Datenblatt beschreibe. Dieser Code ist sicher 
nicht effektiv, aber er sollte auf alle Fälle funktionieren, was für den 
Anfang auch völlig ausreicht. Den Code habe ich im Anhang mit Namen 
Atmega_I2C.c . Ich nutze das TWI erstmal nur mit geringer 
GEschwindigkeit, habe hier etwas weniger als 10khz gewählt.

Der Attiny 261 hat nur ein USI-Interface. Um ein Byte zu empfangen nutze 
ich größtenteils Code aus der Atmel App AVR 312. Meinen Code habe ich 
angehangen, habe ihn etwas gekürzt, um ihn übersichtlicher zu gestalten. 
Alles was Timer-Sachen sind habe ich rausgelöscht, die sollten keinen 
Einfluss auf das USI-Interface haben. Dateiname BLDC.c

Ich habe einige LED's an beiden Controllern angeschlossen, die mir 
sozusagen Auskunft über den Stand geben. So weis ich, das der 
Atmega8/Master erfolgreich die Startbedingung sendet und auch die 
Adresse sendet. Ich weis auch, das der Attiny/Slave die Adresse empfängt 
und als korrekt bewertet. Ab da hängt das ganze. Ich habe mit meinem 
Oszi mir die Sache angesehen, Bild ist im Anhang. Der CH1/rot ist die 
SDA-Leitung, CH2/blau ist die SCL-Leitung. Dort ist eindeutig ganz links 
die Startbedingung zu sehen. Danach genau acht Takte und auf der 
Datenleitung meine Adresse und das Schreib-bit. Jetzt müsste eigentlich 
der Slave die SDA-Leitung auf Low ziehen und der Master noch einen Takt 
auf der SCL-Leitung ausgeben. Beides ist nicht der Fall.
Mich wundert, das ich bei meinem Slave genau sagen kann, dass er nach 
der Adresserkennung meine Status-LED anschaltet, aber zwei Befehle 
weiter die SDA-Leitung als Ausgang schalten scheint er nicht mehr 
auszuführen.

Ich hoffe, jemand nimmt sich die Zeit meinen Code mal anzusehen und kann 
mir einen hilfreichen Tip geben, woran es hängen könnte.

Danke schonmal im Voraus für eure Antworten.


MfG Dennis

von Tassilo (Gast)


Lesenswert?

Sollte das hier beim Slave:

     DDRA |= (1<<DDA2);        //SDA als Ausgang

nicht eher

    DDRA |= (1<<DDA0);        //SDA als Ausgang

sein, anderswo sieht der Code so aus als wäre SDA an Port A Bit 0?

Gruß

Tassilo

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Ich bin sowas von dumm, na klar, ich setze die SCL Leitung auf Ausgang, 
somit auf LOW, werds gleich mal probieren, ich sollte doch mehr mit 
#define arbeiten, da können solche Schusselfehler nicht passieren
 Danke dir


MfG Dennis

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.