PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tasterwerte an Hyperterminal übergeben



Thraxas
15.11.2007, 19:52
Hi, wir programmieren den ASURO in der Schule im Informatik Leistungskurs, da meine Taster irgendwie spinnen wollte ich ein Programm schreiben, das mir anzeigt welche Werte die Taster zurückgeben. Denn mein Asuro gibt nicht die Bits zurück die es soll, also 1, 2, 4,...
Nun habe ich folgendes Programm geschrieben:



#include "asuro.h"

int main(void)
{
Init();


while(1)
{
char x=PollSwitch();
itoa(x, char string,16);
SerPrint(x);
x=0;

}

}



wenn ich das nun auf meinen ASURO flashe und das HyperTerminal anschalte und nacheinander die Taster drücke habe ich folgendes Problem:

kein Taster gedrückt --> es werden Nullen zurück gegeben (stimmt also)
Taster 1 --> es wird solange nichts zurückgegeben, wie ich den Taster gedrückt halte
Taster 2 --> 2 wird zurückgegeben -|
Taster 3 --> 4 wird zruückgegeben -|>--nicht immer, aber fast immer
Taster 4 --> 8 wird zurückgegeben -|
Taster 5 --> komische Zeichen
Taster 6 --> einmal komische zeichen und Programm hängt sich auf

Ich habe es auf zwei Asuro's getestet mit fast dem selben Ergebnis, kann mir vielleicht sagen was falsch ist, ich denke es liegt irgendwie an dem itoa(), da ich nicht weiß, ob ich die Funktion richtig angewandt habe. Ich hoffe es kann mir jemand helfen und bedanke mich schonmal im vorraus, für hilfreiche Antworten.

damaltor
15.11.2007, 20:36
definiere string vorher mal als "unsigned char string[5]" und rufe dann die funktion mit "itoa(x,string,10)" auf. x sollte evtl noch unsigned werden.

danach kannst du den wert mit SerWritean das terminal senden. hier eine korrigierte variante:


#include "asuro.h"

int main(void)
{ //beginn main
unsigned char x; //definition der pollswitch-variable
unsigned char string[5]; //definition eines string mit max. 5 zeichen
Init(); //initialisierung
while(1) //endlosschleife
{ //beginn while
x=PollSwitch(); //taster werden abgefragt
itoa(x,string,10); //wert wird umgewandelt und in string gespeichert
SerWrite(x,5); //string wird an terminal geschrieben
SerWrite("\n\r",2); //zeilenumbruch wird an terminal geschrieben ("\n" und "\r" sind je ein byte!)
} //ende while
} //ende main

Thraxas
15.11.2007, 20:53
Sorry, aber das funktioniert auch nicht, das HyperTerminal gibt immer noch nur Zeichen aus

damaltor
15.11.2007, 21:25
komisch.. kann da ma einer drüberschauen? XD

izaseba
15.11.2007, 21:43
komisch.. kann da ma einer drüberschauen?

Ich bin da mal so frei ;-)

was auffält ist

1.


#include <stdlib.h>
für itoa
gibt das keine Warnung ?

2.
itoa erwartet eigentlich einen Zeiger auf char und nicht unsigned char,
gibt das keine Warnung ?
also
char string[5]; //definition eines string mit max. 5 zeichen

3.
SerWrite erwartet einen Zeiger auf unsigned char (Käse) und die Anzahl der Zeichen, die ausgegeben werden, hier treten 2 Probleme auf

a. Ergebnis von itoa müsste gacastet werden
b. was Passiert wenn in itoa weniger als 5 Zeichen sind?

also nicht, wie damaltor wohl in Eile geschrieben hat


SerWrite(x,5);

sondern eher


SerWrite((unsigned char *)string,strlen(string));


oder sehe ich das zu kompliziert ? :-k
Das ist jetzt aber auch ungetestet....

Gruß Sebastian

Thraxas
15.11.2007, 21:58
Ja aber warum bekomme ich denn bei manchen Tastern die richtigen Werte, bei manchen nicht. Da gibts ja auch ein Programm mit dem die myasuro.h für seinen Asuro einstellt, aber mit geänderten werten für die taster ging es genau so wenig.

radbruch
15.11.2007, 22:03
Hallo

Der Code scheint ok zu sein, SerPrint() kenne ich allerdings nicht. Mir fällt eigentlich nur folgendes ein:

unsigned char einer, zehner, huni;
char s[1]="x";

einer=x%10;
zehner=(x-einer)/10;
huni=(x-(zehner*10+einer))/100; // edit
s[0]=huni+'0';
//if (huni) s[0]=huni+'0' else s[0]=' ';
SerWrite(s,1);
s[0]=zehner+'0';
SerWrite(s,1);
s[0]=einer+'0';
SerWrite(s,1);
SerChar("\n\r",2);

geht vielleicht noch einfacher, komm ich aber grad nicht drauf.

Gruß

mic

izaseba
15.11.2007, 22:05
Ja, sag erstmal, ob die Änderungen, die ich vorgeschlagen habe was gebracht haben

EDIT:


geht vielleicht noch einfacher, komm ich aber grad nicht drauf.

Ja mit itoa #-o

radbruch
15.11.2007, 22:18
@izaseba:

Weiß ich doch, das war die Anwort auf:


