Was ist nun eigentlich das US-Modul?
Was ist nun eigentlich das US-Modul?
hi allerseits,
ich versuche mich wieder mal an meinem projekt, mit der batteriespannung und dem aussortieren der ausreisser bin ich eigentlich zufrieden, obwohl man es sicher elegenter machen kann:
ich wollte mir aber zu den Batterie() werten auch noch die daraus errechnete spannung ausgeben, was ich auch mache, wo und wonach ich auch suche, es wird einfach nix im terminal ausgegeben...Code:/*ladestation_anfahren*/ #include "asuro.h" #include "inka.h" #include "stdio.h" unsigned int batt_1; unsigned int batt_2; unsigned int batt_3; double u_batt; int main (void) { Init(); WaitforStart(); while(1) { (batt_1)=Batterie(); (batt_2)=Batterie(); (batt_3)=Batterie(); if ((batt_1)<((batt_2)-(batt_2)/100)) (batt_1)=Batterie(); if ((batt_2)<((batt_3)-(batt_3)/100)) (batt_2)=Batterie(); if ((batt_3)<((batt_1)-(batt_1)/100)) (batt_3)=Batterie(); (u_batt)= 0,0055*Batterie(); SerWrite("\r\n batt_1: ",11); PrintInt(batt_1); SerWrite(" batt_2: ",9); PrintInt(batt_2); SerWrite(" batt_3: ",9); PrintInt(batt_3); SerWrite(" u_batt: ",9); printf ("%5f", (u_batt)); SerWrite(" [V]",4); { EncoderInit(); if (PollSwitch()>0) { StatusLED(RED); Go (-100, 150); } else { Go (200, 150); StatusLED(GREEN); Msleep(500); } if (PollSwitch()>0) { StatusLED(RED); Go (-100, 150); } else { Turn (90, 150); StatusLED(YELLOW); Msleep(500); } } } return 0; }
auszug aus dem oberen code:
was stimmt da nicht?Code:PrintInt(batt_3); SerWrite(" u_batt: ",9); printf ("%5f", (u_batt)); SerWrite(" [V]",4);
gruß inka
Hallo inka,
printf alleine funktioniert so nicht. Dazu müßtest du die Ausgabe (STDOUT) auf die serielle Schnittstelle umleiten. Alternativ könntest du sprintf verwenden, dann ist das Ziel ein String. Den könntest du dann mit SerWrite ausgeben.
Wie das geht, steht im mikrocontroller.net Tutorial
Für Floating Point Ausgaben benötigts du zudem noch eine AVR Lib, die du im Makefile hinzufügen mußt, siehe
http://www.mikrocontroller.net/artic...mit_AVR-Studio
Allerdings fiunktioniert die Umleitung von STDOUT, so wie im Tutorial beschrieben, mit neueren AVR-GCC Compilern wohl nicht mehr.
hi allerseits,
dank Printfloat bin ich wieder ein kleines stückchen im projekt weitergekommen, jetzt kann ich am monitor den stand der batterieladung überprüfen. Schön wäre es allerdings, wenn ich jetzt noch ein schritt weiterkäme - den batteriestand in Volt auf der LCD erweiterungsplatine anzuzeigen. dazu muss ich die am monitor ausgegebene floatvariable wieder in einen string umwandeln um sie dann "pixel für pixel" auszugeben. Ist das so? Ich habe im asuro-band II nämlich keine funktion gefunden, die es möglich macht irgendwelche, wie auch immer geartete variable auszugeben. Nur text und pixel...
gruß inka
text ist schonmal nicht schelcht.
ich hab mal nen ansatz zum nachdenken für dich:
du hast eine zahl die den batteriezusatnd beschreibt. am besten wäre ein int oder ein char.
wenn du aus diesem die einzelnen ziffern extrahierst (dazu unten mehr), macht das die sache einfacher. beispiel: aus 123 wird 1 und 2 und 3
jetzt such n dem display-zeichensatz nach der position der null. direkt dahinter kommen 1,2,3... usw. wenn du jetzt den positionswert der null zu einer zahl die du so extrahiert hast addierst, kommst du automatisch auf das richtige, auszugebende zeichen. beispiel: wir nehmen an, dass die null den wert 48 (oder 0x30) hat. jetzt wollen wir die zahl 140 ausgeben:
zuerst zerlegen: 1 4 0
jetzt die eins ausgeben:
48 + 1 = 49 --> wert für eine eins auf dem display
48 + 4 = 52 --> wert für eine vier auf dem display
48 + 0 = 48 --> wert für eine null auf dem display
jetzt brauchen wir nur noch eine methode, um die ziffern aus der ganzen zahl rauszubekommen. diese die ich dir jetzt zeige geht nur für ganzzahlen, also chars und ints. in diesem falle nehme ich einen char als beispiel, die integer funktionieren genauso (bloss dass die zahlen zwei stellen mehr haben).
Beispiel: 246
zuerst wollen wir die hunderterstelle haben.
unsigned char hunderter(unsigned char zahl){
return zahl/100;
}
das war schonmal recht einfach. die zahl wird durch 100 geteilt, der rest fällt weg, und die hunderter bleiben. 246 / 100 = 2
jetzt die zehner:
unsigned char zehner(unsigned char zahl){
return (zahl - (100 * hunderter(zahl)))/10;
}
zuerst wird hundert mal die hunderterstelle abgezogen und dann der rest durch 10 geteilt.
246 - 100*2 = 46
46 / 10 = 4
jetzt nur noch die einerstelle:
unsigned char einer(unsigned char zahl){
return zahl - (100*hunderter(zahl)) - (10*zehner(zahl));
}
es werden erst hundert mal die hunderterziffer, und dann zehn mal die zehner-ziffer abgezogen.
246 - 100*2 - 10*4 = 6
und dann kannst du das so machen wie oben beschreiben. den zeichenwert der null addieren ("offset") und ans display ausgeben.
hi damaltor,
danke erstmal, die erkklärung zu den stellen im display so weit verstandan...
frage noch dazu:
was bedeutet das konkret?(bloss dass die zahlen zwei stellen mehr haben).
in diesem beispiel ist "unsigned char hunderter" eine vorher noch zu definierende variable, die nach der ausführung der berechnung im o.g. beispiel den wert 2 hat?Beispiel: 246
zuerst wollen wir die hunderterstelle haben.
unsigned char hunderter(unsigned char zahl){
return zahl/100; }
"(unsigned char zahl)" entspricht im beispiel der zahl 246 (die ja auch noch zugewiesen werden muss? Könnte dort die zahl vor dem komma aus dem spannungswert der batterie übernommen werden (natürlich die einserstelle incl. der berechnung)?
mit "{ return zahl/100;}" wird das ergebnis hunterter berechnet und wo ausgegeben?
gruß inka
Hallo
Das Thema "PrintChar()" hatten wir grad in einem anderen Thread. Das Ergebniss ist eine geile Funktion von izaseba weiter unten im Thread:
https://www.roboternetz.de/phpBB2/vi...=328202#328202
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
unsigned char hunderter ist die funktion, welche aus dem "unsigned char zahl" die hunderterstelle extrahiert und mit return zurückgibt.
beispiel:
hunnis = hunderter(batteriespannung)
zehnis = zehner(batteriespannung)
einis = einer(batteriespannung)
jetzt ist in jeder der drei variablen ein byte gespeichert, das die jeweilige stelle reräsentiert, bei 246 also:
hunnis = 2
zehnis = 4
einis = 6
das sind also keine variablen, sondern funktionen :P
radbruch: es geht nicht um das senden ans terminal, sondern um das senden an ein lcd display...
hi damaltor,
du hast es nicht einfach mit mir
dieser code:
liefert diese warnunge, bzw. fehlermeldungen:Code:int main(void) { Init(); unsigned int zahl; zahl=Batterie(); unsigned int hunderter(unsigned int zahl){ return zahl/100; } SerWrite("\r\n hunderter: ",14); PrintInt(hunderter); return 0; }
leider verstehe ich weder das eine noch das andereCode:../lcd_ausgabe.c:21: warning: passing arg 1 of `PrintInt' makes integer from pointer without a cast ../lcd_ausgabe.c:24: internal compiler error: trampolines not supported
gruß inka
Lesezeichen