Forum: Mikrocontroller und Digitale Elektronik I2C mit Xmega128 Grundlagen


von serg (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich arbeite mich gerade in I2C ein.
Habe mir dazu ein Entwicklungsboard EVK Xa1 gekauft mit 
Beispielprogrammen.
Aber irgendwie komme ich bei der Einarbeitung nicht weiter. Ich finde 
weder gute Litaretur noch gute Beispiele oder Unterlagen wo das genau 
erklärt wird (nur Dattenblätter die ich nicht verstehe) und das Programm 
welches mit dem Board dabei war funktioniert auch nicht bei mir.
Könnt Ihr mir da helfen oder gute Literatur empfehlen?
Möchte zuerst nur das Ganze verstehen und ein paar kleine Programme in C 
(AVR-Studio) schreiben können. Ziel ist es später einen Schrittmotor mit 
Hilfe der Schrittmotorkarte-TMC222 von ELV anzusteuern.
Im Anhang das Programm welches mitgeliefert wurde.
Danke im Voraus.

von Spess53 (Gast)


Lesenswert?

HI

>Ich finde
>weder gute Litaretur noch gute Beispiele oder Unterlagen wo das genau
>erklärt wird (nur Dattenblätter die ich nicht verstehe) und das Programm
>welches mit dem Board dabei war funktioniert auch nicht bei mir.

Komisch, ich finde recht schnell bei Atmel dieses:

http://www.atmel.com/Images/doc8054.pdf
http://www.atmel.com/Images/AVR1308.zip

MfG Spess

von serg (Gast)


Lesenswert?

Danke aber das habe ich bereits gelesen gehabt.
Ich verstehe es nur nicht. Ich brauche vieleicht ein simples Programm 
ohne header Dateien usw... um es zu verstehen.

von Jan Christian H. (jhaddorp)


Lesenswert?

Hallo, zielt die Frage speziell auf Schrittmotorsteuerung oder auf I2C 
generell? I2C mittels Arduino ist recht simpel...

http://tronixstuff.wordpress.com/2010/10/20/tutorial-arduino-and-the-i2c-bus/

Im der Basis Anwendung, I2C Zieladresse setzen, Daten senden und fertig.

Wire.beginTransmission(device_address);
Wire.send(0);
Wire.endTransmission();

Viele Grüße
Jan Christian

von Timmo H. (masterfx)


Lesenswert?

Hallo,
ich stand anfangs beim Umstieg auf den XMega vor dem gleichen Problem. 
Doch eigentlich ist es ganz einfach wenn man sich die Quellcodes aus den 
Appnotes ansieht (insb. twi_example.c). Ich finde die TWI Lib von Atmel 
inzwischen auch besser als die i2c lib von Peter Fleury.
Hier mal ein Minimalbeispiel mit einem Beschleunigungssensor:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <stdint.h>
4
5
#include "twi_master_driver.h"
6
7
uint8_t sendBuffer[8]; //Sendbuffer für TWI-Master
8
9
TWI_Master_t twiMaster;    /*!< TWI master module. */
10
11
//Adresse ist direkt in 7-Bit, also ungeshiftet!
12
#define MMA845XQ_ADDR  0x1C 
13
14
int main(void)
15
{
16
  int16_t x,y,z;
17
18
  OSC.CTRL = OSC_RC32MEN_bm;
19
  
20
  CLK.CTRL = 0x01;
21
  while(!(OSC.STATUS & OSC_RC32MRDY_bm));
22
23
  CCP = CCP_IOREG_gc;
24
  /*Clock auf 32Mhz einstellen*/
25
  CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
26
27
  /* Initialize TWI master with 200kHz. */
28
  TWI_MasterInit(&twiMaster, &TWIC, TWI_MASTER_INTLVL_LO_gc, (F_CPU/(2*200000)) - 5);
29
  /* LowLevel Interrupt für TWI-Master aktivieren */
30
  PMIC.CTRL |= PMIC_LOLVLEN_bm;      
31
32
  sendBuffer[0] = 0x2A;  //CTRL_REG1
33
  /* 1 Byte senden, 1 Byte lesen   */
34
  TWI_MasterWriteRead(&twiMaster, MMA845XQ_ADDR, &sendBuffer[0],1,1);
35
  while (twiMaster.status != TWIM_STATUS_READY) {
36
    /* Wait until transaction is complete. */
37
  }
38
  /* Empfangende Daten stehen in twiMaster.readData */
39
  sendBuffer[1] = twiMaster.readData[0] & ~0x01;  //Go Standby
40
  TWI_MasterWriteRead(&twiMaster, MMA845XQ_ADDR, &sendBuffer[0],2,0);
41
  while (twiMaster.status != TWIM_STATUS_READY) {
42
    /* Wait until transaction is complete. */
43
  }
44
  sendBuffer[0] = 0x2A;  //CTRL_REG1
45
  sendBuffer[1] = 0x1C;  //DR1 + DR0 = 1 => 100 Hz; LNOISE = 1
46
  /* 2 Bytes schreiben, 0 Bytes lesen */
47
  TWI_MasterWriteRead(&twiMaster, MMA845XQ_ADDR, &sendBuffer[0],2,0);
48
  while (twiMaster.status != TWIM_STATUS_READY) {
49
    /* Wait until transaction is complete. */
50
  }
51
  sendBuffer[0] = 0x2A;
52
  /* 1 Byte schreiben, 1 Bytes lesen */
53
  TWI_MasterWriteRead(&twiMaster, MMA845XQ_ADDR, &sendBuffer[0],1,1);
54
  while (twiMaster.status != TWIM_STATUS_READY) {
55
    /* Wait until transaction is complete. */
56
  }
57
      sendBuffer[1] = twiMaster.readData[0] | 0x01;  //Activate
58
  /* 2 Bytes schreiben 0 lesen */
59
  TWI_MasterWriteRead(&twiMaster, MMA845XQ_ADDR, &sendBuffer[0],2,0);
60
  while (twiMaster.status != TWIM_STATUS_READY) {
61
    /* Wait until transaction is complete. */
62
  }
63
64
  while(1){
65
      sendBuffer[0] = 0x01;  // Reg1 => x_accel
66
    //Autoincrement, we read 6 Bytes
67
    // 1 Byte Schreiben, 6 Bytes lesen */
68
    TWI_MasterWriteRead(&twiMaster, MMA845XQ_ADDR, &sendBuffer[0],1,6);
69
    while (twiMaster.status != TWIM_STATUS_READY) {
70
      /* Wait until transaction is complete. */
71
    }
72
  
73
    x = twiMaster.readData[0] <<6;
74
    x |= twiMaster.readData[1] >>2;
75
    if(x & 0x2000){  //make it a correct signed integer
76
      x |= 0xE000;  
77
    }
78
    y = twiMaster.readData[2] <<6;
79
    y |= twiMaster.readData[3] >>2;
80
    if(y & 0x2000){  //make it a correct signed integer
81
      y |= 0xE000;  
82
    }
83
    z = twiMaster.readData[4] <<6;
84
    z |= twiMaster.readData[5] >>2;
85
    if(z & 0x2000){  //make it a correct signed integer
86
      z |= 0xE000;  
87
    }
88
    uart_puts("x: "); uart_putint(x);
89
    uart_puts("\ny: "); uart_putint(y);
90
    uart_puts("\nz: "); uart_putint(z);
91
    _delay_ms(100);
92
  }
93
}

von Timmo H. (masterfx)


Lesenswert?

Oh sorry, noch ganz vergessen.
Hinter
1
/* Initialize TWI master with 200kHz. */
2
  TWI_MasterInit(&twiMaster, &TWIC, TWI_MASTER_INTLVL_LO_gc, (F_CPU/(2*200000)) - 5);
3
  /* LowLevel Interrupt für TWI-Master aktivieren */
4
  PMIC.CTRL |= PMIC_LOLVLEN_bm;
gehört natürlich noch ein "sei()" und dann sollte man auch die ISR noch 
reinmachen :D
1
/*! TWIC Master Interrupt vector. */
2
ISR(TWIC_TWIM_vect)
3
{
4
  TWI_MasterInterruptHandler(&twiMaster);
5
}

von serg (Gast)


Lesenswert?

Hallo zusammen,

Jan: Mir geht es erst nur um das Verständniss wie I2C Funktioniert. 
Möchte zuerst nur Daten von Sensoren auslesen können. Zum Schluß wenn 
ich das verstanden habe möchte ich einen Schrittmotor mit TMC222 
ansteuern.

Timmo: Werde mir deinen Quelltext die Tage anschauen.

Vielen für eure Mühe.

Gruß Sergej

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.