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