Forum: Mikrocontroller und Digitale Elektronik BMA020 Selftest_1 Interrupt probleme


von Robin (Gast)


Angehängte Dateien:

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

von Peter (Gast)


Lesenswert?

Ich würde mal auf das cli ohne dazugehöriges sei (auskommentiert) 
tippen.

von Robin (Gast)


Lesenswert?

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 ;)

von Stefan (Gast)


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.

von Stefan (Gast)


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.

von Robin (Gast)


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

von Stefan (Gast)


Lesenswert?

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.

von Robin (Gast)


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...

von Robin (Gast)


Angehängte Dateien:

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.

von Stefan (Gast)


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.

von Peter (Gast)


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.

von Robin (Gast)


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...

von Robin (Gast)


Angehängte Dateien:

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.

von Stefan (Gast)


Lesenswert?

Ja, das ist mein Beitrag.

Der Arduino ist doch ein AVR Mikrocontroller. Du kannst den Arduino auch 
ohne die Arduino-Libraries verwenden.

von Robin (Gast)


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.

von Robin (Gast)


Angehängte Dateien:

Lesenswert?

@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.

von Stefan F. (sfrings)


Lesenswert?

Die Unterstützung von void* ist gcc Spezifisch. Sie durch uint8_t* zu 
ersetzen ist völlig in Ordnung.

von Stefan F. (sfrings)


Lesenswert?

Komisch. Wie kann der selftest1 den selftest0 beeinflussen, obwohl 
selftest0 zuerst ausgeführt wird. Versteh' ich auch nicht.

von Robin (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.