PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C zwischen atmeg32



Jada
24.06.2010, 17:02
Hallo,
ich habe ein Problem. Ich möchte RGB's über ein I2C Slave anstueren.
Unten habe ich I2C Master und ein I2C Slaver Programm aufgeführt. Ich möchte wissen wie der I2C Slaver erkennt welcher Port angesprochen wird. Kann mir bitte jemand helfen?

Master:


$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
Config SCL = Portc.0
Config SDA = Portc.1

$lib "I2c_twi.lbx"

Config Twi = 400000


Const Slave1 = &HC0 'I2C Adresse slave1
Const Slave2 = &HC2 'I2C Adresse slave2
Const Slave3 = &HC4 'I2C Adresse slave3


Dim Status As Byte

Wait 2 'Warte 2 Sekunden
I2cinit 'Bus initialisieren

Do

Status = 1

I2cstart
I2cwbyte Slave1 'Slave1 ansprechen
I2cwbyte Status 'Status
I2cstop

Waitms 1000

I2cstart
I2cwbyte Slave2 'Slave2 ansprechen
I2cwbyte Status 'Status
I2cstop

Waitms 1000

I2cstart
I2cwbyte Slave3 'Slave3 ansprechen
I2cwbyte Status 'Status
I2cstop

Waitms 1000


Loop

End


Slaver:


$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600

Config Portc = Output ' kompletter Portc als Ausgang

Dim Twi_control As Byte ' Controlregister lokale kopie
Dim Twi_status As Byte
Dim Twi_data As Byte

Dim Neuesbyte As Byte ' Bytemerker

Declare Sub Twi_init_slave

Twi_data = 0
Call Twi_init_slave ' TWI aktivieren

' alle LEDs ein
Portc = 0

' Hauptschleife
Do

' Merker zurücksetzen
Neuesbyte = 0

' schauen ob TWINT gesetzt ist
Twi_control = Twcr And &H80 ' Bit7 von Controlregister

If Twi_control = &H80 Then
Twi_status = Twsr And &HF8 ' Status

' wurde ein Byte geschickt
If Twi_status = &H80 Or Twi_status = &H88 Then
Twi_data = Twdr ' neue Daten merken
Neuesbyte = 1 ' merken das ein neues Byte da ist
End If

' TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
End If

' wenn ein neues Byte gekommen ist, LEDs einschalten
If Neuesbyte <> 0 Then
Portc = 1 ' LEDs einschalten
End If

Loop

End


' Unterprogramme


' TWI als slave aktivieren
Sub Twi_init_slave
Twsr = 0 ' status und Prescaler auf 0
Twdr = &HFF ' default
Twar = &HC0 ' Slaveadresse setzen
Twcr = &B01000100 ' TWI aktivieren, ACK einschalten

End Sub

Richard
24.06.2010, 20:18
Warum eigentlich SO kompliziert? Bascom hat doch für Senden
und Empfangen eigene Befehle! Schau Dier doch einmal die Demos
an!

In der Zeit in welcher DU an diesem Thema herumstolperst, habe ich
Einen US Entfernungssensor auf ein Servo geklebt. Aus den Demos
für Servos und den Demo für den US Sensor ein Programm zueammen
Kopiert mit dem ich fast 360 Grad in 15 Grad schritten Hindernisse
feststellen kann. Das hat maximal 2 h gedauert. Kann man sicherlich
verfeinern, aber zum testen und lernen wie es im Prinzip geht sind
die Bascom Beispiele echt sehr gut, wenn man sie denn einmal ausprobiert!

Wer jedes mal das Rad neu erfinden WILL, hat zu viel Zeit. Wer es
wirklich besser machen will..Der lernt Assembler.

Ach ja, das Byte welches Du mit Send sendest.. legt fest welcher Ausgang
1 oder 0 ist, sollte logisch sein? in Deinem Programm sendest Du aber
anscheinen nichts außer der Adresse?

Noch etwas, wenn Du alles über Register selber steuern willst, nehme besser c. Bascom selber belegt etliche Register selber (für sich), das kann Probleme geben..unter Bascom ist es besser auch die Bascom Routinen
zu benutzen weil halt keiner genau weiß was von Bascom selber möglich
einfach übergebügelt wird. :-(((

Gruß Richard