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.
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
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.
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
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 | }
|
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.