Pages: [1]   Go Down
Author Topic: Probleme mit der Berechnung von Integer-Werten  (Read 701 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo ich habe folgendes Problem
Ich versuche eine über Schalter gestzte Bit-Kombination als Dezimalzahl auf auf einem LCD auszugeben.
Also wenn Schalter 1 HIGH ist dann soll das 2^0 sein wenn Schalter 2 HIGH ist dann soll 2^1 usw.
das berechnete Ergebnis soll dann als Dezimalzahl auf dem LCD erscheinen.
Nun mein Problem wenn ich das Array h[] und die Variable t als Integer deklariere dann bekomme ich falsche Ergebnise
mit float funktioniert ist. Kann mir bitte einer sagen warum das so ist??? Ich habe schon Stunden nach ähnlichen Problemen im Netz gesucht

Hier der Sketch:
Code:
#include <LiquidCrystal.h> //Aufruf der Bibliothek LCD


LiquidCrystal lcd(24,25,26,27,28,29); //Initialisierung der Anschlusspins

void setup()
{
  

  lcd.begin(16, 2); //Definition der Spalten und Reihen des LCD's
  lcd.clear();      //Display löschen
  
 pinMode(38, INPUT);  //Deklarierung der Pins als Eingänge
 pinMode(39, INPUT);
 pinMode(40, INPUT);
 pinMode(41, INPUT);
 pinMode(42, INPUT);
 pinMode(43, INPUT);
 pinMode(44, INPUT);
 pinMode(45, INPUT);


}

void loop()
{
 
boolean z[8];  //eindimensionale Array-Variable z wird dem Datentyp boolean zugewiesen
float h[8]={0,0,0,0,0,0,0,0};  //eindimensionale Array-Variable h wird dem Datentyp float zugewiesen und erhält den Wert 0
float t=0;  //Variable t wird dem Datentyp float zugewiesen und erhält den Wert 0
for (int j=0;j<=7;j++)
{
z[j] = digitalRead (45-j);  //Einlesen der digitalen Eingänge in die eindimensionale Array-Variable z
}

for(int i=0;i<=7;i++)  //for-Schleife für 8 Durchläufe
{
  if (z[i]==HIGH)  //if-Abfrage des Arrays z[] nach ihren Zuständen
  {
  h[i]=pow(2,i);  //Array h[] erhält die zugehörigen Binärwerte
  }
  else
  {
  h[i]=0;  //Array h[] erhält den Wert 0
  }
  
 t=t+h[i];  //Addition der eingestellten Binärwerte
}

 lcd.setCursor(0,0);  //Position des Cursors in der Anzeige; Zeile 1 und Spalte 0
 lcd.print("Dezimalwert:");  //Ausgabe des Wortes "Dezimalwert:"
 lcd.setCursor(0,1);  //Position des Cursors in der Anzeige; Zeile 2 und Spalte 0
 lcd.print(t);  //Ausgabe der Variable t
}
« Last Edit: November 11, 2012, 05:21:15 pm by uwefed » Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das Problem könnte sein, dass pow(int,int) nicht definiert ist.
pow(float,int) ist außerdem ziemlich Ressourcenaufwändig, genau wie float-Arithmetik an sich. Ich würde zu einer Variablen raten, die in jedem Schleifendurchlauf verdoppelt wird. Falls du das ganze dann weiter optimieren willst kannst du die Verdoppelung dann anstatt per Multiplikation auch per Addition realisieren oder per Bitverschiebung. Aber das ist auch nicht unbedingt nötig.
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 248
Posts: 21156
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich würde die 8 Eingänge eines Ports wählen und den entsprechenden Wert direkt aus dem Eingangsregister auszulesen.
Teorie für den ATmega328: http://www.arduino.cc/en/Reference/PortManipulation

Die Entsprechung der Pins mit den Ports kannst Du aus dem Schaltbild des Arduino Mega2560
http://arduino.cc/en/uploads/Main/arduino-mega2560_R3-schematic.pdf bzw aus diesem Dokument http://arduino.cc/en/Hacking/PinMapping2560 herauslesen.

Die Ansteuerung der Ports des ATmega2560 ist analog zu denen des ATmega328.

Einmal den Wert der 8 Schalter eingelesen kann er als Dezimalzahl ausgegeben werden.

Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke für die schnelle Antwort ich werde es mal ausprobieren. Ich habe mir eben auch nochmal die pow(x,y) genau angesehen und denke das die Funktion float-Werte erwartet und es deshalb zu Fehlern kommt.
Aber nochmals vielen Dank
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 248
Posts: 21156
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

wenn Du meinst und meinen Vorschlag zu kompliziert findest...


Du nimmst die Pins von 22 bis 29  wobei 22 das niederwertigste ist (PORTA)
Code:
setup(){
DDRA =B00000000; definiert die Pins als Eingänge.
PORTA=B11111111; aktiviert die Pullupwiderstände
}

loop()
{
lcd.print(PINA,dec);  liest die 8 Eingänge und druckt das Ergebnis.
}
Grüße Uwe
« Last Edit: November 11, 2012, 06:30:28 pm by uwefed » Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Natürlich ist Uwes Lösung die eleganteste, aber ob direkte Portmanipulation bei der Vermeidung von Fehlern hilft ist immer recht zweifelhaft.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja, dass ist bestimmt schon eine sehr gute Lösung aber ich bereite ein Schülerprojekt vor woran ein paar Grundlagen erlernt werden sollen und ich denke dafür ist die Lösung zu komplex.
Ich hätte aber noch eine weitere Frage .. Ich habe es jetzt anstatt mit der pow()-Funktion über die bit()-Funktion geschrieben und es funktioniert auch gut aber wenn ich zweistellige Werte habe und die Schalter ausschalte behält das Display immer die letzten Zeilen  Bsp: 128 wird angezeigt und nach abschalten des Schalter steht im Display für etwa 30 Sekunden 28. Warum ist das so???
Logged

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

Das liegt in den meisten Fällen an der Programmierung. smiley-wink Schreibt man eine dreistellige Zahl auf ein Display und will sie mit einer einstelligen überschreiben, muss man entweder den Displayinhalt komplett löschen oder die ursprünglichen Stellen mit Leerzeichen überschreiben.
Logged

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

Pages: [1]   Go Up
Jump to: