Wo kann ich das Kommentierte finden?Zitat von Frank
gruß Werner
So, wenn ich nochmal zusammenfassen darf:
Zitat von Frank
so ich glaub das is mir auch passiert, wobei ich denke daß der master einfach nicht prüft ob der slave schon fertig ist:---->
For I = 1 To 101
adresse = I
sendebyte = 2*i
Gosub Schreibebytei2c:
Next I
Schreibebytei2c:
I2cstart
Waitms 10
I2cwbyte i2cadresse
Waitms 10
I2cwbyte adresse
Waitms 10
I2cwbyte sendebyte
Waitms 10
I2cstop
Waitms 10
Return
----------->
hier speichert er nur jeden 4 ten wert bzw wenn ich das i2cdelay auf 10 stelle jeden 2ten wert wenn man die waitms entfernt. ich denke das liegt an dem fehler in der i2clib?? er wartet wohl nicht auf meinen eeprom baustein bis er fertig ist und sendet immer weiter obwohl der I2C slave noch garnicht empfangsbereit ist. (der slave braucht 5-20ms um einen wert zu verarbeiten). ich weiß auch nicht genau ob alle waitms benötigt werden aber so funktionierts auf jedenfall.
Wo kann ich das Kommentierte finden?Zitat von Frank
gruß Werner
ok, dann schick mir doch mal bitte den Patch und die verbesserte lib und ne kurze erklärung wie und was wäre auch ziemlich gut.Zitat von Frank
gruß und vielen Dank Werner...
Hi,
leider hab ich noch kein I2C eeprom (oder was hast du als slave?)verwendet, daher kann ich zur Ansteuerung nix sagen. Ich denke nicht das es an dem Bug in der alten I2C-Libary liegt, vornehmlich hatte es mit I2C-Send-befehl Probleme gegeben.
Aber du kannst sicherheitshalber ja mal die neue nutzen.
Da der Link oben nicht mehr geht kannst du die ja hier laden
https://www.roboternetz.de/download/bascomi2clib.zip
Einfach entpacken und ins Libary Verzeichnis kopieren
Was ich oben mit Doku meinte weiß ich garnicht mehr, ist ja schon ewig her. Ich glaube ich meinte den Quellcode der Libary. Aber ist nicht so wichtig.
Hallo Leute. Bin neu hier und habe auch Probleme mit dem I2C Bus
Hab mich schonmal theoretisch damit beschäftigt und hier auch einiges dazu gelesen. Dies führte allerdings zu immer mehr Verwirrung.
Arbeite mit Bascom (siehe Signatur) und habe I2CSEND und I2CRECEIVE benutzt.
Der Mega8 ist der MASTER und der 8535 sollte der SLAVE sein.
Nun lese ich, dass man 2 Chips garnicht so einfach miteinander verbinden kan, weil die i2c.lib nicht vorhanden ist bzw. diese mit I2CSEND/I2CRECEIVE nicht funktioniert.
Was muss ich tun?
Hier noch ein paar konkrete Fragen dazu:
1. Ich lese immer nur was von der Arbeitsweise des MASTERS. Wie bringe ich aber einem anderen Bauteil bei, dass es ein SLAVE sein soll, woher weiß es das?
2. Ich habe eine einfache Routine zum Ausprobieren der Befehle I2CSEND/I2CRECEIVE geschrieben. Wie ich weiß, stehen Daten+Adresse im TWDR. Wenn ich mit Bascom simuliere ändert sich allerdings rein garnix in irgend einem TW-Register. Woran kann das liegen?
(Wie kann ich hier in soeinen Post so ein Fenster mit entsprechendem Quellcode einbinden?)
Viele Fragen, ich weiß. Aber jeder muss mal klein anfangen.
Hier der Code vorerst in dieser "unpraktischen" Form
'Deklarationen + Initialisationen:
$regfile = "m8def.dat"
$crystal = 8000000
Config Portb = Output 'damit LEDs zur Kontrolle leuchten koennen
Config Sda = Portc.4 'laut Datenblat des mega8
Config Scl = Portc.5
Dim X As Byte
Dim Slave As Word
Portb = &H00 'alle LEDs anschalten
On Int0 Senden 'Senden=Sprungmarke
On Int1 Empfang 'empfangen = Sprungmarke
Enable Int0
Enable Int1
Enable Interrupts
X = 0
Do
Print X
Loop
Senden:
Portb.0 = Not Portb.0 'nur zur Kontrolle, das Int funktioniert
I2cinit
Slave = &H80
X = 50
I2csend Slave , X
Return
Empfang:
Portb.0 = Not Portb.0 'nur zur Kontrolle, das Int funktioniert
I2cinit
Slave = &H81
I2creceive Slave , X
If X = 50 Then Portb = Not Portb
Return
End
schonmal vorweg, ich kenne mich mit Bascom nicht aus, habe aber eine Verbindung von µC zu µC per TWI in C realisiert
der ATMEGA8 unterstützt auf jeden Fall Hardware-TWI, der 8535(AT90S oder ATMEGA ?) glaube ich überhaupt nicht (beim ATMEGA8535 bin ich mir nicht ganz sicher)
das bedeutet, den 8535 kannst du vielleicht noch zum TWI-Master machen, aber Slave würde erheblichen Programmieraufwand bedeuten, deshalb habe ich dafür ATMEGA8 verwendet, die das eben Hardwaremäßig unterstützen
wie man Master programmiert, findet man ja überall(bzw. dürfte mit Bascom kein Problem sein) und für den Slave steht im Datenblatt des ATMEGA8 ein wenig Programmcode(allerdings Assembler und C, wobei man meines Wissens nach Assembler ganz gut in Bascom eibinden kann)
das mit den TWxx-Registern könnte daran liegen, dass in früheren Versionen nicht das Hardware-TWI benutzt wurde, sondern Software-I²C und wenn du noch eine solche Version hast, ändert sich nichts in den TWxx-Registern, es müsste aber trotzdem gehen
vielleicht kann sich das noch mal ein Bascom-Programmierer anschauen?
Hallo Pascal,
Danke für die Tips. Die haben achonmal weitergeholfen. Beim 8535 handelt es sich um den AT90S8535 und Du hast recht,der hat auch kein Hardware-TWI. Ich wollte das ja auch nur zum Testen verwenden. Versuche ich es mal andersherum. (Mega8 als SLAVE)
Da ich wirklich den Hardware I2C des MEga8 verwende, wird dies der Grund der "leeren" Register sein.
Habt ihr noch Ideen, wie ich sonst noch auf einfache weise testen kann ob das SENDEN/EMPFANGEN funktioniert?
ich hatte einen PCF8574(Porterweiterungsbaustein für I²C) rumliegen, hab dann mit dessen Hilfe den Master zum Laufen gebracht und als ich sicher sein konnte, dass der geht, hab ich einen anderen ATMEGA8 als Slave hergenommen
also nehm, wenn möglich, erstmal einen "normalen" I²C-Baustein, um das Senden/Empfangen zu probieren
Hallo, hatte ein ähnliches Problem.
Ich poste hier mal meinen Code, vielleicht hilft er ja irgendjemand. Er ist eigentlich ziemlich scmutzig programmiert aber er läuft. Dazu noch eine kurze Erklärung zu meinem I2C signal: Startbit, Adresse des Slave, Länge des Datenpackets, Daten, Stopbit. BIT 7 wird zuerst übertragen, Die software wartet auf startbedingung, ließt dann aus, gibt auf RS232 aus, macht ne kleine pause (So häufig kommen keine daten bei mir), Stopbit wird nicht beachtet, da die länge ja übermittelt wird und ich so rechtzeitig aufhören kann.
Es ging darum diese daten zu loggen (RS232) Franks mini projekt hat mir ein bisschen weitergeholfen.
Code:$regfile = "m128def.dat" $crystal = 16000000 $baud = 57600 Config Portd = Input Cl Alias Pind.0 'Clock an Pind.0 Da Alias Pind.1 'SDA an Pind.1 On Int1 Startchk Config Int1 = Falling Enable Interrupts Dim Adr As Byte Dim Leng As Byte Dim Temp As Byte Dim C As Byte Dim I As Byte Dim J As Byte Dim St(10) As Byte For I = 1 To 8 'String leer machen zum ersten mal St(i) = " " Next Enable Int1 Do nop Loop End Startchk: If Cl = 1 Then 'Startbedingung: fallende flanke an SDA&SCL=1 Disable Int1 Gosub Rxdata End If Waitms 1000 Enable Int1 Return Rxdata: 'Adresse immer 70H Adr = 0 'Wert zurücksetzten C = 128 For I = 1 To 8 Do Loop Until Cl = 0 Do Loop Until Cl = 1 If Da = 1 Then Adr = Adr + C C = C / 2 Next 'ack überspringen Gosub Jmpack 'Länge des strings Leng = 0 'Wert zurücksetzten C = 128 For I = 1 To 8 Do Loop Until Cl = 0 Do Loop Until Cl = 1 If Da = 1 Then Leng = Leng + C nop C = C / 2 Next 'ack überspringen Gosub Jmpack 'String For J = 1 To Leng Temp = 0 C = 128 For I = 1 To 8 Do Loop Until Cl = 0 Do Loop Until Cl = 1 If Da = 1 Then Temp = Temp + C nop C = C / 2 Next St(j) = Temp 'ack überspringen Gosub Jmpack Next Print Chr(12); Print "Adress: " ; Hex(adr) ; "h " ; "Length: " ; Leng ; For I = 1 To Leng Print Chr(st(i)); Next Print For I = 1 To 8 'String komplett leer machen St(i) = " " Next Return Jmpack: 'ack überspringen Do Loop Until Cl = 0 Do Loop Until Cl = 1 Return
Zitat von Frank
Lesezeichen