Ok
Das heißt er zählt richtig und wenn er von 4 auf 1 Stelle springt sind die letzten 3 einfach wegzudenken
Oder
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
Lesezeichen