-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: Grundsatzfrage - I2C vs. 1Wire

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2005
    Beiträge
    161

    Grundsatzfrage - I2C vs. 1Wire

    Anzeige

    Ich schon wieder,

    nachdem ich jetzt ewig mit I2C rumgetan habe und nicht richtig weitergekommen bin mal ne grunsätzliche frage.

    Habe folgendes vor:

    2 x M8, 1x M16/32

    Die beiden M8 sollen dem M16/32 nach Aufforderung Daten bereitstellen. Dies sind aber nicht nur Bytes sondern auch Long Variablen.

    Mit I2C krieg ich das mit den Bytearrays nicht geregelt.

    So nun denke ich über 1Wire nach.

    Ist das nun für meinen Fall besser geeignet? Ich habe mir die Bascom Hilfe angesehen und ich denke das ist einfacher über 1Wire zu machen. Da kann ich ohne Probs. Arrays hin und her schicken so wie ich es schon mit UART/RS232 gewohnt bin.

    Liege ich da richtig, oder gibt es bei 1Wire auch so versch. Tücken?

    Gruß

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Will den 1-wire nicht schlecht machen, aber ich find, wenn HW-TWI (I2C) vorhanden ist, ist ein kreuz-und-quer Betrieb damit schon recht gut zu lösen. Weiß nicht, was dein Problem mit byte-arrays ist ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    ........Liege ich da richtig, oder gibt es bei 1Wire auch so versch. Tücken?

    Den "Erlkönig-Bus" gibt es (noch) nicht.
    Irgendwo sind immer Fallstricke die Einarbeitung oder Aufwand erfordern.
    Gruß
    Ratber

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2005
    Beiträge
    161
    Hallo Ihr zwei,

    war schon länger nicht mehr hier...

    Mir ist irgendwie der HW TWI auch lieber nur schnalle ich das nicht mit der Long/array geschichte.

    Hier der Code. Mit dem einzelnen Byte gehts wunderbar, mit dem Array nicht.

    Master
    Code:
    $regfile = "M8def.dat"
    $crystal = 3686000
    $baud = 9600
    
    $lib "i2c_twi.lbx"
    
    Config Timer1 = Timer, Prescale = 8
    Const Timervorgabe = 19456
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , E = Portd.3 , Rs = Portd.2 , Db7 = Portd.7 , Db6 = Portd.6 , Db5 = Portd.5 , Db4 = Portd.4
    
    Config Scl = Portc.5
    Config Sda = Portc.4
    
    I2cinit
    
    Config Twi = 100000
    
    
    Declare Sub Datenholen
    Declare Sub Zeittakttimer1
    
    
    
    Dim B As Byte
    Dim C As Byte
    Dim D As Long
    Dim Buf(4) as Byte
    '***** geht nicht************
    Dim Buf(4)as Byte at D overlay
    '**************************
    
    Dim Ttakt As Byte
    
    
    Ttakt = 0
    B = 0
    
    Cls
    Cursor Off
    
    Enable Timer1
    Enable Interrupts
    
    On Timer1 Zeittakttimer1
    
    Locate 1 , 1
    Lcd "TWI master"
    
    Do
    
    
    
    
    
    If Ttakt = 5 Then Gosub Datenholen
    
    Locate 2 , 1
    Lcd "Startzeichen: " ; Chr(32) ; Chr(32) ; B ; Chr(32) ; Chr(32)
    
    Locate 3 , 1
    Lcd "Wert: " ; Chr(32) ; Chr(32) ; C ; Chr(32) ; Chr(32)
    Locate 4 , 1
    Lcd "Error : " ; Err
    
    Incr B
    
    Loop
    
    
    
    Datenholen:
    
    I2creceive &H40 , Buf(1) , 0 , 1
    C = Buf(1)
    B = 0
    Ttakt = 0
    
    '***das geht nicht*********** 
    I2creceive &H40, Buf(4), 0, 4
    C = Buf(1), 4
    B=0
    Ttakt =0
    '*************************
    Return
    
    Zeittakttimer1:
    Incr Ttakt
    Timer1 = Timervorgabe
    Return
    
    
    End
    Slave
    Code:
    $regfile = "m8def.dat"
    $crystal = 7372800
    ' $baud = 9600
    $lib "i2c_twi-slave.lbx"
    
    Config Pinc.0 = Output                                      'LED1
    Config Pinc.1 = Output                                      'LED2
    
    Config Twislave = &H40, Btr = 2, Bitrate = 100000
    
    
    Config Scl = Portc.5                                        ' Ports fuer IIC-Bus
    Config Sda = Portc.4
    
    Enable Interrupts
    
    Dim C As Byte
    
    '******geht nicht*******
    Dim C as Long
    Dim D(4) as Byte at C overlay
    '*************************
    
    C = 0
    D=0
    
    Do
    
    Portc.1 = 1
    Incr C
    Incr D
    Waitms 25
    Portc.1 = 0
    Waitms 25
    Loop
    
    
    'i2c Twi Sub
    '--------------------------------
    Twi_stop_rstart_received:
    
    Return
    '--------------------------------
    
    Twi_addressed_goread:
    
    Return
    '--------------------------------
    
    Twi_addressed_gowrite:
    Portc.0 = 1
    Twi = C
    '*****geht nicht*****
    Twi = D(1) , 4
    '******************
    Portc.0 = 0
    Return
    '--------------------------------
    
    Twi_gotdata:
    
    Return
    '--------------------------------
    
    
    Twi_master_needs_byte:
    
    Return
    '--------------------------------
    
    Twi_master_need_nomore_byte:
    
    Return
    
    
    
    
    
    End
    Habt Ihr zwei ne Idee?? Arbeite mit der neuesten Bascom Version und dr TWI-Slave lib.

    Merci
    Gruß

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    So auf die Schnell hab ich das auch nicht exact im Kopf aber ich meine die Definition sollte andersrum sein.

    Versuch mal

    Dim Buf(4) as Byte
    Dim D As Long At Buf Overlay
    Gruß
    Ratber

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569

    Re: Grundsatzfrage - I2C vs. 1Wire

    Zitat Zitat von m@rkus33
    So nun denke ich über 1Wire nach.

    Ist das nun für meinen Fall besser geeignet? Ich habe mir die Bascom Hilfe angesehen und ich denke das ist einfacher über 1Wire zu machen.
    Vergiss es, soviel ich weiss ist 1 Wire in der Slave Version insofern geschützt, das dieses nur als Hardware zu implettieren ist.
    Nicht umsonst findet man recht wenige Beispiele zum Thema 1 Wire Slave (mir ist exakt eine Impletierung in Software bekannt!)... und recht viele zum Thema 1 Wire Master.

    Ich denke mal, du solltest deine I2C Kommunikationsroutinen vielleicht einmal etwas überdenken.

    Grüße,
    Hanni
    Grundregeln des Forenpostings:
    1. Nutze niemals die Suchfunktion!
    2. Überprüfe niemals die Topics nach Ähnlichkeiten!
    3. Schreibe alles in hellgelb!

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Moment.

    Was erwartest du, daß er da tut ?
    Twi = D(1) , 4
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Zum Thema 1wire Slave:

    Ich hab mich auch schon an einer 1wire Slave implementation versucht.
    So richtig hat das nicht funktioniert. Das Hauptproblem ist das timing.
    Wenn Du in deinen Slave Controllern alle anderen Interrupts abschaltest könnte es gehen, ansonsten sind die Zeitfenster so knapp, das während einer 1wire Abfrage kein weiterer Interrupt mehr auftreten darf.

    Im Zweifelsfall würd ichs dann doch mit SPI probieren, wenn das verdrahtungstechnisch geht. Oder Du kämpfst dich doch noch mal in I²C rein.

    Eine long int in einzelne Bytes zu Zersägen ist für Assembler eigentlich kein Problem.

    Wie wärs, wenn Du dir eine Sub Routine Schreibst die eine long int Variable erwartet und 4 char's zurückgibt ?

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2005
    Beiträge
    161
    Danke für Eure Antworten

    also ich bin nun überzeugt, das nur I2C hier in Frage kommt.

    @PickNic
    Das war natürlich Blödsinn

    @Ratber
    es ist egal wie rum ich es schreibe das Resultat ist immer das gleiche

    Ich habe nun das Problem, das das der Master nun von -65550 auf null zählt.

    Was ist denn nu faul? Irgend ne Idee?

    Hier der code vom Master:
    Code:
    $regfile = "M8def.dat"
    $crystal = 3686000
    $baud = 9600
    
    
    
    $lib "i2c_twi.lbx"
    
    Config Timer1 = Timer , Prescale = 8
    Const Timervorgabe = 19456
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , E = Portd.3 , Rs = Portd.2 , Db7 = Portd.7 , Db6 = Portd.6 , Db5 = Portd.5 , Db4 = Portd.4
    
    Config Scl = Portc.5
    Config Sda = Portc.4
    
    I2cinit
    
    Config Twi = 100000
    
    
    Declare Sub Datenholen
    Declare Sub Zeittakttimer1                                  'alle 1/10 Sekunden Timer1 overflow
    
    
    
    Dim B As Byte
    
    'Dim C As Long
    'Dim Buf(4) As Byte At C Overlay
    
    Dim Buf(4) As Byte
    Dim C As Long At Buf Overlay
    
    Dim Ttakt As Byte
    
    
    Ttakt = 0
    B = 0
    C = 0
    
    Cls
    Cursor Off
    
    Enable Timer1
    Enable Interrupts
    
    On Timer1 Zeittakttimer1
    
    Locate 1 , 1
    Lcd "TWI master"
    '-------------------------------------------------------------------
    Do
    
    If Ttakt = 5 Then Gosub Datenholen
    
    Locate 2 , 1
    Lcd "Startzeichen: " ; Chr(32) ; Chr(32) ; B ; Chr(32) ; Chr(32)
    
    Locate 3 , 1
    Lcd "Wert: " ; Chr(32) ; Chr(32) ; C ; Chr(32) ; Chr(32)
    Locate 4 , 1
    Lcd "Error : " ; Err
    
    Incr B
    
    Loop
    '-------------------------------------------------------------------
    
    
    Datenholen:
    
    I2creceive &H40 , Buf(1) , 0 , 4
    'C = Buf(1)
    B = 0
    Ttakt = 0
    Return
    
    Zeittakttimer1:
    Incr Ttakt
    Timer1 = Timervorgabe
    Return
    
    
    End

    und der Slave:
    Code:
    $regfile = "m8def.dat"
    $crystal = 7372800
    ' $baud = 9600
    $lib "i2c_twi-slave.lbx"
    
    Config Pinc.0 = Output
    Config Pinc.1 = Output
    
    Config Twislave = &H40 , Btr = 2 , Bitrate = 100000
    
    
    Config Scl = Portc.5
    Config Sda = Portc.4
    
    Enable Interrupts
    
    Dim C As Long
    Dim D(4) As Byte At C Overlay
    
    
    C = 0
    
    Do
    
    Portc.1 = 1
    Incr C
    
    Waitms 25
    Portc.1 = 0
    Waitms 25
    Loop
    
    
    'i2c Twi Sub
    '--------------------------------
    Twi_stop_rstart_received:
    
    Return
    '--------------------------------
    
    Twi_addressed_goread:
    
    Return
    '--------------------------------
    
    Twi_addressed_gowrite:
    Portc.0 = 1
    Twi = D(1)
    
    Portc.0 = 0
    Return
    '--------------------------------
    
    Twi_gotdata:
    
    Return
    '--------------------------------
    
    
    Twi_master_needs_byte:
    
    Return
    '--------------------------------
    
    Twi_master_need_nomore_byte:
    
    Return
    
    
    
    
    
    End
    muss wohl noch viel lernen oder bin ich schon zu alt dafür???

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Hast du mal nur aus jux die I2C Bitraten runtergesetzt um auszuschlissen das hier einfach nur Latenzproblem auftreten ?

    Prüf das einfach mal mit 1000 nach.
    Gruß
    Ratber

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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