mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik TWI Acknowledge Probleme


Autor: Marco Grau (ocram12)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte zwischen zwei Atmega 32 eine TWI implementieren.
Den Code für den Master habe ich von Peter Fleury übernommen.
Die nötigen Einstellungen wurden vorgenommen.
Das sollte so auch klappen.

Mein Problem liegt (wie bei so vielen) auf der Slave – Seite.

Nach meinem Verständnis müsste der Master die Adresse vom Slave 
übertragen.
Danach kommt das Bit für die Entscheidung R/W.
Hiernach muss der Slave das nächste Bit (Nummer 9) auf low ziehen. 
Hieraus
sieht dann der Master, ob die Übertragung angekommen ist, oder nicht.
Wenn schon hier Fehler in meinen Überlegungen sind, für Denkanstöße bin 
ich immer zu haben.

Auf dem Scop sehe ich das Bitmuster: 000011101. Kann leider kein plott 
erzeugen.

Daraus ersehe ich ja schon einmal, das die Adresse (0x07) richtig 
übertragen wird. Danach kommt auch richtig das 8. Bit für „write“.
Aber wie bekomme ich auf der Slave – Seite das 9. Bit auf „low“?

Für den Acknowledge pulse ist ja das Bit 6 TWEA im TWCR Register 
zuständig.
Jetzt habe ich in UP ACK dieses Bit auf 1 gesetzt.(+ natürlich TWINT 
auch auf 1)
Aber auf dem Scop ist Bit 9 immer noch auf high.
Währe sehr nett, wenn ihr mir bei diesem Problem helfen könntet.
Danke.



Die Initialisierung sollte so stimmen.

void init_i2c(unsigned char addr)
{
TWAR = (addr << 1);
TWCR =(1 << TWEA) | (1 << TWEN) ;
TWCR = ~((1 << TWSTA) || (1 << TWSTA));
}

void  Ack (void)
{
TWCR = (1<<TWINT)|(1<<TWEN);
TWCR = ~(1 << TWEA);
while (!(TWCR & (1<<TWINT)));
}

void main_S (void)
{
  init_i2c(0x07);

  while (1)
  {
  while (!(TWCR & (1 << TWINT)));
  if (TWSR == 0x60)
    {
    Ack();
    }
  }//while(1)
}// main

Autor: John Small (linux_80)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich würde sagen bei dieser Initialisierung haut das nicht hin, schmeiss 
die 2. Zeile raus mit dem STA und STA ;-), die muss man nicht extra 
löschen, wenn sie voher garnicht gesetzt wurden, und ohne | schon 
garnicht !

Ausserdem muss man in TWCR alle Bits auf einmal setzen, denn TWI legt 
gleich los wenn TWINT gesetzt wird, da kommt die 2. Zeile immer zu spät, 
und ohne | wird das sowieso nix !

Nachtrag:
mit TWCR keine Bitmanipulationen per |= machen, da kommt der TWI nur 
durcheinander, immer alle Bits angeben die man haben will, nix vorher 
einlesen usw. !

Autor: Marco Grau (ocram12)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ging ja mal schnell.
Werde die Änderungen heute ausprobieren.
Danke Tiny 80!

Autor: Marco Grau (ocram12)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
super, hat alles geklappt.
Hatte noch einen Hardwarefehler auf den Platinen.
Zwischen den Ltg. war noch ein 10k wid. eingebaut.
Das ergab natürlich einen sehr schönen Spannungsteiler.
Dadurch war das Signal immer zwischen 4V und 5V.
Somit niemals als Low erkannt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.