-
Bei utoa ist der String wie sonst bei C üblich mit einer "o" als Ende markiert. Die Routine SerWirte() scheint immer stur 5 zeichen zu schreiben. Da kommt dann eine Mischung mit dem alten Pufferinhalt raus. Die oben gezeigte 1740 sind wohl eine 1 , dann das Trennzeichen (ASCII code 0 -> wird nicht gezeigt) und dann 740 als Rest aus dem Puffer (von 32740).
-
Ok
Das heißt er zählt richtig und wenn er von 4 auf 1 Stelle springt sind die letzten 3 einfach wegzudenken
Oder
-
Habe jetzt nochmal zusammengefasst (Weil etwas funktioniert)
Hier mein Code
Code:
#include <stdbool.h>
#include <stdio.h>
#include <asuro.h>
int main(void)
{
Init();
char zC[2];
unsigned char umschaltpunkt;
int t = 0,z = 0;
/*******************************************************************************************/
while( 1 )
{
if(Gettime() > umschaltpunkt) // Umschaltzeitpunkt überschritten?
{
umschaltpunkt += 1000; // neuen Umschaltzeitpunkt festlegen
z++;
}
if (PollSwitch() == 1)
z=80;
if (PollSwitch() == 2)
z=65500;
if (PollSwitch() == 4)
z=32740;
if (PollSwitch() == 16)
z=0;
/**********************************************************************/
//sprintf(zC, "%d", z); //Übertragen
utoa (z, zC, 10);
SerWrite(zC, 5); //Übertragen
SerWrite (" zC\n\r", 6); //Übertragen
for (t=0; t< 40; t++) //Übertragen
{ //Übertragen
Sleep (72); //Übertragen
} //Übertragen
/***********************************************************************/
if (z > 200)
z=0;
}
return 0;
}
Hier HT ausgabe
Code:
65528 zC
65529 zC
65530 zC
65531 zC
65532 zC
65533 zC
65534 zC
65535 zC //So stimmt es Da ich oben z mit int deklarieert habe
0535 zC
1535 zC
2535 zC
3535 zC
4535 zC
5535 zC
6535 zC
Wenn ich z mit unsigned int deklariere:
Init();
char zC[2];
unsigned char umschaltpunkt;
int t = 0;
unsigned int z = 0;
Code:
10 zC
11 zC
12 zC
13 zC
14 zC
15 zC //Taster gedrückt
30000 zC // fangt er immer wieder bei null an
1000 zC
2000 zC
3000 zC
4000 zC
5000 zC
6000 zC
7000 zC
8000 zC
9000 zC
1000 zC
1100 zC
Wieso?
-
Das Problem ist immer noch die Ausgabe aus dem Puffer. Genau wie vermutet kommt das Problem, wenn die Zahl der Ziffern abnimmt.
Die komischen Kästchen sind ein schönes Beispiel dazu.
-
Das oben genannte Programm stimmt eigentlich nicht
Weil:
int t = 0,z = 0; (z müsste eigentlich bis 32768 zählen)
es zählt aber bis 65535
Wieso
Keine Ahnung bitte helft mir wenn ihr eine Idee habt
Lg
-
Für die Addition, Subtraktion und halt auch das z++ macht es keinen Unterschied ob die variable als int oder uint deklariert ist. Da wird einfach der selbe ASM-code erzeugt. Der Unterschied kommt nur dadurch wie die Zahlen ab 32768 interpretiert werden. Das selbe Bitmuster kann z.B. als 32768 (uint16) oder -32768 (int) interpretiert werden.
Was ausgegeben wird wird entsprechend festgelegt durch den Formatstring beim printf oder halt die Wahl ob man utoa oder itoa nimmt. Eine strenge Prüfung ob das zur Variablendeklaration passt findet nicht statt. Eine Warnung wäre schön - kommt aber wohl nicht.
-
doch
Diese 3
test.c:35: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
test.c:36: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
test.c:8: warning: 'umschaltpunkt' may be used uninitialized in this function
Lg
-
Die Warnungen verstehe ich nicht ganz. Die haben auch nichts mit der Umwandlung zu tun, sondern erst mit der Ausgabe und der Funktion SerWrite(), wohl aus "Asuro.h".
Die Hoffnung wäre eventuell eine solche Warnung zu bekommen wenn man utoa() mit einer Integer Variable aufruft.
Da ist noch ein Problem: zC ist mit als 2 Zeichen langer Puffer definiert - der sollten wenigstens 7 Zeichen lang sein ( für "-12345" und eine 0 als Abschluss).
-
Hallo
Ich habe es jetzt auf 7 geändert und habe das gleiche Ergebniss