INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
arduino rechnet falsch
05.04.2013, 10:57
Beitrag #1
arduino rechnet falsch
Hallo Feunde, Arduino Mega + LCD keypatshield + 12 1Wire Sensoren. Unten ist der Auszug aus dem Sketch zur Pelletverbraucherechnung.
Folgendes Problem:
Der counter0 zählt die Umdrehung der Stokerschnecke und counter1 berechnet den Pelletverbrauch, das klappt auch alles prima, aber bei ca. 30kg Anzeige erscheint vor der Summe ein Minuszeichen und die Verbrauchsanzeige rechnet rückwärtsauf 0.
Vieleicht kann mir einer der Experten helfen, bin nicht mehr ganz jung (73) und erst seit 6 Mon. begeisterter Arduinofan, somit etwas unerfahren. Meine Suche im Netz zum Problem war bisher erfolglos.
Würde mich über Hilfe freuen.

void irq_Svc0() // Entprellung, Zähler, Verbrauchsberechnung
{
if (inputpin2==HIGH)
if(debounce(inputpin2))
digitalWrite(inputpin2,HIGH);
long unsigned act_IRQ0; // Umdrehungen der Stokerschnecke zählen,
act_IRQ0=millis();
{
counter0++; // Zähler für Stokerschnecke,
counter1=counter0*1/10; // Zähler durch 10 teilen zur LCD Anzeige,
if(counter1>20000)counter1=0; // Zähler: gültiger Zustandswechsel, bei 4140 kg reset,
last_IRQ0 = act_IRQ0;
long unsigned act_counter1;
var=counter1 *207/1000; // Pelletverbrauch berechnen, 1 Umdr.= 20,725 gr. Pellets,
if (Serial.read()== ';') // Pelletverbrauch an LCD ausgeben,
Serial.println( var);
Serial.print( var);
}
{
val=digitalRead(inputpin2); // LED - Umdrehungsanzeige Stokerschnecke,
if(val==LOW)
digitalWrite(led13,HIGH); // LED Pin 13
delay(2000),
digitalWrite(led13,LOW);
}
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.04.2013, 08:50
Beitrag #2
RE: arduino rechnet falsch
Hallo Neuling,

mit welchem Typ hast Du die Variable counter0 initialisiert?
Das sieht nach einem "Überlauf" eines signed Datentypen aus.

z.B. I8 126+1=127 127+1=-128

Viele Grüße
Talim
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.04.2013, 10:18
Beitrag #3
RE: arduino rechnet falsch
(09.04.2013 08:50)Talim schrieb:  Hallo Neuling,

mit welchem Typ hast Du die Variable counter0 initialisiert?
Das sieht nach einem "Überlauf" eines signed Datentypen aus.

z.B. I8 126+1=127 127+1=-128

Viele Grüße
Talim

Hallo Talim, danke für Deinen Hinweis. Das mit dem Überlauf habe ich auch schon vermutet, denn wenn ich andere Zahlen rechne entsteht der gleiche Fehler. Ich sende Dir mal die Initialisierung. Selbst kann ich den Fehler im Sketch nicht beheben, denn dazu fehlen mir die Kenntnisse, vieleicht kannst Du mir helfen, würde mich sehr freuen, Danke

#include <Wire.h>
#include <PCF8583.h>
#include <LiquidCrystal.h>
#include <OneWire.h>
/*****************************************************************************/
PCF8583 rtc (0xA0); // Instanz fürRTC:
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Instanz für LCD + Tastatur:
OneWire ds(3); // Instanz für 1Wire Bus(PIN3):
//-------------------------------------------------------------------------
int lcd_key = 0; // Definieren von Werten der LCD-Anzeige mit den Tasten:
int lcd_key_prv = 0;
int adc_key_in = 0;
int number_screen = 1; // erstes Bild aufrufen
int Pellet = 0;
int var = 0;
int led13 = 13;
int inputpin2 = 2; // Zählimpuls Pin 2
int val = 0;
int lcd_bl = 1; // Bild Nr..., zur Anzeige:
int debounceDelay = 1000; // Entprellverzögerung 1 sek
int counter1 = 0;
char degree_sign = 0xDF; // Grad Celsius Zeichen auf LCD:
#define btnRIGHT 0 // Tasten Nr...
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
//----------------------------------

boolean debounce(int inputpin2) // Entprellroutine,
{
boolean state;
boolean previosState;
previosState=digitalRead(inputpin2);
for(int counter=0;counter<debounceDelay;counter++)
{
delay(1);
state=digitalRead(inputpin2);
if(state!=previosState)
{
counter=0;
previosState=state;
}
}
return state;
}

// Werte für Interuptzähler
volatile int counter0 = 0; //Schalter für countr0,
volatile int bounceTime = 50; //Entprellzeit in millisek.(50) für Schalter,
volatile unsigned int last_IRQ0;
volatile unsigned long last_micros;//die letzten millisek. in IRQ angekommen,

void irq_Svc0() // Entprellung, Zähler, Verbrauchsberechnung
{
if (inputpin2==HIGH)
if(debounce(inputpin2))
digitalWrite(inputpin2,HIGH);
long unsigned act_IRQ0; // Umdrehungen der Stokerschnecke zählen,
act_IRQ0=millis();
{
counter0++; // Zähler für Stokerschnecke,
counter1=counter0*1/10; // Zähler durch 10 teilen zur LCD Anzeige,
if(counter1>20000)counter1=0; // Zähler: gültiger Zustandswechsel, bei 4140 kg reset,
last_IRQ0 = act_IRQ0;
long unsigned act_counter1;
var=counter1 *207/1000; // Pelletverbrauch berechnen, 1 Umdr.= 20,725 gr. Pellets,
if (Serial.read()== ';') // Pelletverbrauch an LCD ausgeben,
Serial.println( var);
Serial.print( var);
}
{
val=digitalRead(inputpin2); // LED - Umdrehungsanzeige Stokerschnecke,
if(val==LOW)
digitalWrite(led13,HIGH); // LED Pin 13
delay(2000),
digitalWrite(led13,LOW);
}
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.04.2013, 09:18
Beitrag #4
RE: arduino rechnet falsch
(09.04.2013 10:18)neuling schrieb:  
(09.04.2013 08:50)Talim schrieb:  Hallo Neuling,

mit welchem Typ hast Du die Variable counter0 initialisiert?
Das sieht nach einem "Überlauf" eines signed Datentypen aus.

z.B. I8 126+1=127 127+1=-128

Viele Grüße
Talim

Hallo Talim, danke für Deinen Hinweis. Das mit dem Überlauf habe ich auch schon vermutet, denn wenn ich andere Zahlen rechne entsteht der gleiche Fehler. Ich sende Dir mal die Initialisierung. Selbst kann ich den Fehler im Sketch nicht beheben, denn dazu fehlen mir die Kenntnisse, vieleicht kannst Du mir helfen, würde mich sehr freuen, Danke

#include <Wire.h>
#include <PCF8583.h>
#include <LiquidCrystal.h>
#include <OneWire.h>
/*****************************************************************************/
PCF8583 rtc (0xA0); // Instanz fürRTC:
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Instanz für LCD + Tastatur:
OneWire ds(3); // Instanz für 1Wire Bus(PIN3):
//-------------------------------------------------------------------------
int lcd_key = 0; // Definieren von Werten der LCD-Anzeige mit den Tasten:
int lcd_key_prv = 0;
int adc_key_in = 0;
int number_screen = 1; // erstes Bild aufrufen
int Pellet = 0;
int var = 0;
int led13 = 13;
int inputpin2 = 2; // Zählimpuls Pin 2
int val = 0;
int lcd_bl = 1; // Bild Nr..., zur Anzeige:
int debounceDelay = 1000; // Entprellverzögerung 1 sek
int counter1 = 0;
char degree_sign = 0xDF; // Grad Celsius Zeichen auf LCD:
#define btnRIGHT 0 // Tasten Nr...
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
//----------------------------------

boolean debounce(int inputpin2) // Entprellroutine,
{
boolean state;
boolean previosState;
previosState=digitalRead(inputpin2);
for(int counter=0;counter<debounceDelay;counter++)
{
delay(1);
state=digitalRead(inputpin2);
if(state!=previosState)
{
counter=0;
previosState=state;
}
}
return state;
}

// Werte für Interuptzähler
volatile int counter0 = 0; //Schalter für countr0,
volatile int bounceTime = 50; //Entprellzeit in millisek.(50) für Schalter,
volatile unsigned int last_IRQ0;
volatile unsigned long last_micros;//die letzten millisek. in IRQ angekommen,

void irq_Svc0() // Entprellung, Zähler, Verbrauchsberechnung
{
if (inputpin2==HIGH)
if(debounce(inputpin2))
digitalWrite(inputpin2,HIGH);
long unsigned act_IRQ0; // Umdrehungen der Stokerschnecke zählen,
act_IRQ0=millis();
{
counter0++; // Zähler für Stokerschnecke,
counter1=counter0*1/10; // Zähler durch 10 teilen zur LCD Anzeige,
if(counter1>20000)counter1=0; // Zähler: gültiger Zustandswechsel, bei 4140 kg reset,
last_IRQ0 = act_IRQ0;
long unsigned act_counter1;
var=counter1 *207/1000; // Pelletverbrauch berechnen, 1 Umdr.= 20,725 gr. Pellets,
if (Serial.read()== ';') // Pelletverbrauch an LCD ausgeben,
Serial.println( var);
Serial.print( var);
}
{
val=digitalRead(inputpin2); // LED - Umdrehungsanzeige Stokerschnecke,
if(val==LOW)
digitalWrite(led13,HIGH); // LED Pin 13
delay(2000),
digitalWrite(led13,LOW);
}
}
Hallo Alle, habe den Fehler selbst gefunden und behoben. Für Counter0 und Counter1 habe ich nicht " int " sondern " unsigned long " deklariert nun rechnet er richtig.
Mit freundlichen Grüßen
neuling
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  OLED Display anzeige von Logo falsch ! b3ta 0 333 23.01.2016 15:12
Letzter Beitrag: b3ta
  erledigt: atan2 rechnet falsch? HaWe 0 343 30.11.2015 17:29
Letzter Beitrag: HaWe
  [gelöst] was ist falsch bei Wire.onReceive()? HaWe 0 631 26.09.2015 16:58
Letzter Beitrag: HaWe
  String falsch verstanden? hougy 20 1.800 07.07.2015 14:53
Letzter Beitrag: HaWe
  Arduino Ethernet mit USB 2 Serial Converter/Welche Einstellungen im Arduino-Sketch lociluke 1 1.107 05.05.2015 13:40
Letzter Beitrag: Bitklopfer
  Arduino Mega-Projekt mit EEPROM auf Arduino Due portieren Foto-Ralf 17 3.133 16.03.2015 12:06
Letzter Beitrag: Foto-Ralf
  sprintf formatiert völlig falsch ! HaWe 15 1.567 13.12.2014 10:04
Letzter Beitrag: HaWe
  Switch Case, LEDs bleiben an, Bedingung aber falsch luto92 4 1.444 16.11.2014 16:52
Letzter Beitrag: luto92
  Bluetooth Shield ließt Daten falsch ein mck7000 4 1.859 20.12.2013 19:54
Letzter Beitrag: mck7000

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste