- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 8 von 8

Thema: Bitte um Hilfe bzgl TWI / I2C

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.12.2005
    Ort
    @FFM
    Alter
    48
    Beiträge
    408

    Bitte um Hilfe bzgl TWI / I2C

    Anzeige

    E-Bike
    Hallo liebe Freunde der hardwarenahen Programmierung

    Ich hab dieses Thema auch schon im Bascom-Forum gepostet dort antwortet mir jedoch keiner ,da wahrscheinlich die Bascom nutzer von den fertigen I2C Routinen so verweichlicht sind daß sie gar nicht mehr wissen was die Hardware tut.
    Einer von diesen Bascom nutzern bin ich auch.Da ich aber nun tiefer in die Sphären eines AVRs einsteigen will hab ich angefangen ein Bascom Programm zu schreiben das die TWI Schnittstelle nicht über fertige Bascom-Befehle steuert,sondern über die Register.
    Verbunden sind ein Mega 168 und ein Mega16 mit RS232 und Bootloader.
    Die Übertragung soll erstmal Master-transmitter und Slave -Receiver sein

    Dazu hab ich folgenden leicht lesbaren Code im Master
    Code:
    I2c_senden:
       Set Twcr.twen                                            'TWI-Hardware wird aktiviert
       Twbr = 72                                                'Bitrate auf 100Khz bei 16Mhz CPU und Prescaler =0
       Twsr = 0                                                 'Prescaler auf 0
       Set Twcr.twsta                                           'TWI-Start wird erzeugt
       Bitwait Twcr.twint , Set                                 'wartet bis TWI-Start gesendet wurde
       'Print "sende TWI Start"
       If Update_twistatus() = &H08 Then                        'wenn start gesendet
          'Print "Start erfolgreich"
          'Print "sende SLA/W"
          Twdr = Slaveid And &B11111110                         'SLA-W wird geladen
          Reset Twcr.twsta
          Set Twcr.twint                                        'Twint wird gelöscht
          Bitwait Twcr.twint , Set                              'wartet bis Hardware fertig
          If Update_twistatus() = &H18 Then                     'wenn SLA-W empfang bestätigt
             'Print "SLA/W übertragen"
             'Print "sende Datenbyte"
             Twdr = Sendebyte                                   'daten werden geladen
             Set Twcr.twint
             Bitwait Twcr.twint , Set
             If Update_twistatus() = &H28 Then                  'wenn Datenempfang bestätigt
                Print "datenbyte übertragen"
             Else
                'Print "TWI-Fehler kein Daten Ack"
             End If
          Else
             'Print "TWI-Fehler kein SLA-R/W Ack"
          End If
          Set Twcr.twsto                                        'Stop Condion
          Set Twcr.twint                                        'wird gesendet
          Print "sende TWI Stop"
          Print ""
       Else
          Print "TWI-Fehler kein Start gesendet"
       End If
    Return
    
    Function Update_twistatus() As Byte
       Update_twistatus = Twsr And &B11111000                   'Twistatus wird gelsen prescaler wird maskiert
    End Function
    und folgenden im slave:

    Code:
    do
    if twi_flag=1 gosub i2c_schreibe
    loop
    
    I2cschreibe:
       Reset Twi_flag
       If Update_twistatus() = &H60 Then
          Set Twcr.twea
          Set Twcr.twint
          Bitwait Twcr.twint , Set
          If Update_twistatus() = &H80 Then
             I2cbyte = Twdr
          Else
             I2cbyte = 0
          End If
          Set Twcr.twint
       End If
       While I2cbyte > 0
          Set Led2
          Waitms 100
          Reset Led2
          Decr I2cbyte
       Wend
    Return
    
    Function Update_twistatus() As Byte
       Update_twistatus = Twsr And &B11111000                   'Twistatus wird gelsen prescaler wird maskiert
    End Function
    
    Twi_isr:
       Set Twi_flag
    Return
    die LED2 soll dabei so oft blinken wie der empfangene Wert vom Master ist

    jedoch passiert gar nix der Master signalisiert über COM nach viel zu langer Zeit das er erfolgreich gesendet hat
    der Slave hängt sich auf

    Bitte helft mir Gruß Daniel

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich hab da in der Wiki eine Bascom-Library + Besipiel vorgestellt.
    In der Library selbst ist der assembler-part. Vielleicht findest du da Hilfe

    https://www.roboternetz.de/wissen/in...is_Multimaster
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.12.2005
    Ort
    @FFM
    Alter
    48
    Beiträge
    408
    Hi PicNick ohne deine TWI-Hilfe wär ich erst gar nicht so weit gekommen.
    Super Arbeit.
    Aber am Assembler Quellcode scheiterte ich kläglich ich muß erstmal wissen wann wie welche register gesetzt und ausgewertet werden um dann parallelen zum assembler code ziehen zu können um diesen auch nur ansatzweise zu verstehen.

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich hab nach der TWI-Anleitung im Datenblatt des Atmega32 gearbeitet.
    (Das ist bei 168 oder Mega16 auch nicht anderes)

    Da sind vier Tabellen
    1 MasterTransmitter
    2 MasterReceiver
    3 SlaveReceiver
    4 SlaveTransmitter
    die dir sagen welche Flags du wann setzen kannst (oder sollst)

    Am einfachsten ist IMHO Slave Receiver, fang vielleicht damit an.

    Ich find auch, daß es im Interrupt leichter ist, weil die Statusabfrage nur an einer Stelle stattfindet, sind muß man ja nach jedem Schmarren immer das Gleiche reintun.

    Was die Sache bei mir etwas kompliziert, ist nur die Multi-Master Geschichte, wo sich die Mega's gegenseitig reinquatschen können.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.12.2005
    Ort
    @FFM
    Alter
    48
    Beiträge
    408
    Ja so einfach ist das für mich nicht.... zum Beispiel Status $68 .. wie kann ein Slave Receiver die Arbitration verlieren ??? oder auch selbst wenn ein Master seine Arb. verliert wie will das ein Slave erkennen .er erkennt ja nicht das ein MAster SDA nicht auf high belassen kann.Oder was ist der not adressed slave mode und wodurch definiere ich genau master und slave ?? ist der slave slave nur weil man Ack Enable setzt oder weil er im TWAR ne slaveadresse hat ??

    ich hät soviel fragen ich könnt n Buch schreiben und das obwohl ich das dartasheet gelesen hab


    ach übrigens ich hab ja schon angefangen und bin auch fertig nur gehts nicht
    der code oben ist nicht mehr wie ne halbe seite vieleicht würde der Herr und Meister mal n Blick draufwerfen du siehst doch gleich was falsch ist

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Naja der Code ist wohl nicht vollständig.
    Würde empfehlen, zum Testen beim Master die normalen Bascom-I2C Funktionen zu nehmen, damit man nicht an zwei Seiten gleichzeitig schrauben muß.

    Als Slave-Receiver mußt du deine Adresse setzen und EA (und EN, logo)
    Was auch kommt, du setzt immer diese Flags
    wenn &H80 kommt, liest du TWDR, das sind dann daten.

    Für Interrupt mußt du (immer) auch TWIE setzen, und global inter. enabeln (logo)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    Zitat Zitat von molleonair
    Ja so einfach ist das für mich nicht.... zum Beispiel Status $68 .. wie kann ein Slave Receiver die Arbitration verlieren ???
    Wenn ein Master verleiert, macht er sich automatsich zum Slave. Er könnte ja durch einen anderen Master angesprochen werden.

    Zitat Zitat von molleonair
    Oder was ist der not adressed slave mode
    Der Slave ist im Ruhezustand, entweder weil gerade nichts auf dem Bus los ist, oder weil sich ein Master mit einem anderen Slave unterhält. Erst wenn der Slave adressiert wird, oder wenn er sich selbst zum Master macht, wird dieser Zustand beeendet.


    Zitat Zitat von molleonair
    und wodurch definiere ich genau master und slave ?? ist der slave slave nur weil man Ack Enable setzt oder weil er im TWAR ne slaveadresse hat
    Die Slaveadresse kann man auch beim Master eingetragen lassen. Sie wird ja z.b. bei Multmaster gebraucht.
    Zum Master macht man sich, indem man das TWSTA-Bit setzt. Dann versucht das TWI, ne Startcondition abbzusetzten und sich den Bus zu krallen. Und was man gerade ist (Master oder Slave), findet man über TWSR heraus.

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.12.2005
    Ort
    @FFM
    Alter
    48
    Beiträge
    408
    Na OK ich schreib grad n neues Prog vieleicht klappt das besser

    Danke an alle

Berechtigungen

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

Labornetzteil AliExpress