Forum: Mikrocontroller und Digitale Elektronik Interrupt zählt ohne Grund


von Berger (Gast)


Lesenswert?

Ich habe einen Sketch bei dem ich einen Windsensor auslese. Der 
interrupt zählt mir allerdings hoch ohne dass das Rad dreht. Was könnte 
das sein?

Ich verwende einen Arduino Yun.

Danke für jeden Hinweis

von Kaj (Gast)


Lesenswert?

Berger schrieb:
> Was könnte das sein?
Das Problem liegt in Zeile 42...
Spaß bei seite: Poste deinen Code dann kann man dir auch helfen.
Kein Code == Keine Hilfe

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Ein Hardwarefehler (R42).

Ein Softwarefehler (Zeile 42).

Bitte.

von Mike (Gast)


Lesenswert?

Berger schrieb:
> Was könnte das sein?
Das kann nur an deiner Software oder an der Beschaltung liegen.

von Berger (Gast)


Lesenswert?

Ja ich hoffte auf einen Anfängerfehler. Den Code hab ich grad nicht zur 
Hand, werd ihn aber noch posten.

von Ingo W. (Gast)


Lesenswert?

Ohne weitere Informationen, kann man nur vermuten, das die Leitung vom 
Sensor zum Controller, Störimpulse aus der Umgebung einfängt. Dagegen 
könnte ein kleiner Kondensator vom µC-Eingang nach Masse (Tiefpass) 
helfen. Der Wert nängt natürlich von der genauen Beschaltung ab...

von Mike (Gast)


Lesenswert?

Ingo Wendler schrieb:
> Dagegen könnte ein kleiner Kondensator vom µC-Eingang nach Masse
> (Tiefpass) helfen.
Ein einzelner Kondensator würde bei Störimpulse mit zu kleiner 
Ladungsmenge dafür sorgen, dass die Schaltschwelle nicht überschritten 
wird. Für einen echten Tiefpass müßte noch ein Widerstand in die 
Leitung.
Der Eingang sollte in beiden Fällen Schmitt-Trigger Charakteristik 
besitzen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Berger schrieb:
> einen Windsensor auslese. Der interrupt zählt mir allerdings hoch
Wie schnell muss denn da überhaupt gezählt werden? Welche maximale 
Frequenz gibt der Sensor aus?

von Kaj (Gast)


Lesenswert?

Lothar Miller schrieb:
> Wie schnell muss denn da überhaupt gezählt werden? Welche maximale
> Frequenz gibt der Sensor aus?
Damit sind wir bei der nächsten (vielleicht) wichtigen Frage:
Welchen Windsensor verwendest du denn, lieber TO?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Kaj schrieb:
> Damit sind wir bei der nächsten (vielleicht) wichtigen Frage:
> Welchen Windsensor verwendest du denn?
Und:
Wie ist der an den uC Pin angeschlossen?

von Mike (Gast)


Lesenswert?

Kaj schrieb:
> Damit sind wir bei der nächsten (vielleicht) wichtigen Frage:
> Welchen Windsensor verwendest du denn, lieber TO?
Und:
Wie ist der Eingang konfiguriert?

von Kaj (Gast)


Lesenswert?

Kaj schrieb:
> Welcher Windsensor

Lothar Miller schrieb:
> Wie ist der an den uC Pin angeschlossen?

Mike schrieb:
> Wie ist der Eingang konfiguriert?

Code, Schaltplan, usw. sonst wird das nichts.

Immerhin ist der Controller ist schon mal bekannt:
> Arduino Yun
ATMega32u4

von Berger (Gast)


Angehängte Dateien:

Lesenswert?

Also der Code ist im Anhang. Ich habe bewusst den Regensensor genommen, 
da der noch etwas einfacher als der Windsensor ist.

Ich verwende die Bridge Library zum Auslesen der Daten.

Der Regensensor stammt aus der Wetterstation von Sparkfun. Ein Kontakt 
des Regensensors ist auf D8 (HIGH) und INT3 (Pin1) der andere an GND.

Damit sollte GND D8 runterziehen und einmal zählen. Stattdessen zählt er 
pro Sekunde ca 40 hoch. Egal ob da etwas angeschlossen sit oder nicht.

von Mike (Gast)


Lesenswert?

Berger schrieb:
> Stattdessen zählt er
> pro Sekunde ca 40 hoch. Egal ob da etwas angeschlossen sit oder nicht.

Dann vergiß erstmal den Regensensor und häng an den Eingang nur einen 
zusätzlichen Pull-Up, z.B. 4k7. Dann muss Ruhe herrschen.

Als nächstes könntest du einen Rechteckgenerator mit bekannter Frequenz 
anschließen ...

Warum fragst du in deiner Interrupt-Routine eigenlich deinen Zeitzähler 
bis zu 3 Mal ab (und bekommst jedesmal ein anderes Ergebnis)?
Und wenn du rain_last auch bei ungültigen Impulsen aktualisierst, trägt 
das nicht gerade zur Genauigkeit des Zeitwertes bei.

