- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 3 von 3

Thema: ATmega8 und C-Control II per I2C verbinden

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2003
    Beiträge
    459

    ATmega8 und C-Control II per I2C verbinden

    Anzeige

    Praxistest und DIY Projekte
    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:

    Code:
    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:

    Code:
    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

  2. #2
    Gast
    Gast


    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

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    21.11.2003
    Beiträge
    29
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests