PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit dem asuro rechnen ????



EIK
07.06.2012, 17:51
Hallo Leute,
Ich möchte mit meinem Asuro eine dreistellige Zahlen mit 2 multiplizieren.
Ich möchte meinem asuro über das hyperterminal eine dreistellige Zahl die er multipliziert und sie mir dann über das hyperterminal ausgibt!!
für einen anstoß bzw tipp wäre ich erfreut.
weiss nicht wo ich anfangen soll :(:(:(:(

shedepe
07.06.2012, 18:09
Hallo, das ist kein Problem.
Einfach im Asuro das was über die serielle Schnittstelle reinkommt (die 3 stellige Zahl) einlesen. In einen integer konvertieren, dann man 2 nehmen und wieder über die serielle Schnittstelle ausgeben.

EIK
07.06.2012, 18:12
Ja Hallo hast du da vieleicht ein Code-Beispiel ich stehe voll auf den Schlauch.
Für mich ist es gerade ein riesen Problem.

shedepe
07.06.2012, 21:26
Für den Arduino gibt es mehr als genug Beispiele wie man
1. Daten von der Seriellen schnittstelle einliest (Serialport.Read())
2. Datentypen in einander umwandelt ( itoa() )
3. Wie man mit Integern rechnet
4. Wie man Daten über die Serielle Schnittstelle ausgibt

Mit den Informationen solltest du es selbst hinbekommen ( Lerneffekt und so....)

Wenn nicht schreib doch bitte an welcher Stelle du genau hängst und welchen Code du bisher hast

radbruch
07.06.2012, 22:20
Hallo

Man könnte das vielleicht auch "von Hand" ausrechnen:


// asuro multipliziert dreistellige Zahl mit 2 mic 7.6.2012

// Die über die serielle Schnittstelle empfangene dreistellige Zahl wird üngeprüft
// mit zwei multipliziert und das Ergebniss wird zurückgesendet

// https://www.roboternetz.de/community/threads/58106-Mit-dem-asuro-rechnen

#include "asuro.h"

char zahl[3]; // drei Ziffern mit Index 0 bis 2
char ergebniss[4]; // das Ergebniss könnte vierstellig sein
unsigned char temp, i, uebertrag;

int main(void)
{
Init();
SerWrite("\n\rasuro Taschenrechner\n\n\r", 25);

SerWrite("Bitte dreistellige Zahl eingeben\n\rund mit [Enter] absenden\n\r", 60);
SerRead(zahl, 3, 0); // drei Zeichen ohne Timeout einlesen

StatusLED(YELLOW);
i=2; // Index auf Einerstelle setzen
uebertrag=0; // noch kein Übertrag von der vorhergehenden Stelle

do
{
temp=zahl[i]-'0'; // Ziffer von ascii nach dezimal umrechnen
temp=temp*2+uebertrag; // mit 2 multiplizieren und Übertrag berücksichtigen
if(temp > 9) // Übertrag erkennen
{
uebertrag=1; // Übertrag auf nächste Stelle
temp=temp-10;
}
else
uebertrag=0; // kein Übertrag
ergebniss[i+1]=temp+'0'; // Wert in ascii-Ziffer umrechnen und speichern
}while(i-- != 0); // nächste Stelle berechnen

if(uebertrag) // erste Stelle berechnen (keine Prüfung auf führende Nullen)
ergebniss[0]='1'; // 1 wenn Übertrag...
else
ergebniss[0]=' '; // sonst Leerzeichen

SerWrite(ergebniss, 4); // Ergebniss ausgeben
SerWrite("\n\r",2);

StatusLED(RED); // Aufgabe erledigt und Programmende
while(1);
return(0);
}(ungetestet)

Keine Ahnung ob das so funktioniert. Wenn du es zu laufen bringst und kapiert hast, wie ich mir das gedacht habe, hast du auch schon einiges gelernt. Als Zusatz könnte man noch eine Prüfung der eingegebenen Zahl einbauen, die führenden Nullen entfernen und das Ganze als Endlosschleife umsetzen.

Gruß

mic

[Edit]

SerWrite(zahl, 3); // Ergebniss ausgeben
SerWrite("*2=", 3);
SerWrite(ergebniss, 4);
SerWrite("\n\r", 2);

Vilem
09.06.2012, 15:17
Hallo radbruch,
ja Freude für mich, Dein code funktioniert ! Ich habe auch Deinen 2. Teil und eine Endlosschleife eingefügt. Leider habe ich den SerWrite-Befehl noch nicht gerafft: statt *2 wird nd ausgegeben und an das Ergebnis ein n angehängt. Enter braucht bei dreistelliger Zahl nicht eingegeben werden (Ergebnis kommt von selbst), aber bei nur zweistelliger, Ergebnis ist dann um 1 zu hoch, d.h. die Mathe-Syntax habe ich nur bruchstückhaft kapiert.

// asuro multipliziert dreistellige Zahl mit 2 mic 7.6.2012
// Die über die serielle Schnittstelle empfangene dreistellige Zahl wird üngeprüft
// mit zwei multipliziert und das Ergebniss wird zurückgesendet
// https://www.roboternetz.de/community/threads/58106-Mit-dem-asuro-rechnen
#include "asuro.h"
char zahl[3]; // drei Ziffern mit Index 0 bis 2
char ergebniss[4]; // das Ergebniss könnte vierstellig sein
unsigned char temp, i, uebertrag;
int main(void)
{

while(1)
{
Init();
SerWrite("\n\rasuro Taschenrechner\n\n\r", 25);
SerWrite("Bitte dreistellige Zahl eingeben\n\rund mit [Enter] absenden\n\r", 60);
SerRead(zahl, 3, 0); // drei Zeichen ohne Timeout einlesen

StatusLED(YELLOW);
i=2; // Index auf Einerstelle setzen
uebertrag=0; // noch kein Übertrag von der vorhergehenden Stelle
do
{
temp=zahl[i]-'0'; // Ziffer von ascii nach dezimal umrechnen
temp=temp*2+uebertrag; // mit 2 multiplizieren und Übertrag berücksichtigen
if(temp > 9) // Übertrag erkennen
{
uebertrag=1; // Übertrag auf nächste Stelle
temp=temp-10;
}
else
uebertrag=0; // kein Übertrag
ergebniss[i+1]=temp+'0'; // Wert in ascii-Ziffer umrechnen und speichern
}while(i-- != 0); // nächste Stelle berechnen
if(uebertrag) // erste Stelle berechnen (keine Prüfung auf führende Nullen)
ergebniss[0]='1'; // 1 wenn Übertrag...
else
ergebniss[0]=' '; // sonst Leerzeichen
SerWrite(zahl, 3); // Ergebniss ausgeben,

SerWrite("*2=", 3);
SerWrite(ergebniss, 4);
SerWrite("\n\r", 2);
//SerWrite(ergebniss, 4); // Ergebniss ausgeben
//SerWrite("\n\r",2);
StatusLED(RED); // Aufgabe erledigt und Programmende
}
while(1);
return(0);
}

radbruch
09.06.2012, 19:01
Hallo

Schön, wenn es auf Anhieb funktioniert. :)

Vielleicht funktioniert diese Variante:

zahl[0]='*';
zahl[1]='2';
zahl[2]='=';
SerWrite("zahl", 3);

Serwrite(text, anzahl) sendet anzahl Werte ab der Speicherstelle deren erste Adresse die Speicheradresse von text ist.

Von zweistelligen Zahlen haben wir nie gesprochen...

Gruß

mic

EIK
12.06.2012, 12:14
Hey Jungs, hat einwandfrei geklappt :) Entschuldigt bitte das ich mich so spät melde, hatte am Wochenende Schützenfest etc :D
Ich hab nur die Libary geändert und das wars ;)
Schöne Woche noch.