- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 11

Thema: Amtel atmega 32 als I2C- SLAVE Bus mit 250kBaud im Interrupt Modus

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332
    Hallo,

    irgendwie gebe ich Dir ja recht, nur gibt es den irgendwo eine entsprechende Beschreibung, wann welches Signal innerhalb der Interrupt-Routine ausgelöst wird. Die Beschreibung aus der Headerdatei <twi.h> ist nicht wirklich hilfreich oder ?

    Ich weiss zum Beispiel nicht sicher, welchen Anteil der Steuersignal die Hardware des atmega32 durchführt und welche nicht.

    Folgende Signale verarbeitet meine und auch die RN-Wissens Routine eins Slave im Interrupt Mode.
    Code:
    {
        switch (TW_STATUS)                                            //Check the TWI-Status register
            {
            case    TW_REP_START:                                    // Repeated Start bestätigen
                       break
            case    TW_SR_SLA_ACK:                                    // 0x30 Slave Receiver, Slave was addressed
                    break;
            case    TW_SR_DATA_ACK:                                    // 0x80 Slave Receiver, a data byte received
                break;
        case TW_ST_SLA_ACK:                                            //0xA8 Slave addressed in read mode
        case TW_ST_DATA_ACK:                                        //0xB8 Slave Transmitter, Request of data
            break;
    //    case TW_ST_DATA_NACK:                                        // 0xC0 No more data requested
    //    case TW_SR_DATA_NACK:                                        // 0x88
    //    case TW_ST_LAST_DATA:                                        // 0xC8  Last data byte in TWDR has ben transmitted (TWEA = “0”);
    //case TW_SR_STOP:                                                         // 0xA0 STOP empfangen has been received
        default:     
            AcknowlegeFlag=2;
        break;
             break;    
        }
        
    if (AcknowlegeFlag == TRUE )        TWCR_ACK;
    if (AcknowlegeFlag == FALSE )        TWCR_NACK;
    if (AcknowlegeFlag == 2 )            TWCR_RESET;
    }

    Nur werden hier Start / Stop / Repeated Start komplett aussen vorgelassen, diese werden laut diesem Code über den Default geleitet (also Reset ?!).

    Wird diese Routine auch dann ausgeführt, wenn ich mit einem anderen Partner rede ? Die Daten der Adresse werden natürlich mit einem Takt von 250kBaud übertragen. Der atmega kann den Fast Modus, das sollte also nicht das Problem sein.

    Edit1:
    Die Bilder 1 und 2 zeigen jeweils das eigentlich Protokoll, was ich verwende
    Picture 1: Zeigt den Schreibzugriff. Das erste Byte ist hierbei die Adresse, wo die Daten abgelegt werden
    Picture 2: Zeigt den Lesezugriff. Das erste Byte ist hierbei die Adresse, wo die Daten gelesen werden soll. Danach der Repeated Start und der Lesezugriff.
    Hier wäre das Problem, der Repeated Start und die neue Slave-Adresse, dieser ist aber bei Lesen, was ja geht

    Edit2:
    Ich habe den "Repeated Start" noch eingefügt. Hier wird dann mit einem ACK geantwortet.
    Nur habe ich ja nur mit dem Schreiben Probleme, hier wird ja eh nur jedes Byte vom Master mit "ACK" beantwortet.
    Es erfolgt keine Änderung der Datenrichtung (Repeated Start). Dies ist ja doch eigentlich die einfache Richtung.

    Edit3: Hier die Bedingungen, wann das Modul TWI einen Interrupt auswirft.
    Seite 176 vom Atmega32 gab mir die Infos:

    The TWINT Flag is set in the following situations:

    After the TWI has transmitted a START/REPEATED START condition

    After the TWI has transmitted SLA+R/W

    After the TWI has transmitted an address byte

    After the TWI has lost arbitration

    After the TWI has been addressed by own slave address or general call

    After the TWI has received a data byte

    After a STOP or REPEATED START has been received while still addressed as a slave

    When a bus error has occurred due to an illegal START or STOP condition

    Gruss R.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Picture2.JPG   Picture1.JPG  
    Geändert von Ritchie (22.07.2012 um 15:27 Uhr) Grund: Zusatzinfos
    Kaum macht man es richtig, schon funktioniert's ...

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Ritchie Beitrag anzeigen
    Nur werden hier Start / Stop / Repeated Start komplett aussen vorgelassen, diese werden laut diesem Code über den Default geleitet (also Reset ?!).

    Wird diese Routine auch dann ausgeführt, wenn ich mit einem anderen Partner rede ?
    Das ist dein Code, das mußt du doch wissen.

    Die Beschreibung aus der Headerdatei <twi.h> ist nicht wirklich hilfreich oder ?
    Der Headerfile hilft dir da wenig, das ist ja nur eine Schreibhilfe. Was du wissen mußt, steht im Datenblatt und in den Application Notes.

    Deine Bilder helfen auch nicht, sie zeigen einen Layer zu hoch. Da kommt das Timing garnicht mehr vor. Selbst wenn auf dieser Ebene alle Bits gleich breit dargestellt sind, heißt das nicht, daß sie gleich lang sind.

    The TWINT Flag is set in the following situations:

    After the TWI has transmitted a START/REPEATED START condition

    After the TWI has transmitted SLA+R/W

    After the TWI has transmitted an address byte

    After the TWI has lost arbitration

    After the TWI has been addressed by own slave address or general call

    After the TWI has received a data byte

    After a STOP or REPEATED START has been received while still addressed as a slave

    When a bus error has occurred due to an illegal START or STOP condition
    Als Slave sind für dich nur die letzten 4 von Bedeutung. Wichtiger sind aber die Bits, mit der der Kontroler gesteuert wird und ihre genaue Wirkung.

    Bau dir eine Testumgebung auf und teste mit Hilfe von Debugger und LA oder Speicherscope deinen Code, bis du genau weißt, was wann und warum passiert.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332
    Hallo Zusammen,

    ich habe nochmals ein kleines Dokument erstellt, welches die Datenübertragung entsprechend verdeutlichen soll.

    siehe Anhang "I2CProtokoll.doc". Es soll die Ereignisse anzeigen und deren Aktionen.

    Nur wenn die Routine ein "TW_START" oder "TW_REP_START" empfangen wird, soll weder ein ACK/NAK gesendet werden.
    Aber wenn ich das Flag

    TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTA )|(1<<TWSTO)|(0<<TWWC);

    Setze ich gleichzeiti ein ACK/NACK oder sehe ich das falsch.

    Da ich derzeit kein Speicherscope zur Verfügung habe, habe ich hier ein Problem.

    Edit 1:
    Versuche mir ein Speicherscope zu besorgen.

    Gruss R.
    Angehängte Dateien Angehängte Dateien
    Kaum macht man es richtig, schon funktioniert's ...

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Erst mal zu deinem Text:

    Wenn du ein Adressbyte bekommen hat, muß mit ACK geantwortet werden. Ob der Kontroler das bei der eingestellten Adresse selbsttätig macht, sagt dir das Datenblatt.

    Alles was ab jetzt passiert, liegt in deiner eigenen Verantwortung. Es gibt da bei I2C keine Vorgaben, das Protokoll auf dieser Ebene bestimmst du selbst. Gerne wird es so gemacht, wie bei den ersten EEPRoms. Da ist das erste Byte eines Writes die Datenadresse, die nachfolgenden werden dann ab dieser Adresse geschrieben, wobei gleichzeitig die Adresse erhöht wird. Wieviele Bytes geschrieben werden, ist unbestimmt. Wenn der Slave nicht mehr will, antwortet er mit NACK, wenn der Master nichts mehr zu sagen hat, löst er ein STOP aus.

    Das ganze hat aber mit dem Timing nichts zu tun. Da gehts im wesentlichen um die SCL Leitung, die bestimmt das Timing.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332
    Hallo Klebwax,

    da hier der atmega neu für mich ist (meine Teilnehmer sind sonst alles PIC's in ASM), werde ich das ganze nochmals mittles
    Speicherscope prüfen.

    Trotzdem vielen Dank für die Hilfe

    Gruss R.
    Kaum macht man es richtig, schon funktioniert's ...

Ähnliche Themen

  1. Atmega in MPCP Modus
    Von demmy im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 07.05.2012, 08:23
  2. Antworten: 3
    Letzter Beitrag: 06.11.2010, 18:54
  3. Interrupt beim I2C Slave
    Von guenter1604 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 07.12.2009, 18:59
  4. Interrupt bei TWI Slave (Atmega8)?
    Von ingo pirker im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 20.11.2009, 22:36
  5. I2C Slave Interrupt
    Von simple im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 29.11.2006, 17:53

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress