Atmega8 Mit Atmega8 Verbinden mit I2C Bus verbinden

Thorsten_Sch

Mitglied
31. Okt. 2010
152
0
16
47
HH
Sprachen
  1. BascomAVR
Hallo Forum gemeinde und bastler
ich habe als 1.) alles durchgesucht ( Internet / Forums ) und bin nicht schlauer geworden.....

Mit den 1Board möchte ich als Hauptboard verwenden ( Master ), Wie vergebe ich mein 2 Board die i2c Bus adresse?.

Das 2 Board möchte ich als: ( Eingänge sowie ausgänge schalten ) ich bitte um erfolgreichen rat und tipps. tue mal den code hier rein den ich von diesen Forum Habe.....

Das ist Master ( CODE )
Code:
$regfile = "M8def.dat"                                      ' the used chip
$crystal = 8000000                                          ' frequency used
$baud = 9200                                                ' baud rate

$lib "i2c_twi.lbx"                                          ' we do not use software emulated I2C but the TWI

Config Scl = Portc.5                                        ' we need to provide the SCL pin name
Config Sda = Portc.4                                        ' we need to provide the SDA pin name

Const Atmega_slave1 = &H80



I2cinit                                                     ' we need to set the pins in the proper state


Twbr = 12                                                   'bit rate register
Twsr = 0                                                    'pre scaler bits

'Dim B As Byte , X As Byte
'Print "Mega8 TWI master demo"

'################# WO WIRD HIER B FESTGELEGT UND KANN ICH AUCH BELIEBIG A ODER Z FESTLEGEN? #######################
'################# WENN JA, WIE?#################
Do

  I2cstart
  I2cwbyte &H80
  Waitms 200                                                ' slave address write
  I2cwbyte &B00100000                                       ' write command
  Waitms 200
  I2cwbyte &B00000000
  I2cstop
Loop

End

und das hier ist der Slave ( Code )
Code:
$regfile = "m8def.dat"                                      ' the used chip
$crystal = 8000000                                          ' frequency used


Config Portd = Output

Config Pinb.2 = Output                                      ' kopletter PortD als Ausgang

Dim Twi_status As Byte
Dim Twi_data As Byte

Dim A As Byte


Declare Sub Twi_init_slave
Declare Function Twi_wait() As Byte

Twi_data = 0
Call Twi_init_slave                                         ' TWI aktivieren

' Hauptschleife
Do
    Twi_status = Twi_wait()
    If Twi_status = &H80 Then                               'Twi_data
        A = Twi_data
        If A = &B00100000 Then
        Portd.5 = 1                                         'Funkt
        Portb.2 = 1                                         'Funkt
        Else
        Portd.5 = 0                                         'Funkt
        Portb.2 = 0                                         'Funkt
        End If
    End If
Loop

End

' Unterprogramme

' TWI als slave aktivieren
Sub Twi_init_slave
    Twsr = 0                                                ' status und Prescaler auf 0
    Twdr = &HFF                                             ' default
    Twcr = &B00000100                                       ' erstmal nur TWI aktivieren
    Twar = &H80                                             ' Slaveadresse setzen
    Twcr = &B01000100                                       ' dann ACK einschalten
End Sub

' schauen ob was gekommen ist, Status zurückgeben, Daten in globale variable
Function Twi_wait() As Byte
    Local Twcr_local As Byte
    Twi_wait = &HF8
    ' warten bis TWINT gesetzt ist
    Twcr_local = Twcr And &H80
    If Twcr_local = &H80 Then
        Twi_data = Twdr                                     ' Daten sichern
        Twi_wait = Twsr And &HF8                            ' status zurückgeben
        Twcr = Twcr Or &B10000000                           ' TWINT löschen, erzeugt ACK
    End If

End Function

geht es auch verleicht irgendwie anders oder einfacher. bitte um rat.....

Gruss Thorsten sch.
 
Hallo Thorsten Sch.,

Wie die Adressen vergeben werden? Das sollte ja eigentlich aus dem Quellcode hervorgehen. Auf dem Master wird die Konstante
Atmega_Slave1 genutzt, beim Slave steht der Wert in der twi_init_slave unter TWAR= &Hxx.

Natürlich geht es auch anders. Wenn du andere Pins verwenden willst als die Hardware-TWI-Pins dann musst du das sogar anders machen. Aber einfacher wird das damit nicht weil du dann ja alles in der Software machen musst. Allerdings gibt es auch eine käufliche Twi-Slave-Lib, mit der kannst du die Pins frei wählen.

Ich habe allerdings keine Ahnung was du mit B, A und Z meinst.
 
Da es sich um Bascom zu handeln scheint, nehmen wir einfach mal Dirks neuestes Forenfeature:
Master-Code:


CodeBox BascomAVR
$regfile = "M8def.dat"                                      ' the used chip
$crystal = 8000000                                          ' frequency used
$baud = 9200                                                ' baud rate

$lib "i2c_twi.lbx"                                          ' we do not use software emulated I2C but the TWI

Config Scl = Portc.5                                        ' we need to provide the SCL pin name
Config Sda = Portc.4                                        ' we need to provide the SDA pin name

Const Atmega_slave1 = &H80



I2cinit                                                     ' we need to set the pins in the proper state


Twbr = 12                                                   'bit rate register
Twsr = 0                                                    'pre scaler bits

'Dim B As Byte , X As Byte
'Print "Mega8 TWI master demo"

'################# WO WIRD HIER B FESTGELEGT UND KANN ICH AUCH BELIEBIG A ODER Z FESTLEGEN? #######################
'################# WENN JA, WIE?#################
Do

  I2cstart
  I2cwbyte &H80
  Waitms 200                                                ' slave address write
  I2cwbyte &B00100000                                       ' write command
  Waitms 200
  I2cwbyte &B00000000
  I2cstop
Loop

End

