Hi leute,
ich dachte ich mach mal nen neuen Thread auf bevor der alte Thread
(Beitrag "BMA020 Selftest_0") zu unübersichtlich wird.
Erst noch mal die verkabelung:
Am BMA020
UIN - CSB
UIN - UPullup
SDO - GND
Vom Arduino Uno Rev.2 zu BMA020
3,3V - UIN
GND - GND
A4 - SCK
A5 - SDI
2 - INT
Ich nutze Eclipse 3.4.2 mit AVR Plugin 2.3.4.2 und avr-gcc 4.3.5.
Als Serial-terminal nutze ich GTKTerm v.0.99.5.
Mein Problem ist das ich durch selftest_1 einen Interrupt erwarte und
dadurch state auf 1 gesetzt und ausgeben werden soll es aber immer nur
ne 0 kommt. Und seitdem ich selftest_1 mit im beisp. hab gibt selftest_0
auch nur noch 0 obwohl es vorher funktioniert hat. Bitte kann mir einer
helfen? Ich weiss einfach net was ich ausprobieren soll.
Gruss Robin
Du hast immer noch nicht die blaue Verbindung geschaltet, die ich im
vorherigen Thread mit einem Foto geziegt hatte. Schau in die
Beschreibung des Moduls. Da steht ganz klar drin, dass der unbenutzte
Pin der SPI Schnittstelle auf GND gelegt werden muss, damit der Chip im
I2C Modus arbeitet.
Sorry, hab' übersehen, dass Du in dem alten Thread noch einen Kommetar
zur blauen Brück hinterlassen hast.
Jetzt habe ich jedenfalls auch keine Idee mehr. Vielleicht könnten die
Arduino Spezilisten hier mal prüfen, ober das Interrupt-Handling hier
korrekt umgesetzt wurde.
Hab gerade mal nen anderen Interrupt probiert und da klappt das.
1
#include<main.cpp>
2
#include<BMA020.h>
3
4
intpin=13;
5
volatileintstate=LOW;
6
7
voidblink()
8
{
9
state=!state;
10
}
11
12
voidsetup()
13
{
14
pinMode(pin,OUTPUT);
15
attachInterrupt(0,blink,LOW);
16
}
17
18
voidloop()
19
{
20
digitalWrite(pin,state);
21
22
delay(1000);
23
BMA020.resetINT();
24
}
also langsam fühl ich mich veräppelt -.-
wieso geht das nicht mit selftest_1?
Naja ich versuchs weiter und freu mich über jede hilfe ;)
Danke noch mal an alle die mir bisher geholfen haben.
Gruss Robin
Vielleicht, weil der Selbsttest fehlschlägt?
Oder weil die ganze I2C Kommunikation nicht sauber funktioniert? Das
hast DU aber schon anhand der X/Y/Z Werte kontrolliert, nehme ich an.
Jo soweit funktionierte alles also dachte ich mir schreib ich auch noch
funktionen für die Interrupt-funktionen des BMA. Aber irgent wie klappt
das nicht so wie ich will -.-.
Ich hab nämlich bemerckt das es auch mit selftest_1 funktioniert wenn
ich es mit resetINT im obigen Beispiel austausche. Aber in setup()
funktionierts irgent wie nicht...
Ok jetzt bin ich noch mehr verwundert hab bemerckt das ich
BMA020.begin(); in Setup() total vergessen hab. Hab es reingeschrieben
und die led blinkt nicht mehr sondern geht nur noch an aber nicht mehr
aus.
Also sehr merckwürdig könnte sich mal jemand die I2C lib angucken? Ich
nutze diese
http://dsscircuits.com/articles/arduino-i2c-master-library.html im
anhang pack ich sie auch nochmal.
Ich starte ja nur die i2c verbindung in begin() deshalb wüsst ich nicht
woran es liegen kann.
Meine Güte, ist das ein Spaghetticode. Ein ziemlich großer sogar, und
dann auch noch nur zu sehr wenigen AVR's kompatibel.
Schau mal in die Codesammlung dieses Forums, da habe ich meine I2C
Funktionen gepostet, die ich zusammen mit dem BMA020 bereits verwednet
habe.
Allerdings: Die Interrupt-Leitung habe ich noch nicht verwendet, auch
keine Selbsttests. Ich brauchte bisher nur die Werte der drei Achsen
auszulesen.
Du könntest die Interruptleitung auch pollen. D.h. ohne ISR den Pin
abfragen ob sich der Zustand innerhalb einer bestimmten Zeit ändert.
Dann kannst du schon mal feststellen, ob dein Fehler eher beim
Interrupt-Handling oder doch beim I2C liegt.
@Stefan: Danke ich guck gleich mal nach, bin auch schon am überlegen das
auf c umzumodeln und keinen arduino mehr zu nehmen. Hab auch noch so
einen m328p und isp programmer da.
@Peter: Jo danke, hätt ich auch mal drauf kommen können...
Ok i2c funktioniert, es liegt also an den Interrupts.
denn das funktioniert:
1
#include<main.cpp>
2
#include<BMA020.h>
3
4
intpin=13;
5
volatileintstate=LOW;
6
7
voidblink()
8
{
9
state=!state;
10
}
11
12
voidsetup(){
13
BMA020.begin();
14
Serial.begin(9600);
15
Serial.print("Selftest_0 result: ");
16
Serial.println(BMA020.selftest_0());
17
pinMode(pin,OUTPUT);
18
pinMode(2,INPUT);
19
}
20
21
voidloop(){
22
digitalWrite(pin,state);
23
24
delay(1000);
25
BMA020.resetINT();
26
while(digitalRead(2));
27
blink();
28
}
Im anhang pack ich noch mal die BMA klasse da ich sie leicht geändert
hab.
@Stefan: ist das Beitrag "universelle I2C Master Prozedur für AVR" deine? Wenn
ja mir gefällts werds nacher noch mit einbauen.
Ja da war ich mir nie so sicher und hab mich auch noch nicht damit
auseinander gesetzt. Das das nen AVR ist war mir natürlich klar ;).
Aber wie ich gemerckt hab gibt selftest_0() 0 wieder wenn ich auch
selftest_1 im selben sketch hab oO kann mir das mal einer erklären?
im obigen beispiel hab ich einfach resetINT() mit selftest_1() getauscht
und selftest_0 liefert aufeinmal nur noch 0.
@Stefan: Hab jetzt mal deine i2c funktion mit eingebunden ich muss sagen
sie gefällt mir richtig gut ist einfach zu nutzen. Nur musste ich void*
durch uint8_t* ersetzen da cpp void* nicht kennt.