PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Master Slave TWI



D2zA
29.12.2009, 11:18
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 (Atmega8):


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

linux_80
29.12.2009, 11:40
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/Bascom_I2C_Master#Hardware_TWI

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

D2zA
29.12.2009, 12:40
Vielen Dank, damit hast du mir schon sehr weitergeholfen.

Ich hab jetzt den code ausprobiert.

Sieht so aus:


$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./?

mare_crisium
29.12.2009, 15:17
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

D2zA
29.12.2009, 16:04
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ß

StevieL
29.12.2009, 19:08
Hallo,

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

D2zA
29.12.2009, 21:43
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

linux_80
29.12.2009, 21:50
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.

D2zA
30.12.2009, 12:51
Alles klar. Es funktioniert :)

Ich bedanke mich sehr für eure Hilfe.