2 ATMega8Boards per TWI (I²C-Bus) verbinden

Hoschi79

Neues Mitglied
21. Feb. 2011
2
0
0
Sprachen
Ich:stupido2: und zwei Schulkollegen versuchen zwei ATMega8-Controllerboards mittels TWI(I²C-Bus) zu verbinden und jeweils als Master oder Slave im Transmitter- bzw. Receiverbetrieb zu benutzen.
Bisher klappte es nur in einer Richtung (MasterTransmitter <-> SlaveReceiver bzw. MasterReceiver <-> SlaveTransmitter). Kann uns jemand ggf. eine kleine Hilfestellung geben?
[II] Bislang funktioniert es nur mit einem Slave. Einen zusätzliches Slaveboard bzw. veränderte Slave-Adresse schlug fehl.

MFG Hoschi
 
Hallo Hoschi!

Willkommen im AVR-Praxis Forum! :ciao:

Es gibt hier einige User, die sich mit I2C auskennen und auch einen AVR als Slave laufen lassen....
Es wäre aber erst einmal interessant, in welcher Sprache ihr überhaupt programmiert und was ihr bis jetzt versucht habt.

Stell doch mal deinen Code hier rein, dann können sich die User das mal ansehen und ggf. neue Ansätz liefern, oder Hinweise geben.


Gruß,
Cassio



Ich:stupido2: und zwei Schulkollegen

Wie sangen doch schon die Ärzte vor zig Jahren:
ICH und meine Kumpels, wir sind ein tolles Team....... :rolleyes:
 
Hallo Hoschi,

Bisher klappte es nur in einer Richtung (MasterTransmitter <-> SlaveReceiver bzw. MasterReceiver <-> SlaveTransmitter). Kann uns jemand ggf. eine kleine Hilfestellung geben?

MMehr geht auch nicht. Du hast immer einen Master und mehrere Slaves.
Sonst mußt du ein Multimaster-System bauen bei dem ein Master die
Kontrolle an einen anderen weitergeben kann. Das geht zwar aber ist
nicht ganz so einfach. Ließ dir dafür am besten erstmal die Dokus von
Philips für den I2C-Bus durch. Das sind zwar einige Seiten und alles in
Englisch aber da steht alles drin was man für Multimaster, Highspeed,
Erweiterte I2C-Adressen, ... usw benötigt. Dann kann man das Verfahren
was dafür auf dem Bus ablaufen muß besser verstehen.

[II] Bislang funktioniert es nur mit einem Slave. Einen zusätzliches Slaveboard bzw. veränderte Slave-Adresse schlug fehl.
:confused: Da liegt wohl dann was in der Software ... Aber ohne das
Programm (in voller Schönheit) ist das wohl etwas schwierig mit der
Diagnose ...

Gruß
Dino
 
re: 2 Atmega8Boards per TWI (I²C-Bus)

Hallo zusammen..

Die beiden AVR ATMega8-Boards hatten wir schon per I²C-Bus verbunden. Es funktionierte nur soweit, dass der Master als Transmitter und der Slave als Receiver arbeitet bzw. umgekehrt. Aber es klappte nicht beides und die Anbindung des myEthernet-Moduls von AVR gestaltet sich schwieriger als gedacht.

init:
ldi r16,LOW(RAMEND)
out spl,r16
ldi r16,HIGH(RAMEND)
out sph,r16
ldi r16,0x00
out ddrc,r16 ;PC zur Eingabe
ldi r16,0xff
out portc,r16 ;Pull Up für Port C
ldi r16,0xf0
out ddrd,r16
ldi r16,0x0f
out portd,r16
ldi r16,0x0a ;Wert für den Bitregister
out twbr,r16 ;Bitdatenregister laden
ldi r16,0x00 ;Wert für den Statusregister
out twsr,r16 ;Statusregister laden
start:
rcall zeit
sbis pinc,0 ;springe, wenn PC0=1
rjmp twi_mr ;sonst bei s1 weiter
rjmp twi_mt ;wiederhole

;#############################################################################
; * Master als Receiver *
;#############################################################################

twi_mr:
ldi r16,0b10100100 ;TWINT=1 - TWSTA=1 - TWEN=1
out twcr,r16 ;Start-Bedingung senden
twi_mr1:
in r16,twcr ;Controlregister holen
sbrs r16,twint ;springe, wenn TWINT=1
rjmp twi_mr1 ;sonst warte bis TWINT=!
in r16,twsr ;Statusregister holen
andi r16,0xf8 ;TWPS1|2 maskieren
cpi r16,$08 ;Start-Bedingung erfolgreich gesendet?
brne twi_mr ;Fehleranzeige
ldi r16,0b00000011 ;Wert für Datenregister
out twdr,r16 ;Slave-Adresse=0b0000001 - R/W=1 (SLA+R)
ldi r16,0b10000100 ;TWINT=1 - TWEN=1
out twcr,r16 ;SLA+R senden
twi_mr2:
in r16,twcr ;Controlregister holen
sbrs r16,twint ;springe, wenn TWINT=1
rjmp twi_mr2 ;sonst warte auf TWINT=1
in r16,twsr ;Statusregister holen
andi r16,0xf8 ;TWPS1|2 maskieren
cpi r16,$40 ;SLA+R erfolgreich gesendet?
brne twi_mr ;Fehleranzeige
ldi r16,0b10000100 ;TWINT=1 - TWSTA=0 - TWEN=1
out twcr,r16 ;Datenübertragung starten
twi_mr3:
in r16,twcr ;TWI Control-Register holen
sbrs r16,twint ;springe, wenn TWINT = 1
rjmp twi_mr3 ;warte auf TWINT=1
in r16,twsr ;TWI Status-Register holen
andi r16,0xf8 ;TWPS1|2 maskieren
cpi r16,0x58 ;Daten erfolgreich empfangen?
brne twi_mr ;sonst Fehleranzeige
in r17,twdr ;Daten holen
rcall ausgabe ;und ausgeben
ldi r16,0b10010100 ;TWINT=1 - TWSTO=1 - TWEN=1
out twcr,r16 ;Stop-Bedingung senden
rjmp start

