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
Ich würde mal auf das cli ohne dazugehöriges sei (auskommentiert) tippen.
Ne daran liegts nicht dafür is doch das SREG darunter wie hier http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts beschrieben. Aber habs auch schon mit sei() ausprobiert deshalb ist es ja auskommentiert ;)
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 | int pin = 13; |
5 | volatile int state = LOW; |
6 | |
7 | void blink() |
8 | {
|
9 | state = !state; |
10 | }
|
11 | |
12 | void setup() |
13 | {
|
14 | pinMode(pin, OUTPUT); |
15 | attachInterrupt(0, blink, LOW); |
16 | }
|
17 | |
18 | void loop() |
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 | int pin = 13; |
5 | volatile int state = LOW; |
6 | |
7 | void blink() |
8 | {
|
9 | state = !state; |
10 | }
|
11 | |
12 | void setup(){ |
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 | void loop(){ |
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, das ist mein Beitrag. Der Arduino ist doch ein AVR Mikrocontroller. Du kannst den Arduino auch ohne die Arduino-Libraries verwenden.
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.
Die Unterstützung von void* ist gcc Spezifisch. Sie durch uint8_t* zu ersetzen ist völlig in Ordnung.
Komisch. Wie kann der selftest1 den selftest0 beeinflussen, obwohl selftest0 zuerst ausgeführt wird. Versteh' ich auch nicht.
Dann bin ich wenigstens nich alleine mit dem nicht verstehen das gibt mir hoffnung das ich doch nen bisschen was versteh^^
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.