Forum: Mikrocontroller und Digitale Elektronik I2C Slave Problem AVR


von Herb B. (s-stoerung)


Lesenswert?

Hallöchen,

ich habe hier eine Steuerungsplatine mit einem Atnega168, welcher als
Slave fungieren soll. Im Slave Receiver Betrieb.

Ich bekomm vom Master die Adresse und anschließend 3 Datenbytes. Das
funktioniert auch soweit ganz Prima. Ich schreibe mir die Bytes dann
nacheinander in ein Array.

Jetzt ist es aber so das, wenn ich ich mir die Bytes ausgeben lasse, das
erste Byte falsch ist. Byte 2 und 3 sind richtig. und ich weiß nich wo
mein fehler ist.
hier die ISR:
Achso hier das Acknowledge als Makro:

#define I2C_ACK
(1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC) 
;


interrupt [TWI] void twi_isr(void)
{
switch (TWSR)
    {
    case 0x80:
    i2cdaten[x] = TWDR;
    x++;
    break;

    case 0xA0:
    x = 0;
    twidatcomplet = 1;
    break;
    }

I2C_ACK;

}

Wird bestimmt nur ne kleinigkeit sein aber ich komm hier nicht weiter.
Schon einmal Danke für eure Mithilfe ;)

Herb

von Herb B. (s-stoerung)


Lesenswert?

huhu, keiner da der mir helfen kann???

achso, ich habe mir die Signale aufm Oszi angeschaut. Sind Ok, nur mein 
Slave checkt das erste der Bytes nicht. Ich weiß nur leider nicht was er 
einliest, da ich kein LCD an meiner Schaltung habe, ich las mir den 
Zusatnd nur über LED anzeigen.

Viel Grüße

von sebastians (Gast)


Lesenswert?

Das ist mir aufgefallen:

Dein Makro enthält nur einen Ausdruck. So allein auf einer Zeile macht 
der glaub keinen Sinn.

Im TWSR solltest du die unteren 3 Bits ausmaskieren.

von Herb B. (s-stoerung)


Lesenswert?

Das mit dem makro isn tippfehler da ich aufm anderen rechner geprogt 
habe;)
aber danke;)

In den unteren 3 Bits vom TWSR sind laut Datenblatt die Prescaler(Bit 1 
und 0) und eins (Bit 3) ist ungenutzt. Und die Hex Status codes sind für 
Prescaler = 0 angegeben. Deswegen scheint mir meine Umsetzung richtig zu 
sein.

Oder?

von Thomas D. (t0mmy)


Lesenswert?

Herb B. schrieb:
> Und die Hex Status codes sind für
> Prescaler = 0 angegeben. Deswegen scheint mir meine Umsetzung richtig zu
> sein.

Und was ist, wenn Prescaler mal nicht 0 ist, während du im switch 
steckst? Das hab ich heute im AVR Datenblatt oder im AppNote 315 
gelesen, dass man den Prescaler für die Statusabfrage maskiert.

von Herb B. (s-stoerung)


Lesenswert?

Ok, Interresant.

Es ist schon spät und ich werd mir das morgn mal ansehen, aber warum 
sollte der Prescaler nicht null sein?

Grüße

von Thomas D. (t0mmy)


Lesenswert?

Herb B. schrieb:
> aber warum
> sollte der Prescaler nicht null sein?

Das ist eine gute Frage, über die ich mir heute keine Gedanken machen 
will. Morgen will ich dann erstmal rausfinden, warum sich Peter Fleurys 
I²C-Mastercode bei mir manchmal in den while-Schleifen aufhängt.
Bin also gerade auch dabei, mir Atmels TWI-Interface näher 
anzuschauen...

von Herb B. (s-stoerung)


Lesenswert?

Also die Prescaler Bits sind wie gesagt nur Master relevant. Habe sie 
sicherheitshalber maskiert. Aber hat nix geholfen...
Ich werd hier noch bekloppt :)
Verstehe nicht warum der beim ersten Datenbyte nur mist einliest.
Der Master toggelt die ganze zeit das LSB im Datenbyte eins. Und das 
will ich ausgeben.
Allerdings leuchtet die Led nur wenn die Daten übertragen werden, oder 
sie bleibt an und wird wärend der Datenübertragung dunkler.... gut, die 
Info wird auch nicht helfen :)

von Herb B. (s-stoerung)


Lesenswert?

Hat sich erledigt, ich habs :)

Grüße

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.