ich denke es liegt irgendwie an dem itoa()...
So gehts eben auch ohne itoa() (und damit auch ohne stdlib.h)

Übrigens jetzt auch mit hunis für 8Bit-Werte..

mic

izaseba
15.11.2007, 22:24
@radbruch, achso, ja ok. irgendwie bin nicht ganz bei der Sache ;-)

Übrigens strlen von oben braucht noch string.h und der cast war auch falsch, ich sag ja ich bin nicht bei der Sache.

Gruß Sebastian

izaseba
15.11.2007, 22:43
Ich habe da noch einen:

SerWrite("\n\r",2); //zeilenumbruch wird an terminal geschrieben ("\n" und "\r" sind je ein byte!)
Gibt auch eine Warnung (Warum werden sie denn immer ignoriert?)
Es muß wieder gecastet werden


SerWrite((unsigned char *)"\n\r",2); //zeilenumbruch wird an terminal geschrieben ("\n" und "\r" sind je ein byte!)

Da stellt sich ja die Frage, warum SerWrite nicht einen Zeiger auch char erwartet...
Ja O.K. wenn man Rohdaten verschicken will ist das ja gut, aber die meisten wollen ja chars verschicken, oder ?

Gruß Sebastian

radbruch
15.11.2007, 22:44
Als 8-Bit Partner von PrintInt() und um das off-Topic zu beenden:

void PrintChar(unsigned char x)
{
unsigned char einer, zehner, huni;
char s[3]="hze";
einer=x%10;
zehner=(x-einer)/10;
huni=(x-(zehner*10+einer))/100;
s[0]=huni+'0';
s[1]=zehner+'0';
s[2]=einer+'0';
SerWrite(s,3);
}

fehlt noch der Schalter für führende Nullen..

Das hätte ich mir auch schon früher zusammenbasteln können *schmoll*

Schöne Nacht noch

mic

izaseba
15.11.2007, 22:55
O.K. Offtopic ende, aber der hier ?


void PrintChar(unsigned char x)
{
char ergebnis[] = {'0','0','0'};
while (x >=100){
ergebnis[0]++;
x -=100;
}
while (x >= 10) {
ergebnis[1]++;
x -=10;
}
ergebnis[2] +=x;
SerWrite(ergebnis,3);
}

dürfte noch ein paar Bytes einsparen.

Gruß Sebastian

radbruch
15.11.2007, 23:01
geht vielleicht noch einfacher, komm ich aber grad nicht drauf.
Es geht tatsächlich einfacher (und genialer). *grins*

damaltor
15.11.2007, 23:43
PrintInt();

geht das nich...?

izaseba
16.11.2007, 00:09
PrintInt();

geht das nich...?

8-[ ja eben, warum nicht das, oder warum kämpfen wir hier mit SerWrite herum ? :-k

Ja,ja viele Wege führen nach Rom...

Gute Nacht

Sebastian

radbruch
16.11.2007, 00:15
PrintInt();

geht das nich...?
Das geht eben nicht mit der CD-Library. Und asuro-Neulinge stolpern meist schon über PollSwitch() bevor sie die erweiterten Libraries erreichen. Dann ist PrintChar() ideal.

mic

Sternthaler
16.11.2007, 02:50
Hallo zusammen.
Ich habe mal das von damaltor angepasste Programm mit der von von izaseba angegeben Korrektur zu "SerWrite((unsigned char *)string,strlen(string));" übersetzt.


#include "asuro.h"

int main (void)
{
unsigned char x; //definition der pollswitch-variable
unsigned char string [5]; //definition eines string mit max. 5 zeichen

Init ();
while (1)
{
x = PollSwitch (); //taster werden abgefragt
itoa (x, string, 10); //wert wird umgewandelt und in string gespeichert
SerWrite (string, strlen (string)); //string wird an terminal geschrieben
SerWrite ("\n\r", 2); //umbruch an terminal schreiben
//("\n" und "\r" sind je ein byte!)
}
}


Ja, es gibt jede Menge Warnings.
Aber:
- Alle warnings wegen 'signedness' können hier ignoriert werden. Es erfolgt an keiner Stelle eine Nutzung des höchsten Bits. Ist nur Compiler-Overload
- Die warnings wegen 'implicit declaration' können hier ignoriert werden. Bei keiner der Funktionen wird der (angenommene) int-Return-Wert überhaupt benutzt.

Der Output ist dann:

0
0
0
1
1
0
0
0
2
2
2
0
0
0
4
4
4
0
0
8
8
8
0
0
0
0
16
16
16
16
0
0
0
31
31
31
31
Wie man sehen kann, funktioniert bei mir die 6-te Taste nicht.
(Ich sollte mal bei mir die Lib neu machen ;-) )

Dem Käse-Einwand von izaseba zum SerWrite mit 'unsigned char' kann ich zustimmen. Änderung in der Lib ist drin, muss von m.a.r.v.i.n mal neu zusammengefasst, und gepostet, werden.

Das aber die Lib bei Thraxas schon benutzt wird, da bin ich mir ziemlich sicher, da er ja schon in seinem ersten Beitrag die Funktion SerPrint() aus der LIB benutzt.

@izaseba
Sollte deine Funktion PrintChar() nicht eher PrintuChar() heißen, dann könnte man noch eine 'echte' PrintChar() mit Vorzeichenausgabe für 'signed char' machen?

Gruß Sternthaler

Thraxas
16.11.2007, 10:26
Danke an alle, nun funktioniert es !!!

damaltor
16.11.2007, 20:34
sehr gut, vielerfolg weiterhin! =)

izaseba
16.11.2007, 21:02
Hallo Sternthaler,

- Alle warnings wegen 'signedness' können hier ignoriert werden. Es erfolgt an keiner Stelle eine Nutzung des höchsten Bits. Ist nur Compiler-Overload
- Die warnings wegen 'implicit declaration' können hier ignoriert werden. Bei keiner der Funktionen wird der (angenommene) int-Return-Wert überhaupt benutzt.


Das ist richtig, das Programm wird auch ohne diese Castorgie richtig laufen,
das Problem ist ja nur, wenn man die Warnings übersieht/ignoriert ignnoriert man auch richtig böse Warnings, wie 'make pointer from int' oder so.
Das war nicht böse gemeint, genauso wie mit 'Käse'...



@izaseba
Sollte deine Funktion PrintChar() nicht eher PrintuChar() heißen, dann könnte man noch eine 'echte' PrintChar() mit Vorzeichenausgabe für 'signed char' machen?

Ja Du hast wieder recht PrintuChar() wäre passender gewesen :-)
Es war eher aus der 'Ecke' 'wie komm ich ohne itoa aus...'

hmmm, wie könnte dann PrintChar() in der einfachsten Form aussehen :-k

Vielleicht so (als erster Gedanke)



void PrintChar(unsigned char x)
{
char ergebnis[] = {' ','0','0','0'};
if (x<0) {
ergebnis[0] = '-';
x * = -1;
}
if (x >=100){
ergebnis[1] = '1';
x -=100;
}
while (x >= 10) {
ergebnis[2]++;
x -=10;
}
ergebnis[3] +=x;
SerWrite(ergebnis,4);
}
Gefällt mir zwar nicht ganz, es ist aber 'der erste Gedanke'
Wenn da Interesse bestehen sollte kann ich mir weitere Gedanken drüber machen, sonst lasse ich es einfach

Gruß Sebastian

Sternthaler
17.11.2007, 00:04
Hallo izaseba,
das mit dem Käse ist ja schon erledigt. m.a.r.v.i.n hat irgendwo im Forum ein Update angekündigt. Es kann sich also nur noch um Minuten handeln, bis der Käse gegessen ist ;-)

Wenn du so weiter machst mit Print[u| ]Typen dann sollten wir bald dazu übergehen, dass du die printf()-Funktion reparierst.
Ich weiß nicht, ob du Vorschlag für die lib: PrintFloat (https://www.roboternetz.de/phpBB2/viewtopic.php?p=328384) schon gesehen hast, aber da tun sich im Moment Abgründe auf. Angefangen hat es mit: M1.R hatte ich sprintf() mit %f zur Formatierung empfohlen. (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=327067#327067) Dabei kam nur Schrott (manche würden von Käse reden ;-)) zustande.
Bis jetzt finde ich, dass deine Formatierungsfunktionen recht gut aussehen. Brutal, aber (sogar für mich) verständlich.

Bei den warnings gebe ich dir uneingeschränkt Recht. Ein 'bösartiger' warning muss natürlich erst einmal erkannt werden. Deshalb hatte ich versucht zu erklären, warum es diesmal gut geht.
OT: Das hatte ich mal, in Erinnerung an die Sprüche meiner Mutter, gedichtet: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=299067#299067

Gruß Sternthaler

izaseba
17.11.2007, 01:43
Wenn du so weiter machst mit Print[u| ]Typen dann sollten wir bald dazu übergehen, dass du die printf()-Funktion reparierst.

Ne, Du, das lasse ich lieber die printf funktioniert voll zu meiner Zufriedenheit ;-) itoa stört mich auch nicht weiter, aber wenn wir schon dabei sind...

Hier eine verbesserte Version von PrintChar() (ohne führende Nullen)
Ersparnis im Vergleich zu Wandlung mit itoa sagenhafte 90 Bytes (mit Minimalprogramm inkl. asurolib).



void PrintChar(signed char x)
{
char ergebnis[4];
char *pointer = ergebnis;
if (x < 0){
*pointer++ ='-';
x *=-1;
}
if (x>=100){
*pointer++='1';
x -=100;
}
if ( (x>=10) ||(*(pointer-1) == '1') ) {
*pointer = '0';
while(x>=10){
(*pointer)++;
x -=10;
}
pointer++;
}
*pointer++ = '0' + x;
SerWrite(ergebnis,pointer-ergebnis);
}

Gruß Sebastian

damaltor
17.11.2007, 06:31
ich denke mal gnaz spontan, dass man es gerade neuen usern so einfach wie möglich machen sollte. deshalb sollten soweit es geht alle warnings, die bekannt sind, ausgemerzt werden, damit die compiler-ausgabe so gut wie möglich aussieht. ausserdem ist es schon wahr: lass einmal jemanden versuchen, andere werte als pollswitch auszugeben, welche das MSB nutzen: dann wars das mit der signedness, die wird dann plötzlich sehr wichtig..

radbruch
17.11.2007, 10:39
Hallo

Schön wie sich die Funktion entwickelt.


lass einmal jemanden versuchen, andere werte als pollswitch auszugeben, welche das MSB nutzen
So auf Anhieb fällt mir grad keiner ein, der hier mit vorzeichenbehafteten Zahlen (signed) arbeitet. Die paar die es tun sind auch reif genug dafür und können das. Aber die asuro-Einsteiger wollen in erster Linie die Tasterwerte zum Terminal senden. Und denen werde ich in Zukunft mein einer-zehner-hunis-SerChar() aufdrängen. Das kann man dann auch sehr einfach auf 10 oder mehr Bits "aufbohren" oder führende Nullen unterdrücken. Offensichtlich gehts auch viel effizienter, aber übersichtlicher und für C-Neulinge verständlicher ist das auf keinen Fall.

Gruß

mic

damaltor
17.11.2007, 16:44
hmm das ist auch wahr. trotzdem ist die funktion recht speicherintensiv, und die warnings sollten wirklich verschwinden...

Sternthaler
18.11.2007, 02:22
Hallo Optimierer,
90 Byte gegenüber itoa() kann ja bestimmt einmal die Rettung sein. Allerdings muss auch ich sagen, dass man schon 2 mal auf die Funktion sehen muss um sie zu verstehen.
izaseba hatte den rettenden Tip im Asuro-Lottozahlen-Thread (https://www.roboternetz.de/phpBB2/viewtopic.php?p=328506#328506), auch die printf_flt-Lib einzubinden wenn man fprintf mit %f-Formatierung nutzen möchte. Da kamen dann ca. 5000 Byte nur für zwei printf zusammen.
So bleibe ich also doch dabei, das sich izaseba um die Optimierung kümmert ;-). Da kannst du dich jetzt nicht mehr wehren, so gut wie du das hinbekommst. :cheesy:

Gruß Sternthaler

izaseba
18.11.2007, 10:38
Da kamen dann ca. 5000 Byte nur für zwei printf zusammen.

:shock: :shock: da hab ich was 'optimiert', dagegen sind die 90 Bytes wohl nichts ;-)

Gruß Sebastian

izaseba
18.11.2007, 13:22
Hallo,

Ich habe neues zu berichten und zwar habe ich die Asurolib PrintInt etwas verbesert.
Ich denke das Ergebnis läßt sich sehen:

Ein Minimalprogramm mit der originalen PrintInt kompiliert


#include <asuro.h>

int main(void)
{
Init();
while(1)
{

//PrintChar(x);
PrintInt(-1000);
}
return 0;
}


Ergebnis


section size addr
.text 1160 0
.bss 18 8388704


Dann die geänderte PrintInt, die ich zwar noch PrintChar nenne, sie schluckt aber locker int


#include <asuro.h>

void PrintChar(int x)
{
int b=0;
if (x < 0) {
SerWrite('-',1);
x = -x;
}
if (x >= 10) {
while (x >= 10) {
b++;
x -=10;
}
PrintChar(b);

}
SerWrite(x + '0',1);
}


int main(void)
{
Init();
while(1)
{

PrintChar(-1000);
}
return 0;
}

Ergebnis


section size addr
.text 864 0
.bss 18 8388704


Ersparnis von 296 Bytes !
Meine Funktion benutzt zwar Rekursion, was den Stack etwas belastet, aber ich denke, es ist nicht so schlimm oder ?

Gruß Sebastian

damaltor
18.11.2007, 14:57
halte ich für besser. da die zahlenwerte nicht allzu lang sind sollte das kein problem darstellen...

Sternthaler
18.11.2007, 16:59
Hallo zusammen,

ich glaube, dass sich da noch ein Fehler eingeschlichen hat. Die SerWrite()-Funktion benötigt einen Pointer auf Daten. Aber hier werden 'Netto'-Bytes, also ohne Pointer, (z.B. das '-') an die Funktion übergeben.
Ersetzt mit UartPutc() und dann geht es bei mir perfekt.

Übrig bleiben ganze 56 Byte bei Optimizereinstellung -Os (size)


#include <asuro.h>

void PrintChar (int x)
{
int b = 0;

if (x < 0)
{
UartPutc ('-');
x = -x;
}
if (x >= 10)
{
while (x >= 10)
{
b++;
x -= 10;
}
PrintChar (b);
}
UartPutc (x + '0');
}


int main (void)
{
Init ();

while (1)
{
PrintInt (-9854);
PrintChar (-26978);
}
return 0;
}


Gruß Sternthaler.
P.S.: Na izaseba, jetzt kommt der Sport ;-)

izaseba
18.11.2007, 17:51
Hallo,


P.S.: Na izaseba, jetzt kommt der Sport


So ein Käse,
da denkt man, man hat was konstruktives vollbracht, und dann so ein Käse.
Das liegt wahrscheinlich daran, daß ich keine Zielhardware z.Z. habe und alles mehr oder weniger zusammenklicken muß (Gute Ausrede ? ) ;-)

Na gut, jetzt Plan B, ich hoffe, denn nimmst Du nicht so schnell auseinander, noch kleiner und ein Funktionsaufruf weniger:


#include <asuro.h>

void PrintChar(int x)
{
int b=0;
if (x < 0) {
while(!(UCSRA&(1<<UDRE)));
UDR = '-';
x = -x;
}
if (x >= 10) {
while (x >= 10) {
b++;
x -=10;
}
PrintChar(b);

}
while(!(UCSRA&(1<<UDRE)));
UDR = x + '0';

}


int main(void)
{
Init();
while(1)
{

PrintChar(-1000);
}
return 0;
}


Ergibt bei mir auch mit -Os


.text 730 0
.bss 18 8388704


1160 - 730 = 430 Bytes ?

{DerSimon}
18.11.2007, 18:19
Moin,

hab mal den Code von Sternthaler von der ersten Page kopiert.
Alles kein Problem, also draufgeflasht:

Wenn ich jetzt aber die Taster drücke wird nichts gesendet!
Ja, ich bin totaler Anfänger und hab zu 100% etwas falsch gemacht :)
Also helft mir bitte!


Gruß, Simon

izaseba
18.11.2007, 18:24
Nachtrag:

Damit wirklich nur das eingebunden wird, was auch benötigt wird, habe ich eben die Funktionen aus der Asurolib zusammengetragen und mit einem _ versehen,


#include <asuro.h>

void Uart_Putc (char zeichen)
{
UCSRB = 0x08; // enable transmitter
UCSRA |= 0x40; // clear transmitter flag
while (!(UCSRA & 0x20)) // wait for empty transmit buffer
;
UDR = zeichen;
while (!(UCSRA & 0x40)) // Wait for transmit complete flag (TXC)
;
}

/*void Ser_Print(char *data)
{
unsigned char i = 0;

while (data [i] != 0x00)
Uart_Putc (data [i++]);
}


void Print_Int(int wert) {
char text [7]; // "-12345"
itoa (wert, text, 10);
Ser_Print(text);
}*/

void PrintChar(int x)
{
int b=0;
if (x < 0) {
Uart_Putc('-');
x = -x;
}
if (x >= 10) {
while (x >= 10) {
b++;
x -=10;
}
PrintChar(b);

}
Uart_Putc(x + '0');

}


int main(void)
{
Init();
while(1)
{
// Print_Int(-1000);
PrintChar(-1000);
}
return 0;
}


Stand 928-744 = 184 Bytes

izaseba
18.11.2007, 18:29
Hallo Simon,

Normal müßte das Programm von Sternthaler funktionieren, komisch das.
Hast Du am Hyperterminal auch alles richtig eingestellt, 2400 Baud 8N1, richtige Com Schnittstelle ?

Gruß Sebastian

{DerSimon}
18.11.2007, 20:08
Ja, das ist richtig eingestellt!

Ich weiß woran es lag, teste das eben noch :)
Und zwar hab ich im Notepad die make+clean aus dem FirstTry
Ordner eingestellt. Den Switch test aber in einem anderen Ordner
gespeicher (FirstTry mit anderem Namen kopiert).
Dadurch wars immer der leere FirstTry Code. Vll
kann mir hier wer noch sagen wie ich das richtig mache?

Switch Test wie gesagt gleich!

Gruß, Simon

{DerSimon}
18.11.2007, 20:15
Öhm, ich bin mir grad nicht sicher was da ausgegeben werden sollte..
Idee: 00001111000022220000444400008888000016161616000032 323232

Bei mir kommt folgendes:




0
0
0
0
1
1
1
1
0
0
0
0
2
2
2
2
0
0
0
0
4
4
4
4
0
0
0
0
7
7
7
7
0
0
0
0
15
15
15
15
0
0
0
0
30
30
30
30
0
0
...
Code gekürzt.

Das ist falsch! ?
Sind die Taster kaputt?

Gruß, Simon

Sternthaler
18.11.2007, 20:39
Hallo izaseba,
ich glaube, das nun 2 Dinge dagegen sprechen:

[EDIT] Ich sehe gerade die Version 3 oder 4, ich meine hier die Version, bei der direkt in's UDR geschrieben wird.

