-         

Ergebnis 1 bis 9 von 9

Thema: Master Slave TWI

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    22.11.2009
    Beiträge
    19

    Master Slave TWI

    Anzeige

    Hallo,
    ich habe folgendes Problem:
    Ich habe einen fertig programmierten Slave mit der Slave- Adresse 52.
    Der Slave ist komplett in AVR Assembler programmiert.
    Ich kann den Slave in Ruhezustand schicken, wenn ich ihm 0x11 schicke und aufwecken, wenn ich 0x10 schicke.

    Der Aufbau des Slaves ist etwa folgender (Atmega:


    Edit: Code nachträglich entfernt.



    Da ich noch nicht sehr viel von Assembler verstehe, will ich nun den Master in Bascom Basic programmieren.
    Der Master ist ein ATmega32 mit 16MHZ Quarz.

    Ich habe mich an dem Beispielcode von RN-Wissen orientiert.
    Da der Save die Adresse 52 hat, in Hex also 0x34 habe ich als slaveadresse &H34 eingetragen, sowie den befehl der übertragen werden soll &H11 (Standby), da der anzusteuernde Ic standartmäßig an ist.


    Im Moment ist es mir nicht möglich mit dem Slave zu kommunizieren.
    Habe ich etwas falsch gemacht?
    Weiterhin möchte ich 3Bytes vom Slave einlesen.
    Wie realisiere ich das am besten?
    Beim Beispiel wird ja nur 1 Byte gelesen.(Das lesen funktioniert auch noch nicht)


    Danke für eure Hilfe.

    D2zA

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    wenn Du nur den einen Master hast, kannst Du auch die Bascom-Befehle für I2C / TWI verwenden, das ist dann auch einfacher zu verstehen:
    http://www.rn-wissen.de/index.php/Ba...r#Hardware_TWI

    PS:
    die Slave-Adresse ist die 0x68 bzw. &H68 weil die Adresse nochmal um ein Bit nachlinks verschoben wird !

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    22.11.2009
    Beiträge
    19
    Vielen Dank, damit hast du mir schon sehr weitergeholfen.

    Ich hab jetzt den code ausprobiert.

    Sieht so aus:
    Code:
    $regfile = "M32def.dat"                                     ' the used chip
    $crystal = 16000000                               ' frequency used
    $baud = 9600
    
    $lib "i2c_twi.lbx"                                ' Für Hardware TWI
    
    Config Twi = 400000                               ' Init TWBR und TWSR
    
    ' TWI gleich einschalten, das macht Bascom ansonsten erst beim I2CStart !
    TWCR = &B00000100                                 ' nur TWEN setzen
    
    Const Pcf_write = &H68                                      ' Slaveadresse
    
    
    ' Startausgabe
    Print
    Print "I2C-TWI Demo mit ATmega8"
    Print
    
    Do
        I2cstart
        I2cwbyte Pcf_write
        I2cwbyte &H11
        I2cstop
    
        Print Err                                     ' Err = 0 -> kein Fehler !
    
        Waitms 500
    
        I2cstart
        I2cwbyte Pcf_write
        I2cwbyte &H10
        I2cstop
    
        Print Err                                     ' Err = 0 -> kein Fehler !
    
        Waitms 500
    
    Loop
    
    End

    Leider bekomme ich immernoch 1 zurück. Also steckt iwo noch ein Fehler drinne


    Edit:

    Was mich auch wundert ist folgendes im Beispiel:
    Beispielprogramm sendet ein Byte zum Slave mit Adresse 64 (0x40 bzw. &H40):
    Warum wird dort die Adresse denn nicht um ein Bit verschoben?
    Dort wird ja der gleiche Hex-Wert genommen./?

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    D2zA,

    ich glaube, DeineTWI-Adresse für den PCF8574 ist falsch - bei den PCF-Bausteinen man darf sich nämlich die Adresse nur in Grenzen frei aussuchen . Guck' mal im Datenblatt

    http://www.nxp.com/documents/data_sheet/PCF8574.pdf,

    Seite 9, Abbildung 7.1 "Adressing". Da kannst Du sehen, dass die Adressen für die Bausteine PCF 8574 von 0x40 bis 0x4E gehen und die für den PCF 8574A von 0x70 bis 0x7E. Von 0x68 fühlt sich der Baustein nicht angesprochen.

    Ciao,

    mare_crisium

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    22.11.2009
    Beiträge
    19
    Hallo,
    sry, das war noch die Beispielkommentierung.
    Ich benutze einen Atmega8 als Slave und nicht den PCF-Baustein..
    Am Slave dürfte es eigentlich nicht liegen.
    Der wurde nämlich vor auslieferung noch getestet.

    Gruß

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    09.05.2007
    Beiträge
    202
    Hallo,

    wie sieht es denn hardwareseitig aus? Richtige Pins verwendet? Leitungslänge? Pullups an SDA und SCL?
    Gruß, Stefan

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    22.11.2009
    Beiträge
    19
    Hallo,
    Ja die Pins sind richtig(SDA und SCL) Leitung ist ca 4cm lang, dadran dürfte es also nicht liegen.
    Aber Pullups habe ich noch keine.
    Welche nehme ich denn da am besten 4K3?

    Gruss

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Ohne Pullups wird das Glückssache ob der Slave was mitbekommt.
    10k werden für Pullups gern verwendet.

    Das mit dem Adresse um ein Bit nach links schieben ist so in dem Assemblercode drinnen, wenn man dort oben 52 angibt, wird unten 104 gesetzt. Deswegen gibt man beim Master das gleich so an.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    22.11.2009
    Beiträge
    19
    Alles klar. Es funktioniert

    Ich bedanke mich sehr für eure Hilfe.

Berechtigungen

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