Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit dem asuro rechnen ????
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 :(:(:(:(
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.
Ja Hallo hast du da vieleicht ein Code-Beispiel ich stehe voll auf den Schlauch.
Für mich ist es gerade ein riesen Problem.
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);
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
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.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.