[EDIT 2]Es wird in der neuen Asuro-Lib unter anderem eine kleine Änderung zum Stromsparen geben. Der Sender wird in der UartPutc()-Funktion zum Schluß wieder disabled. Dann würden nach dem Aufruf von SerRead() nie wieder Zeichen gesendet.
Da ist sie gerade von m.a.r.v.i.n eingestellt worden: Asuro Lib V2.71 veröffentlicht (https://www.roboternetz.de/phpBB2/viewtopic.php?p=328794)

1: Der Code für die Funktion ist mit 62 Byte gegenüber den oben angegebenen 56 Byte viel, viel größer geworden.
Die eingesparte Funktion PrintChar() wird ja spätestens dann auch mit eingebunden, wenn andere Strings zu senden sind.

2: Probiere mal das folgende Programm und achte besonders auf die zu zu übertragende "-2".
Das Problem ist, dass du in deiner Funktion nun nicht mehr den Sender einschaltest, so dass hier das '-'-Zeichen verloren geht. Warum danach überhaupt wieder gesendet wird kann ich allerdings nicht sagen.

#include <asuro.h>

void PrintChar (int x)
{
int b = 0;

if (x < 0)
{
while (! (UCSRA & (1 << UDRE)))
;
UDR = '-';
x = -x;
}
if (x >= 10)
{
while (x >= 10)
{
b++;
x -= 10;
}
PrintChar (b);
}
while (! (UCSRA & (1 << UDRE)))
;
UDR = x + '0';

}


int main (void)
{
char indaten [10];

Init ();

while (1)
{
PrintInt (-9876); UartPutc ('\n');
PrintChar (2); UartPutc ('\n');
PrintChar (1); UartPutc ('\n');
PrintChar (0); UartPutc ('\n');
PrintChar (-1); UartPutc ('\n');
SerRead ((unsigned char *)indaten, 1, 1); // Nicht auf Input warten
PrintChar (-2); UartPutc ('\n');
PrintChar (-3); UartPutc ('\n');
}
return 0;
}


Mal zu meinen Byte-Angaben. Ich sehe mir die *.lss-Datei an, und picke Start- und Ende-Position der Funktion raus.

void PrintChar (int x)
{
5e: cf 93 push r28
60: df 93 push r29
62: ec 01 movw r28, r24
int b = 0;

if (x < 0)
64: 97 ff sbrs r25, 7
66: 07 c0 rjmp .+14 ; 0x76 <PrintChar+0x18>
.
.
while (! (UCSRA & (1 << UDRE)))
8c: 5d 9b sbis 0x0b, 5 ; 11
8e: fe cf rjmp .-4 ; 0x8c <PrintChar+0x2e>
;
UDR = x + '0';
90: 9e 01 movw r18, r28
92: 20 5d subi r18, 0xD0 ; 208
94: 2c b9 out 0x0c, r18 ; 12
96: df 91 pop r29
98: cf 91 pop r28
9a: 08 95 ret

0000009c <main>:
Also 0x9c - 0x5e = 0x3e = 62 Byte


@{DerSimon}
Ich sehe gerade, dass du ein voll funktionsfähiges Programm hast.
Es sollten zwar die Zahlen 1, 2, 4, 8, 16 und 32 kommen, aber genau das ist ja die Aufgabe vom Programm rauszubekommen, ob das erfolgt. Bei dir ja nun nicht. Also musst du nur in der Funktion PollSwitch() den Multiplikator MY_SWITCH_VALUE (wenn du die Lib nutzt) oder den Wert 61 (kann auch 62 oder 63) in der Formel am Ende der Funktion anpassen.
Mit dem Programm aus ASURO emittelt Werte für Lib V2.70 myasuro.h selber (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=31073) kannst du dir diesen Wert ermitteln lassen, oder du versuchst es einfach mit Werten zo zwischen 55 und 70.
Kein Taster ist kaputt.

Gruß Sternthaler

{DerSimon}
18.11.2007, 21:05
Hey Sternthaler,

danke für den Link! Habs runtergeladen und geflashed.
Leider bekomme ich schon beim ersten Test keine Daten...
Nach drücken des ersten Tasters wird die StatusLED rot, und
das wars... Woran liegt das nun? An der Lib2.71?

gruß,Simon

Sternthaler
18.11.2007, 21:11
Hallo {DerSimon},
was hast du runtergeladen?
Die neue Lib, oder das Programm zum Werte-Ermitteln?

{DerSimon}
18.11.2007, 21:17
Alles :D Funktionierende Lib 2.71 von m.a.r.v.i.n. und die .hex inkl. des Sensorprogramms.

Gruß, Simon

Sternthaler
18.11.2007, 22:13
Hallo {DerSimon},
rote LED ist schon mal gut.
Die Daten werden kontinuierlich zum PC-Programm gesendet. Du musst also immer eine 'Sichtverbindung' mit den IR-Dingern haben.
Achte mal im PC-Programm auf die Fläche zwischen der Schnittstellenauswahl und dem Versionshinweis (unten links). Kommt da ab und zu Text, der fast nicht lesbar ist, da er immer wieder gelöscht wird? Wenn ja, versuch mal den Text zu lesen und hier zu posten.

P.S.: Das myasuro-h-Ermittlungsprogramm hat nichts mit einer Lib vom Asuro zu tun. Nimm einfach die im ZIP-File vorhandene Hex-Datei zum flashen.

Gruß Sternthaler

{DerSimon}
18.11.2007, 22:33
Moin,

also, da kommt gar nix :)
Die LED bleibt auch rot. Wo müsste ich denn den Wert ändern?
Eigentlich doch in der Lib, myasuro.h oder?


Gruß, Simon

Sternthaler
18.11.2007, 22:55
Hallo ??
Lesen ??

izaseba
19.11.2007, 00:35
[EDIT] Ich sehe gerade die Version 3 od

Ja sorry, ich habe es zu spät gesehen, daß der Sender ausgeschaltet wird.
Erst nachdem ich in der Libdoku (die übrigens super ist) etwas genauer gelesen habe.

Ja gut, ich belasse es dabei.
Mir hat es Spaß gemacht, das ganze zur Fuß zu machen, habe einfach nur gehofft, daß man sich etwas Flashspeicher einsparen könnte um irgendwas neues/sinnvolles aufzunehmen z.B. sowas hier (https://www.roboternetz.de/phpBB2/viewtopic.php?p=328776)

Wäre denn eine Funktion, die Zeichenketten auf den Flash auf die Serielle oder auf LCD schickt nicht ein geeigneter Kandidat ?

Gruß Sebastian

{DerSimon}
19.11.2007, 06:44
Hallo {DerSimon},
rote LED ist schon mal gut.
Die Daten werden kontinuierlich zum PC-Programm gesendet. Du musst also immer eine 'Sichtverbindung' mit den IR-Dingern haben.
Achte mal im PC-Programm auf die Fläche zwischen der Schnittstellenauswahl und dem Versionshinweis (unten links). Kommt da ab und zu Text, der fast nicht lesbar ist, da er immer wieder gelöscht wird? Wenn ja, versuch mal den Text zu lesen und hier zu posten.

P.S.: Das myasuro-h-Ermittlungsprogramm hat nichts mit einer Lib vom Asuro zu tun. Nimm einfach die im ZIP-File vorhandene Hex-Datei zum flashen.

Gruß Sternthaler

Gelesen.
Nein, da erscheint nichts.


Hallo ??
Lesen ??

Ja, hab ich. Trotzdem die Frage: Wo werden die ermittelten Werte von mir
spaeter eingefügt? Ich ging davon aus, dass die Datei myasuro.h zur
Lib gehört.

In diesem Sinne wünsche ich einen schönen Tag,

Simon

{DerSimon}
19.11.2007, 17:27
Moin,
nach einigem rumprobieren klappte es nun!
Allerdings mit komischem Ergebnis, im Feld
stand nach dem Test1 64, rechts folgendes:


Z10
Z11
<682 >
Z12
<817 >
Z13
<912 >
Z14
<963 >
Z15
<994 >
Z16
<1009>
<Fehler>
<50 |4 >
<51 |4 >
<52 |4 >
<53 |4 >
<54 |4 >
<55 |4 >
<56 |3 >
<57 |3 >
<58 |3 >
<59 |3 >
<60 |3 >
<61 |3 >
<62 |1 >
<63 |0 >
<64 |0 >
<65 |1 >
<66 |2 >
<67 |2 >
<68 |2 >
<69 |2 >
<70 |3 >
<71 |3 >
<72 |4 >
<73 |4 >
<74 |4 >
<75 |4 >
<76 |4 >
<77 |4 >
<78 |4 >
<79 |4 >
<80 |4 >
Z17

Öh, was hat das nun zu bedeuten?

Gruß, Simon

Sternthaler
20.11.2007, 00:34
Hallo {DerSimon}
na also. Da ist doch etwas, was du gebrauchen kannt. (Ich nun auch)
Wenn du nun etwas weiter links (im Programm ASURO-Sensoranzeige) unter dem Button 'Wie geht's', der nun 'Nochmal?' heisst, schaust, bekommst du den Wert für die myasuro.h "frei Haus" geliefert.

Mit den von dir angegeben Daten aus der rechten Seite ist das der Wert 64, der dann neben dem Text "MY_SWITCH_VALUE" steht. Hast du ja auch schon entdeckt.
Oben im ASURO-Sensoranzeige-Programm steht Datenermittlung für myasuro.h drüber.

Was wurde angegeben in der rechten Datenausgabe:
Z10 bis Z16 sind die Test-/Tracepunkte aus dem gerade aktiven Testprogramm.
In den <>-Klammern stehen in diesem Test (Test 1 wegen Z1n) die ADC-Messwerte nachdem du eine Taste am Asuro gedrückt hast. Dies sind 10-Bit-ADC-Werte.

Ich kann daran auch sehen, dass du die Asuro-Tasten in der richtigen Reihenfolge gedrückt hast, da der Messwert immer größer wird.

Dann kommt da der Text <Fehler>
In der folgenden Liste wird angegeben, wie viele Bit-Fehler im Ergebniss auftreten würden, wenn du den besagten Umrechenwert "MY_SWITCH_VALUE" mit der ersten Zahl aus der Liste setzen würdest. Die 2.te Zahl gibt dann die Anzahl der falschen Ergebnisse an.
Z.B.: Du setzt 61 als Wert für "MY_SWITCH_VALUE" ein, dann wird dir die Funktion PollSwitch() in 3 Fällen ein falsches Ergebnis liefern.
<61 |3 >

Du hattest angegeben:
1
2
4
7
15
30
Noch stärker gekürzt.
Und da sind die 3 Werte 8, 16 und 32 ja nicht richtig.
Ich nehme also an, dass du es tatsächlich noch nicht geschafft hast irgendwo etwas zu ändern, denn der Standardwert für "MY_SWITCH_VALUE" ist nun mal die 61.

Das alles auf der rechten Datenseite ist vollkommen uninterressant. Nettoergebnis steht immer rechtes neben den "MY_xxx_VALUEyy"-Texten.
Im übrigen geht Test 5 immer noch nicht, da der Wert noch nicht benutzt wird. Aufpassen bei der letzten Asuro-Taste. Da fährt er ein Stück in der Gegend rum. Aufpassen, dass er nicht vom Tisch fällt.

Und nun zur Frage wo du etwas ändern musst.

Die Datei myasuro.h gehört zur Lib. Ist richtig. Aber das Test-Programm nutzt nichts von der Lib. Ich glaube da haben wir uns missverstanden.

Warum also dann nicht mal nach der Datei suchen und da drin den Wert hinter dem "MY_SWITCH_VALUE" von 61 auf 64 ändern?
ACHTUNG: Ich vermute mittlerweile, dass du diese Datei schon häufig irgendwohin kopiert hast. Alle löschen. BIS AUF EINE STELLE. Im Verzeichnis der Lib muss sie natürlich vorhanden sein. Nur da kann auch eine Änderung gemacht werden, die dann in der Lib landen wird.

Wenn du die Datei gespeichert hast, muss natürlich die Lib neu übersetzt werden. Schliesslich gehört die Datei zur Lib.

Wenn die Lib übersetzt ist, dann musst du auch noch dein eigendliches Programm neu übersetzten. Denn erst dann kommt die Änderung der myasuro.h über die nun geänderte Lib in dein Programm.

Das ist eigendlich alles. OK, schwere Geburt ;-)

Gruß Sternthaler
P.S.: Ist jetzt genug Futter zum lesen. Beim nächsten mal fasse ich mich nicht kürzer. ;-)

P.P.S.: In dem Lib-Verzeichniss von m.a.r.v.i.n gibt es ein Unterverzeichnis doc. Darunter html. Darin ist die Datei index.html. (Weiss ich, dass du da schon mal reingesehen hast.)
Trotzdem weiter: Mach mal da den Doppeltulup, äh Doppelklick
Diese ganze Seite beschreibt die Lib, die Installation und die Anpassung in den Makefiles. (Das ist neu beschrieben in Version 2.71)
Kklick nun auf "Auflistung der Dateien". (nicht das +-Kästchen)
Runterscrollen zur Datei "myasuro.h" auf der rechten Seite.
Dort den Text dahinter lesen.
Einfachklick auf "myasuro.h [ code]" --> Lesefutter

{DerSimon}
20.11.2007, 20:13
Moin!

Danke für die ausführliche Antwort Sternthaler!
Hab nun alles verstanden, nur 2 Probleme:

1. Mit 64 liefert er im "Send" Programm
für 8 die 7, für 16 die 15 und für 32 die 30!
wenn ich Taster für 8(7) und für 32(30)
gleichzeitig drücke liefert er mir NICHT 37!
Sondern 38, demnach ist der Multiplikator 64
ja zu klein, richtig? Nur ändert sich mit 65 daran
nichts...

2. Ich kann nun nicht mehr mit deinem Programm testen,
da, wenn ich das Programm starte und COM1 auswähle
folgendes unten links steht:

Break
empfangen 1

Als es gestern ging stand da nichts ;)


Danke schonmal,

Simon

{DerSimon}
20.11.2007, 21:32
Update:

Sensorprogramm funktioniert - weiß nicht warum..

Aber: egal welchen Wert ich in der myasuro.h einsetze,
also ob 50L oder 65L, erl liefert mir 1,2,4,7,15,30...

Es ist auch egal ob ich es in der myasuro.h definiere,
oder statt der Variable in switches.c schreibe!
Er gibt immer die selben Werte aus :(

Hoffe ihr wisst weiter!

Grüße und eine geruhsame Nacht,

Simon

m.a.r.v.i.n
20.11.2007, 23:22
Hallo Simon,



Es ist auch egal ob ich es in der myasuro.h definiere,
oder statt der Variable in switches.c schreibe!


Hast du die Asuro Lib auch wirklich neu übersetzt?
Dein Testprogramm muß anschließend natürlich auch neu übersetzt werden. Dort wird ja die AsuroLib mitgelinkt.

Sonst bewirken deine Änderungen in der myasuro.h nämlich gar nichts.

{DerSimon}
21.11.2007, 10:58
Moin M.a.r.v.i.n. ,

du meinst über die make-lib.bat?
Ja, schon :)
Ich probier heute Mittag nochmal rum!

Grüße, Simon

damaltor
21.11.2007, 14:15
du musst die lib UND das testprogramm neu kompilieren! die gleiche .hex-datei wieder zu flashen ist witzlos :)

{DerSimon}
21.11.2007, 17:26
Hab ich schon getan, doof bin ich ja nicht ;)

Hab nochmal in switches.c die VAR rausgenommen,
und danach wieder alles auf "Standard" gesetzt.
In myasuro.h 64L eingetragen und voilà:

Es klappt!

Kleine Ungereimheit: Taster3+Taster1 liefern zusammen nicht
32+8=40 sondern 41 - normal?

Grüße und danke euch allen,

Simon

Sternthaler
21.11.2007, 19:47
Hallo {DerSimon},
Ja leider ist das 'normal'.

Das myasuro.h-Ermittlungs-Programm holt einen 'möglichst' guten Wert.
Da aber die Toleranzen der beteiligten Widerstände bei den Tastern alle unterschiedlich sind, und nicht jede Tastenkombination geprüft werden kann, kann es zu solchen 'Ausrutschern' kommen.

Hier bleibt dir nur übrig, dass du in der myasuro.h mal den Wert 63 probierst.

Angegeben war ja:
<61 |3 >
<62 |1 >
<63 |0 >
<64 |0 >
<65 |1 >
Somit liefert auch der Wert 63 noch fehlerfreie Tasten. (Natürlich nur einzeln gedrückt).

Gruß Sternthaler