In Zeile 3 wird eine untypische Baudrate vorgegeben (per Direktive) - allerdings wird der UART später nicht genutzt. Absicht?
In Zeile 5 wird 'ne Bibliothek eingebunden, welche statt der Standard-Bibliothek die Befehle TWI betreffend bereitstellt (insbesondere scheint Hardware-TWI möglich zu sein)
In Zeile 10 wird (wie von Stevie angesprochen) die Slave-Adresse als Konstante hinterlegt. Allerdings wird diese Konstante später (Zeile 28) nicht verwendet - dort steht 0x80 doch wieder direkt.
In den Zeilen 7 und 8 wird das TWI-Interface (über die Bibliothek) vorbereitet und in Zeile 14 letztendlich ausgeführt.
In Zeile 17 und 18 allerdings wird nachträglich nochmal an der Bitrate und dem Prescaler rumgeschraubt - direkt über die I/O-Register, also ohne die Bibliothek zu nutzen. Das scheint etwas inkonsequent.
In Zeile 20 würden unter 2 Variablennamen (B und X) je ein Byte im SRAM alloziiert werden, wenn der Code nicht auskommentiert wäre, diese Variablen tauchen später nicht auf.
Die Antwort deine Frage in Zeile 22, 23 lautet also: für B wird (da auskommentiert) weder Speicherplatz alloziiert, noch ein Wert zugewiesen. Natürlich kannst Du auch andere Variablennamen vergeben (die Allerdings 'ne maximale Länge haben dürfen, bestimmte Zeichen nicht haben dürfen, noch nicht anderweitig verwendet sein dürfen (insbesondere keine reservierten Wörter="Instruktionen").
Mit
Code:
Dim [I]Name[/I] As [I]Typ[/I]
wird der Speicher alloziiert, mit
Code:
[I]Name[/I]=[I]Wert[/I]
eben ein Wert zugewiesen.
Ob Bascom erlaubt, beides in einer Zeile zusammenzufassen, weiß ich nicht. Kannst ja ausprobieren (ob Bascom da meckert). Der Wert kann natürlich auch irgend'ne Berechnung sein.
In Zeile 21 würde der Text (mit 9200 baud über den von Bascom voreingestellten UART) ausgegeben werden - wenn der Code nicht auskommentiert wäre.

In der Hauptschleife (ab Zeile 25 bis Zeile 34) wird ununterbrochen dasselbe Telegramm via TWI gesendet:
Startkondition
0x80 (=Slave-Adresse, direkt vorgegeben)
0x20
0x00
Stopkondition

Zwischen den 3 Bytes wartet der Master zusätzlich je 'ne Fünftelsekunde (wozu auch immer).

Das End in Zeile 36 erzeugt nochmal 'ne leere Endlosschleife, die keine Funktion hat (da Dein Programm dort nie ankommt) - nutzloser aber eben auch unschädlicher Code...
Im Slave wird keine solche Bibliothek genutzt (weiß nicht, ob es eine solche gibt) stattdessen sind die entsprechenden Routinen im Code enthalten. Könntest Du natürlich auch in 'ne externe Datei (Bibliothek) auslagern, obs dadurch wirklich einfacher wird ist Ansichtssache...
 
ATmega8 mit Atmega8 verbinden mit I2C Bus

hallo Forum Gemeinde und (Lotadac u. StevieL)

Hab erst mal vieen dank ich werde mich mal bemühen um es hinzubekommen? braucht man diese LIB datei eigendlich?

Gruß Thorsten Sch.
 
Prinzipiell brauchst Du so'ne Bibliothek nicht. Du kannst den Master auch anlog zu dem Slave Programm da oben direkt über die I/O-Register ansteuern. Wenn Du ohne die lib einzubinden da oben dieselben Befehle nutzt (icwbyte usw), wird irgend'ne Bascom-Standard-Bibliothek verwendet, die den TWI aber in Software implementiert.
 
Mit der Bibliothek ist das erzeugte Programm etwas kleiner, wenn ich das noch richtig in Erinnerung habe. Die wird dann eingesetzt, wenn du die Hardware-TWI-Pins verwendest. Wenn du beim Master andere Pins verwenden willst, musst du die weglassen.
Beim Slave wird die LIB nicht verwendet, da sie nur Routinen für den Master beinhaltet. Aber wie LotadaC schon geschrieben hat, könnte man beim Master auch alles über die TWI-Register abwickeln.

Google mal nach RN-Wissen und TWI. Da werden die Register gut erklärt. Und dann klickst du bei den Links am Ende der Seite auf TWI-Praxis.
Da wird das Thema dann ausführlich behandelt. Sowohl Master als auch Slave mit Bascom-Beispielen.

Das funktioniert übrigens gut. Ich habe schon seit Jahren mehrere Slaves mit einem Master verbunden. Und die werkeln ohne Ausfälle brav vor sich hin. Beim Master verwende ich die Standardfunktionen von Bascom, bei den Slaves arbeite ich auch mit den TWI-Registern.
 
Sofern ich das recht in Erinnerung habe, wird auch bei der Bibliothek Soft-TWI umgesetzt, wenn man andere (nicht Hardware-Pins) zuweist. Hatte das hier irgendwo mal reassembliert (allerdings ist die lib AFAIK nicht öffentlich, deswegen also auch nichts davon hier reingestellt)...

Hmm... nach TWI (und mir als Autor) kann man nicht suchen...
 
Danke, im Prinzip ging's hier los.

Bascom selbst unterstützt ohne diese lib nur soft-TWI. Mit lib hard-TWI. Beide bieten teilweise dieselben Befehle (i2cstart, i2cstop usw), implementieren sie aber eben in Soft- oder Hardware. Andererseits wird die Bitrate im Soft-TWI mit Config I2cdelay, und im Hard-TWI mit Config TWI festgelegt.

Unklar ist mir immer noch, ob sich die Zuweisung der SDA, SCL-Beine nur auf Soft-TWI beschränkt, bzw was geschieht wenn man mit der Lib (Hardware) andere Beine zuweist.

Prinzipiell sollte sich ja auch sowas realisieren lassen:
ein TWI in Hardware mit den echten TWI-Beinen
ein TWI in Software mit anderen Beinen. Der AVR kann das, aber Bascom nicht mit dieser Bibliothek und der Standard-Bibliothek (also insbesondere nicht mit i2cstart und co für beides...
Oder kann man da mittlerweile (ähnlich der seriellen Kommunikation) mit #1 oder so "Kanäle" vorgeben?

P.S.: auf meinem neuen Rechner habe ich jetzt die aktuellsten Versionen von Bascom und dem Studio -> da geht das Reassemblieren wieder nicht (also ich bekomme nur den Bascom-Code im Studio angezeigt, den dieses nicht interpretiert. Irgendwie paßt das Bascom-ObjectFile nicht mehr, oder das HEX wird nicht verwendet oder... ich weiß es nicht...
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)