BMA020 Selftest_1 Interrupt probleme

Gast #2790693
Lesenswert?

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
Angehängte Dateien:
Gast #2791733
Lesenswert?

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.
Gast #2791737
Lesenswert?

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.
Gast #2791742
Lesenswert?

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
Gast #2791840
Lesenswert?

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...
Gast #2791862
Lesenswert?

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.
Angehängte Dateien:
Gast #2792341
Lesenswert?

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.
Gast #2792406
Lesenswert?

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.
Gast #2792432
Lesenswert?

@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...
Gast #2792487
Lesenswert?

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.
Angehängte Dateien:
Gast #2792557
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren