- Akku Tests und Balkonkraftwerk Speicher         
Seite 4 von 5 ErsteErste ... 2345 LetzteLetzte
Ergebnis 31 bis 40 von 42

Thema: Controller als I2C Slave mit Bascom

  1. #31
    Benutzer Stammmitglied
    Registriert seit
    21.09.2004
    Ort
    Augsburg
    Beiträge
    49
    Anzeige

    LiFePo4 Akku selber bauen - Video
    So, wenn ich nochmal zusammenfassen darf:

    Zitat Zitat von Frank
    So noch eine Berichtigung: Das die I2C-Slave Lib nicht mit dem I2CSEND Befehl zurecht kam, lag auch an einem Bug in den normalen I2C-Befehlen von Bascom.
    ------
    Bei der Bascom Lib ist es generell so das das Clock Signal vom Slave auf Low gelegt wird bis die Bearbeitung der Basic-Routine 'I2c_master_has_data' abgeschlossen ist. Wenn dies also zu lange dauert, dann muss der Master warten. Wenn das Protokoll richtig verwendet wird, ist das auch kein Problem. Das Hauptprogramm stoppt dann nur, während die Funktion 'I2c_master_has_data' abgearbeitet wird.
    ------
    Aber wie gesagt, wenn der Master nicht wartet, dann gibt es ein Problem!
    Das witzige daran ist, das selbst die I2C-bascom Funktionen sich offenbar nicht korrekt daran halten. Zwar kommt es hier nicht zu einem "hängenbleiben", aber es werden I2C-Übertragungen übergangen (kommen also nicht beim Slave an). .

    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.

  2. #32
    Benutzer Stammmitglied
    Registriert seit
    21.09.2004
    Ort
    Augsburg
    Beiträge
    49
    Zitat Zitat von Frank

    Offenbar hat der Bascom Entwickler selbst nicht daran gedacht, was er später in der Libary dokumentiert hat.
    Gruß frank
    Wo kann ich das Kommentierte finden?
    gruß Werner

  3. #33
    Benutzer Stammmitglied
    Registriert seit
    21.09.2004
    Ort
    Augsburg
    Beiträge
    49
    Zitat Zitat von Frank
    Fehler in der Bascom Libary i2c.lib nun selbst gefunden und korrigiert. Zusammen mit dem Patch vom Bascom Entwickler funktioniert nun alles bestens.

    Wer sie dringend braucht kann Email hier posten, ich erläutere dann Korrektur!
    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.
    gruß und vielen Dank Werner...

  4. #34
    Administrator Robotik Visionär Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    5.116
    Blog-Einträge
    1
    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.

  5. #35
    Gast
    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

  6. #36
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    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?

  7. #37
    Gast
    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?

  8. #38
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    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

  9. #39
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    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

  10. #40
    Gast
    Zitat Zitat von Frank
    Du bringst Master/Slave und Empfangen/Senden durcheinander.

    Der Master unterscheidet sich vom Slave dadurch das nur er die Verbindung auslösen kann. Ein Slave muss ständig die I2C-Ports kontrollieren ob der Master was von ihm will.

    man könnte natürlich abwechselnd mal den und mal den als Master verwenden, aber dann wäre immer gleichzeitig der andere SLave. Der Master gibt ja die I2C Taktraten vor - der Slave muss nur antworten. Wenn der Maste reinen Sendebefehl schickt, muß der Slave die Bits im Takt des Masters annehmen. Gibt der Master einen Empfangsbefehl vor, dann muß der Slave einen Wert (im Takt des Masters) senden.
    Der Matser ist halt der Chef - zwei Chef´s vertragen sich nicht im Büro. Abwechseln dürfen sie sich aber in der Chefrolle, wenn der andere die Arbeit des Mitarbeiters macht.

Seite 4 von 5 ErsteErste ... 2345 LetzteLetzte

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

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

Labornetzteil AliExpress