PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATmega8 und C-Control II per I2C verbinden



Johannes
30.12.2003, 15:00
Moin,
ich habe ein Problem mit der Vernetzung von der CC2 mit einem ATmega8-Modul per I2C. Leider habe
ich noch niemanden gefunden, der mit dabei helfen konnte.

Ich habe an ein ATmega8-Modul zwei LEDs angeschlossen, die ich von der CC2 per I2C ein und
ausschalten will.

Der Quellcode für die CC2:


thread main
{
i2c.init();
loop {
i2c.start(81);
i2c.write(1);
i2c.write(0);
i2c.stop();
sleep (1000);
i2c.start(81);
i2c.write(1);
i2c.write(1);
i2c.stop();
sleep (1000);
}
}

Und für das ATmega8-Modul:


program Test1;

{ $BOOTRST $00C00} {Reset Jump to $00C00}
{ $NOSHADOW }
{ $W+ Warnings} {Warnings off}

Device = mega8, VCC = 5;

Import SysTick, TWIslave;

From System Import;

Define
ProcClock = 16000000; {Hertz}
SysTick = 10; {msec}
StackSize = $0064, iData;
FrameSize = $0064, iData;
TWImode = Transparent; {HandShake or Transparen}
TWIbuffer = 10, iData; {buffer/packet size}
TWIaddr = $40; {slave address}


Implementation

{$IDATA}

{--------------------------------------------------------------}
{ Type Declarations }

type


{--------------------------------------------------------------}
{ Const Declarations }


{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
var
LED1[@PortD, 4] : bit;
LED2[@PortD, 5] : bit;

{--------------------------------------------------------------}
{ functions }

procedure InitPorts;
begin
DDRD:= %00110000;
LED1:= 1;
LED2:= 0;
end InitPorts;


{--------------------------------------------------------------}
{ Main Program }
{$IDATA}

begin
InitPorts;

TWIsetGC (false);
TWIsetslaveAddr ($40);
EnableInts;
loop
LED1 := TWIRXBUFFER[0];
TWIRXBUFFER[0] := 0;
endloop;
end Test1.

Leider funktioniert der Code nicht. Die LED bleibt an.
Vielleicht findet sich ja hier jemand, der mir helfen kann.

Gruß
Johannes

Gast
25.01.2004, 10:03
:idea:

Du mußt den AVR als I²C Slave Programmieren !
Leider kenn ich mich bei den AVR´s nicht so gut aus.
Bei einer MCU mit 8051er Kern (z.B. Philips) muß man die I²C Adresse des Prozessors in einem SFR-Register einstellen, bzw ein Bit setzen das er auf einen General Call reagiert.
Solange das nicht geschehen ist überwacht die MCU zwar den Bus, empfängt aber keine Daten.

MfG B-Tronic 8)

deftone
25.01.2004, 10:41
Hallo

Der AVR läuft ja scheinbar im Slave-Mode (LIB importiert).

Hast Du bei der Adressierung berücksichtigt das der AVR das letzte BIT (R/W) ignoriert?

Ansonsten würde ich im Loop eine kleine Pause (mDelay xy) einfügen, kann ja sein dass das ganze zu schnell "resetet" wird.

MfG
deftone