ausgabe:
andi r17,0xf0 ;unteres Nibble maskieren
out portd,r17 ;oberes Nibble ausgeben
ret


;#############################################################################
; * Master als Transmitter *
;#############################################################################

twi_mt:
in r17,pind ;Daten holen
ldi r16,0b10100100 ;TWINT=1 - TWSTA=1 - TWEN=1
out twcr,r16 ;Start-Bedingung senden
twi_mt1:
in r16,twcr ;Controlregister holen
sbrs r16,twint ;springe, wenn TWINT=1
rjmp twi_mt1 ;sonst warte bis TWINT=1
in r16,twsr ;Statusregister holen
andi r16,0xf8 ;TWPS1|2 maskieren
cpi r16,$08 ;Start-Bedingung erfolgreich gesendet?
brne fehler ;Fehleranzeige
ldi r16,0b00000010 ;Wert für Datenregister
out twdr,r16 ;Slave-Adresse=0b0000001- R/W=0 (SLA+W)
ldi r16,0b10000100 ;TWINT=1 - TWEN=1
out twcr,r16 ;SLA+W senden
twi_mt2:
in r16,twcr ;Controlregister holen
sbrs r16,twint ;springe, wenn TWINT=1
rjmp twi_mt2 ;sonst warte auf TWINT=1
in r16,twsr ;Statusregistern holen
andi r16,0xf8 ;TWSP1|2 maskieren
cpi r16,$18 ;SLA+W erfolgreich gesendet?
brne fehler ;Fehleranzeige
andi r17,0x0f
out twdr,r17 ;TWI-Register laden
ldi r16,0b10000100 ;TWINT=1 - TWEN=1
out twcr,r16 ;Datenübertragung starten
twi_mt3:
in r16,twcr ;TWI Control-Register holen
sbrs r16,twint ;springe, wenn TWINT=1
rjmp twi_mt3 ;warte auf TWINT=1
in r16,twsr ;TWI Status-Register holen
andi r16,0xf8 ;TWPS1|2 maskieren
cpi r16,0x28 ;Daten erfolgreich gesendet?
brne fehler ;sonst Fehleranzeige
ldi r16,0b10010100 ;TWINT=1 - TWSTO=1- TWEN=1
out twcr,r16 ;Stop Bedingung senden
rjmp start


:banghead: Wenn alle stricke reißen, setzen wir als alternative an SPI.....
Danke nochmals für Eure Hilfestellung!

MFG Hoschi
 
Hi
Was mir beim Überfliegen der Codezeilen so auffiel: es gibt schon einen Ansatz zur Gliederung.....:rolleyes:
Aber, Jungs, warum benutzt ihr nicht mal so ein paar leerzeichen zum Einrücken ? So ist der Code doch nicht lesbar, da werdet ihr selber noch Probleme mit bekommen..
Schaut mal:
Code:
;----------------Blinker Summer aktivieren ----------------------
;*****************************************************
;* Auch hier wird Hilfsbyte Out_Ctrl genutzt, um den Summer zu	     *
;* steuern, da die Frequenz für den Summer in der Timer-ISR gebildet  *
;* wird							     *
;* Out_Ctrl :  	Bit 5 = 	Summer Freigabe			     *    
;*****************************************************		
Summer:	
	LDS	a0, Old_In	; letzten gültigen Eigänge lesen
	ANDI	a0, 0b00001000	; Blinker "Ein" prüfen
	BREQ 	Summer_Off	; wenn nicht gesetzt, dann Summer aus

	LDS	a0, Out_Ctrl
	ORI	a0, 0b00100000	
	STS	Out_Ctrl, a0	; Ausgabekontrollbit setzen
	RJMP	Summer_End

Summer_Off:
	LDS	a0, Out_Ctrl
	ANDI	a0, 0b11011111	; Ausgabekontrollbit  rücksetzen
	STS	Out_Ctrl, a0
	
Summer_End:	
	
RET
Ich wil nicht damit sagen, das es unbedingt so aussehen muß, aber die einzelnen Programmroutinen sollten schon mit einem Blick voneinander unterschieden werden können. Leerzeichen kosten keinen Speicherplatz.
Ihr habt zwar wunderschön eure Zeilen Kommentiert, aber da kein Raum, kein Absatz im Listing ist, erschweren die Kommentare noch das Lesen des Codes. Ich kenne zwar eure Hardware nicht, aber da ihr in Assembler arbeitet, könnt ihr möglcherweise mein Programm OpenEye nutzen. Es ermöglicht die Visualisierung der Variablenwerte zur Laufzeit im µC. Ihr findet das Programm hier im Forum. Einfach mal danach suchen.
Gruß oldmax
 

Ü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)