von Alex S. (0_alex_0)


Lesenswert?

Zeile 25: Input -> Output

von Mike (Gast)


Lesenswert?

Alex S. schrieb:
> Zeile 25: Input -> Output

Guckst du hier:
http://www.arduino.cc/en/Tutorial/DigitalPins

"Prior to Arduino 1.0.1, it was possible to configure the internal 
pull-ups in the following manner:"
1
pinMode(pin, INPUT);           // set pin to input
2
digitalWrite(pin, HIGH);       // turn on pullup resistors

Aktuell gibt es pinMode INPUT_PULLUP

von ciao (Gast)


Lesenswert?

Eigentlich wollte ich endlich mal den Schaltplan sehen. War wohl nix. 
Mit "Windsensor" Datenblatt is auch nix. Nach was soll man da suchen. Is 
ja auch nicht verlinkt. Schei... Programm öffnen ... Mit Notepad kriegt 
man nur Textmüll. Andere Programme probiere ich nicht mehr. Arduino 
Spezialisten werden ihn wohl lesen können ... ob es was bringt? Keinen 
Bock mehr, gehe an die frische Luft - bringt mehr als ein Danke.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Berger schrieb:
> Also der Code ist im Anhang.
Womit kann man den ansehen?

Evtl. wäre es einfacher, wenn du den Quelltext hier postest. Dafür sind 
dann die [c] Tags da...

: Bearbeitet durch Moderator
von Ingo W. (Gast)


Lesenswert?

Lothar Miller schrieb:
> Berger schrieb:
>> Also der Code ist im Anhang.
> Womit kann man den ansehen?
>
> Evtl. wäre es einfacher, wenn du den Quelltext hier postest. Dafür sind
> dann die [c] Tags da...

Sieht wie ein normaler C-Quelltext aus

von STK500-Besitzer (Gast)


Lesenswert?

Lothar Miller schrieb:
> Womit kann man den ansehen?

Arduino-IDE.

von Moin (Gast)


Lesenswert?

ciao schrieb:
> Mit Notepad kriegt man nur Textmüll. Andere Programme probiere ich nicht
> mehr. Arduino Spezialisten werden ihn wohl lesen können ...

Das sind ganz normale Textdateien. Nur weil die File Extension "INO" 
ist, mußt du nicht gleich beleidigt sein.

Peinlich genug ist es für Notepad. Das Schei.ding aus den Anfängen der 
PC-Zeit kommt einfach mit einem einfache Linefeed am Zeilenende nicht 
zurecht.

Nimm Notepad++, dann hast du das Problem vom Tisch
http://notepad-plus-plus.org/

von Jürgen S. (jurs)


Lesenswert?

Berger schrieb:
> Ich habe einen Sketch bei dem ich einen Windsensor auslese. Der
> interrupt zählt mir allerdings hoch ohne dass das Rad dreht. Was könnte
> das sein?

Du verwendest den internen PullUp-Widerstand am Reedkontakt:
1
pinMode(PIN_RAINMETER, INPUT);
2
  digitalWrite(PIN_RAINMETER, HIGH);

Die internen PullUps der Atmega-Controller haben einen Wert von ca. 20K 
bis 50K und pullen die Leitung sehr schwach.

Sobald Du zwischen Controller und Schalter eine "lange Leitung" hast, 
reichen diese schwachen PullUps nicht mehr.

Verwende einen externen PullUp-Widerstand, Standardwert 4.7K.

von Mike (Gast)


Lesenswert?

Jürgen S. schrieb:
> Sobald Du zwischen Controller und Schalter eine "lange Leitung" hast,
> reichen diese schwachen PullUps nicht mehr.

Berger schrieb:
> Stattdessen zählt er pro Sekunde ca 40 hoch. Egal ob da etwas
> angeschlossen sit oder nicht.

Unter "nichts angeschlossen" hätte ich verstanden, dass da auch keine 
"lange Leitung" angeschlossen ist. But who knows ...

von ciao (Gast)


Lesenswert?

Moin schrieb:
> Das sind ganz normale Textdateien. Nur weil die File Extension "INO"
> ist, mußt du nicht gleich beleidigt sein.
>
> Peinlich genug ist es für Notepad. Das Schei.ding aus den Anfängen der
> PC-Zeit kommt einfach mit einem einfache Linefeed am Zeilenende nicht
> zurecht.
>
> Nimm Notepad++, dann hast du das Problem vom Tisch
> http://notepad-plus-plus.org/

Was sind denn "normale" Textdateien in deinen Augen? Ich probiere 
jedenfalls nicht lange rum, besonders dann nicht, wenn man auch noch 
hinter anderen Angaben herlaufen muß, die auch schon genügend 
nachgefragt wurden.

von Sebastian W. (wangnick)


Lesenswert?

Hallo Berger,

Du schreibst:
1
#define PIN_RAINMETER   8     // Digital 8
2
  pinMode(PIN_RAINMETER, INPUT);
3
  digitalWrite(PIN_RAINMETER, HIGH);
4
  attachInterrupt(3, countRainmeter, FALLING);

Laut http://arduino.cc/en/Main/ArduinoBoardYun: "External Interrupts: 3 
(interrupt 0), 2 (interrupt 1), 0 (interrupt 2), 1 (interrupt 3) and 7 
(interrupt 4). These pins can be configured to trigger an interrupt on a 
low value, a rising or falling edge, or a change in value. See the 
attachInterrupt() function for details. Is not recommended to use pins 0 
and 1 as interrupts because they are the also the hardware serial port 
used to talk with the Linux processor."


Du benutzt Arduino Interrupt 3? Der triggert doch auf Arduino Pin 1, 
nicht auf Arduino Pin 8? Wie soll das dann gehen? Mal ganz abgesehen 
davon, dass Arduino Pin 1 für die Bridge-Kommunikation benötigt wird ...

LG, Sebastian

: Bearbeitet durch User
von Kaj (Gast)


Lesenswert?

ciao schrieb:
> Schei... Programm öffnen ... Mit Notepad kriegt
> man nur Textmüll
Nö, kein Textmüll, weder mit dem normalen windows notepad noch mit 
notepad++, mit dem windows notepad fehlen nur die zeilen umbrüche so das 
alles in 2 zeilen steht. Sogar Wordpad und M$-Word kann die Datei 
problemlos öffnen (gerade ausprobiert). Da liegt das Problem, beim 
öffnen und anschauen der Datei, ganz klar nicht an der Datei oder dem 
Editor...

ciao schrieb:
> Was sind denn "normale" Textdateien in deinen Augen?
alles das, wo klartext drin steht. auch eine .c .cpp .hpp .make .lss 
.map datei ist nichts anderes als eine normale textdatei. Selbst eine 
.hex-Datei würde ich noch fast dazu zählen, weil die hex-Werte als 
klartext drin stehen. .bin oder .elf dateien sind für mich z.B. keine 
"normalen" Textdateien mehr, weil dort kein klartext drin steht.

ciao schrieb:
> Ich probiere jedenfalls nicht lange rum
Brauch man ja auch nicht... rechts klick --> öffnen mit... und den 
Editor deiner Wahl aussuchen. Alterantiv, wenn man den Total Commander 
hat, einfach F3 drücken.

Aber für alle die das nicht hin bekommen:
1
#include <Bridge.h>
2
#include <YunServer.h>
3
#include <YunClient.h>
4
5
#define uint  unsigned int
6
#define ulong unsigned long
7
8
#define PIN_RAINMETER   8     // Digital 8
9
10
long rain_last = 0;
11
volatile int RegenCounter = 0;
12
13
14
YunServer server;
15
16
void setup() {
17
  pinMode(13,OUTPUT);
18
  digitalWrite(13, LOW);
19
  Bridge.begin();
20
  digitalWrite(13, HIGH);
21
  server.listenOnLocalhost();
22
  server.begin();
23
  
24
  
25
  pinMode(PIN_RAINMETER, INPUT);
26
  digitalWrite(PIN_RAINMETER, HIGH);
27
  attachInterrupt(3, countRainmeter, FALLING);
28
}
29
30
31
void loop() {
32
  YunClient client = server.accept();
33
  if (client) {
34
    process(client);
35
    client.stop();
36
  }
37
38
  delay(50);
39
}
40
41
void process(YunClient client) {
42
  String command = client.readStringUntil('/');
43
  if (command == "regen") {
44
    getRegenMenge(client);
45
  }
46
}
47
48
void countRainmeter()
49
{
50
  long thisTime = micros() - rain_last;
51
  rain_last = micros();
52
  if (thisTime > 500)
53
  {
54
    RegenCounter++;
55
    rain_last = micros(); //verhindert Prellen
56
  }
57
}
58
59
void getRegenMenge(YunClient client) {
60
  double Menge = 0.2794;
61
  double Regenmenge = Menge * RegenCounter;
62
  client.print(F(" X Counter Regen "));
63
  client.println(RegenCounter);
64
  client.print(F(" X Regenmenge "));
65
  client.println(Regenmenge);
66
67
  RegenCounter = 0;        // Reset Zähler
68
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Kaj schrieb:
> Aber für alle die das nicht hin bekommen:
Danke sehr, mein neues Android Smartphone hat da offenbar auch so seine 
Probleme. Ich werde Andreas mal vorschlagen, dass er in der 
Forensoftware die ino Dateien wie C Dateien behandelt...

von Kaj (Gast)


Lesenswert?

Lothar Miller schrieb:
> mein neues Android Smartphone
ok, hätte nicht damit gerechnet das jemand versucht sich das auf nem 
neumodischen mobilfunk telefon anzuschauen :D  aber ok, man lernt nie 
aus^^

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.