Go Down

Topic: Probleme mit der Berechnung von Integer-Werten (Read 866 times) previous topic - next topic

Schleckig

Nov 11, 2012, 11:01 pm Last Edit: Nov 11, 2012, 11:21 pm by uwefed Reason: 1
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: [Select]
#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
}

Fat D

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.

uwefed

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

Schleckig

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

uwefed

#4
Nov 12, 2012, 12:03 am Last Edit: Nov 12, 2012, 12:30 am by uwefed Reason: 1
wenn Du meinst und meinen Vorschlag zu kompliziert findest...


Du nimmst die Pins von 22 bis 29  wobei 22 das niederwertigste ist (PORTA)
Code: [Select]
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

Go Up