Pages: [1]   Go Down
Author Topic: Serielle Schnittstelle und LCD  (Read 712 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo

ich möchte über den Arduino Uno eine Drehzahl anzeigen und diese ebenfalls per serier Schnittstelle an den PC senden. Die Drehzahl wird über einen Hall-Sensor erfasst und per Interrupt dann die Drehzahl ausgegeben.
Ohne die Ausgabe über die serielle Schnittstelle funktioniert das Programm ohne Probleme, jedoch binde ich die Ausgabe ein, erkennt der Controller kein Interrupt mehr.

Code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

float rpm;
long TimeOld;
long TimeNew;
float diffTime=0;

void setup()
{
  TimeOld = 0;
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.print("Drehzahl:");
  Serial.begin(9600);
  attachInterrupt(0, reaktion, FALLING);
}

void loop()
{
  attachInterrupt(0, reaktion, FALLING);
}
void reaktion()
{
  TimeNew=millis();
  diffTime=TimeNew-TimeOld;
  rpm = (1/((diffTime/1000)))*60;
  TimeOld = TimeNew;
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Drehzahl:");
  lcd.setCursor(0,1);
  lcd.print(rpm);
  lcd.print(" 1/min");
  Serial.println(rpm);
  Serial.println(' 1/min');
}]

Kann mir dabei vllt jemand helfen.

Danke im Voraus!

* Drehzalanzeige.ino (0.69 KB - downloaded 6 times.)
Logged

Germany
Offline Offline
Edison Member
*
Karma: 44
Posts: 2261
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Kannst du mir erklären, warum du attachInterrupt() auch in der Hauptschleife aufrufst? Wenn du das in der setup-Routine machst, sollte das meines Erachtens ausreichen.
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
Jr. Member
**
Karma: 0
Posts: 73
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das ist sonderbar.
Ich habe hier gerade ein Projekt auf dem Steckbrett, bei dem fast eine identische Belegung gewäählt ist.
Ich verwende ebenfalls int0 und die serielle Schnittstelle (PD0 u. PD1), sowie ein LCD an den Pins 5- 10 und das funktioniert problemlos.
Was ich allerdings vermeiden würde, ist die Ausgabe in die ISR zu intergrieren.
Du übertägst mit "gemütlichen" 9600 Baud und wärend dessen sind verm. die Interrupts gesperrt.
Verlege mal alles was geht in die Loop und schreibe in der ISR nur die millis() in die Variable, dann sollte es klappen.

LG Lena
Logged

„Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher.“

Albert Einstein

Offline Offline
Jr. Member
**
Karma: 0
Posts: 73
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Kannst du mir erklären, warum du attachInterrupt() auch in der Hauptschleife aufrufst? Wenn du das in der setup-Routine machst, sollte das meines Erachtens ausreichen.
Au weia, das war mir noch garnicht aufgefallen - NoNoNo, so nicht smiley-sad

LG Lena
Logged

„Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher.“

Albert Einstein

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20193
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Die Interruptroutine muß so kurz wie möglich sein um beendet zu sein wenn ein nächster Interrupt kommt; also keine Ausgabe aufs Display oder auf die serielle Schnittstelle in der Interruptroutine. Nur Abspeichern der aktuellen Zeitdifferenz. Dies auch weil in der Interruptroutine millis() nicht weitergezählt wird. Dei Ausgabe aufs Display und die Seriele Schnittstelle machst Du 1 bis 2 mal die Sekunde in der loop() - Funktion.

"rpm = (1/((diffTime/1000)))*60;" kann man umformen damit die Rechnung einfacher ist:
"rpm= 60000/diffTime;) macht das gleiche und ist nur 1 Rechenoperation.

Grüße Uwe
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 73
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich setze zusätzlich auch gerne ein Flag, das mir ein neues Interupt in der Loop signalisiert und erst dann zurückgesetzt wird, wenn alle Operationen durchgeführt worden sind.
Nimmst Du statt einens boolean Flags einen int Counter, der in der ISR incrementiert wird, kannst Du sogar einen Interupt-Overrun erkennen.

LG Lena
Logged

„Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher.“

Albert Einstein

Offline Offline
Jr. Member
**
Karma: 0
Posts: 73
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

"rpm = (1/((diffTime/1000)))*60;" kann man umformen damit die Rechnung einfacher ist:
"rpm= 60000/diffTime;) macht das gleiche und ist nur 1 Rechenoperation.

Stellt das der Compiler bzw Präprozessor nicht sowieso so um?

LG Lena
Logged

„Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher.“

Albert Einstein

Pages: [1]   Go Up
Jump to: