2 Atmega8Boards per TWI I²C-Bus

Microcontroller PIC und Atmel AVR

Microcontroller PIC und Atmel AVR

Moderator: Moderatorengruppe

2 Atmega8Boards per TWI I²C-Bus

Neuer Beitragvon Hoschi79 am Sonntag 20. Februar 2011, 17:08

Ich :roll: und zwei Schulkollegen versuchen zwei ATmega8-Controllerboards mittels TWI(I²C-Bus) zu verbinden und jeweils als Master/Slave im Transmitter- bzw. Receiverbetrieb zu benutzen.
[I] Bisher klappte es nur in einer Richtung (MT <-> SR bzw. MR <-> ST). Kann uns jemand ggf. eine kleine Hilfestellung geben?
[II] Bislang funktioniert es nur mit einem Slave. Einen zusätzlicher Slaveboard bzw. veränderte Slave-Adresse schlug fehl. Vielleicht hat dahingehend jemand auch eine geistreiche Inspiration für uns?!?
Ich danke schonmal im voraus!

MFG Ho
Hoschi79
Threadstarter
41923
 
Beiträge: 2
Registriert: Sonntag 20. Februar 2011, 17:04
Postleitzahl: 46145
Land: Germany / Deutschland

Re: 2 Atmega8Boards per TWI I²C-Bus

Neuer Beitragvon BlueHazzard am Sonntag 20. Februar 2011, 18:33

Hallo,
dass ich dir helfen kann, brauch ich noch ein paar Informationen:
Welche Programmiersprache benutzt ihr?
Kann man die relevanten Codeausschnitte sehen?
Was soll bei MT-->SR und MR-->SR falsch sein? (Außer dass man fast nicht versteht was es zu bedeuten hat) I²C ist kein voll-duplex Bus.
Habt ihr das auf einer Lochraster aufgebaut?
Logikanalyzer oder Oszi zur Verfügung?

mfg
ich würde gern die Welt verbessern, aber Gott gibt mir den Quellcode nicht....

Rechtschreibfehler sind GRATIS!!!!

übernehme keine Verantwortung für Schäden die auf Grund von Falschen Tipps meinerseits entstehen
Benutzeravatar
BlueHazzard
41926
Silber Mitglied
 
Beiträge: 204
Registriert: Mittwoch 21. März 2007, 20:14
Wohnort: Italien
Postleitzahl: 00000
Land: other / Anderes

Re: BlueHazzard

Neuer Beitragvon Hoschi79 am Montag 21. Februar 2011, 09:47

Hi BlueHazzard..

Wir benutzen den Assembler und die Simulatorsoftware von/für Atmelprozessoren. Mit MT/ST bzw. SR/MR war der Modus gemeint: Master / Slave als Tansmitter bzw. Slave / Master als Receiver.

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





MFG Hoschi
Hoschi79
Threadstarter
41940
 
Beiträge: 2
Registriert: Sonntag 20. Februar 2011, 17:04
Postleitzahl: 46145
Land: Germany / Deutschland

Re: 2 Atmega8Boards per TWI I²C-Bus

Neuer Beitragvon BlueHazzard am Montag 21. Februar 2011, 10:44

Hallo,
mit Assembler bin ich doch schon etwas aus der Übung :evil: . Also was ich so beim drüber schauen gesehen habe, ist, dass ihr Die Adresse 0000000 benutzt. Diese ist aber Reserviert für einen "general call" und für die Startbedingung... Also niemals diese Adresse benutzen! (siehe http://www.nxp.com/acrobat_download/use ... 0204_3.pdf)
Des weiteren weiß ich immer noch nicht, was du mit
Hoschi79 hat geschrieben:s funktionierte nur soweit, dass der Master als Transmitter und der Slave als Receiver arbeitet bzw. umgekehrt

meinst. Es kann nur einer Master sein, und mehrere andere Slave. Eine Kommunikation kann immer nur der Master beginnen. Dieser entscheidet dann ob er Sendet (Transmitter) oder empfängt (Receiver). Was funktioniert dann hier nicht? Wenn du mit dem Master Senden und Empfangen kannst, dann wird es doch funktionieren. Mit einem Beispiel wäre mir vielleicht geholfen.
so allà:
Master sendet Adresse+R
Slave sendet ACK
Master sendet Daten
Slave sendet ACK (oder eben nicht)
usw...

Habt ihr irgend eine Möglichkeit euch Daten anzeigen zu lassen? Display, RS232, USB? Da du meine Frage zum Logikanalyzer nicht beantwortet hasst nehme ich einfach an, dass du keinen hast....

Ein weiterer Tipp: Differenziert mehr zwischen den Fehlern. Ihr meldet einfach nur "Fehler" aber ihr seht nicht wo die Kommunikation fehlschlägt. Baut also Fehler1, Fehler2 usw ein, um den Fehler einzugrenzen.

Und zum guten Schluss, was hat das myEthernet-Module jetzt mit dem ganzen zu tun?

mfg.
ich würde gern die Welt verbessern, aber Gott gibt mir den Quellcode nicht....

Rechtschreibfehler sind GRATIS!!!!

übernehme keine Verantwortung für Schäden die auf Grund von Falschen Tipps meinerseits entstehen
Benutzeravatar
BlueHazzard
41941
Silber Mitglied
 
Beiträge: 204
Registriert: Mittwoch 21. März 2007, 20:14
Wohnort: Italien
Postleitzahl: 00000
Land: other / Anderes


Zurück zu Atmel AVR Pic und C Control

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste