joa, das weiss ich, die braucht man ja auch für farbcodes. ich weiss nur nicht, was hinter diesen zahlen steckt. also was genau spreche ich jetzt mit 0xfe00 an - weisst du, was ich meine?
Das sind Zahlen im Hexadezimalsystem. Nimm den Taschenrechner aus dem MS Windows Zubehör, stelle ihn auf wissenschaftliche Ansicht. Dann tippst Du in der Auswahl HEX die Zahl FF ein, stellst dann in der Auswahl auf Dez um und erhälst 255. 0xFE00 bedeutet 65024.
http://de.wikipedia.org/wiki/Hexadezimalsystem
joa, das weiss ich, die braucht man ja auch für farbcodes. ich weiss nur nicht, was hinter diesen zahlen steckt. also was genau spreche ich jetzt mit 0xfe00 an - weisst du, was ich meine?
Die Taster sind jeweils über einen Widerstand mit einem gemeinsamen Pin des ATMega verbunden. Jeder Tastendruck erzeugt eine andere Widerstandskombination und damit eine andere Spannung, die an dem Pin gemessen werden kann. Der Messwert wird dann noch so umgerechnet, dass jedem Bit im Ergebnis von PollSwitch() einem bestimmten Taster entspricht. Also mal vereinfacht gesagt. Verwirrend ist dann noch, das Bit0 für den Switch6 steht...
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hallo dasisch,
das Problem, ist eigendlich nicht ein 0x??-Wert, sondern eher die Funktion beschleunigen(). Ich habe die mal kopiert und KOMMENTIERT:
Die Reihenfolge von beruehrstop() und Msleep() ist deshalb bei dir so wichtig, weill dann NACH dem wiedereinschalten der Motoren ja sehr schnell wieder abgeschaltet wird (durch weiterhin gedrückten Taster).Code:void beschleunigen (int beschl, int geschwindigkeit) { int a=90; for (a=90;a<geschwindigkeit;++a) { 2) MotorDir(RWD,RWD); <-- Jetzt geht es aber weiter ... 3) MotorSpeed(a,a); <-- .. mit einer neuen Geschwindigkeit!!! BackLED (ON, ON); 1) beruehrstop(); <-- Taste gedrückt, dann MotorDir(BREAK,BREAK) <-- das geht. Msleep(beschl); } BackLED (OFF, OFF); }
Nun kommt das Msleep() mit einer im Verhältnis zur 'ein'-Zeit der Motoren sehr langen Zeit. Somit hast du den Strom nur ganz kurz an, und lange aus, also 'glaubst' du, dass die Motoren stehen.
Es könnte so gehen, dass die Motoren komplett gestoppt werden:
Ich frage mich allerdings, ob in der Funktion beruehrstop() das break; beiCode:void beschleunigen (int beschl, int geschwindigkeit) { int a=90; for (a=90;a<geschwindigkeit;++a) { MotorDir(RWD,RWD); MotorSpeed(a,a); BackLED (ON, ON); if (beruehrstop() == TRUE) // dann muss halt was zurueckkommen. break; // beendet hier das for{}, nicht die Funktion! Msleep(beschl); } BackLED (OFF, OFF); }
if (sw & 0x04)
MotorDir(BREAK,BREAK);
break;
gewollt ist??
Es verhindert eigendlich nur, das die Taster auf 0x08, 0x10 und 0x20 abgefragt werden, da es a) immer aufgerufen wird, und b) die Funktion verläßt.
Du solltest aber trotzdem überlegen, ob die Lösung von Asuro-n00b mit dem:
if (PollSwitch()>0)
MotorDir(BREAK,BREAK);
nicht doch sinnvoll ist. Du umgehst damt tatsächlich (fast) alle Probleme die bei den Tastern bzw. der Auswertung vorhanden sind.
Noch ein Wort zu dem 0xFE00 aus SelfTest()
Die Werte sind so ziemlich willkürlich gewählt und werden nur benutzt um die einzelnen Test (LineTest() SwitchTest() OdometrieTest() ...) ein bischen in die Länge zu ziehen. Sonst hast du ja nichts davon, wenn die nur 0,03 ms laufen würden
Lieber Asuro programieren als arbeiten gehen.
hi,
erstmal: das break soll natürlich nicht da rein, das war versehentlich noch beim kopieren drin. macht ja auch keinen sinn, im gegenteil...
ich habe das mit dem motor jetzt folgendermaßen gelöst:
danach stoppt der motor auch wirklich und die funktion zum drehen wird aufgerufen. vielen dank aber nochmal fürs genaue drüberschauen!Code:void beschleunigen (int beschl, int geschwindigkeit) { int a=90; for (a=90;a<geschwindigkeit;++a) { MotorDir(RWD,RWD); MotorSpeed(a,a); BackLED (ON, ON); if (beruehrstop()>0) { drehen(); break; } Msleep(beschl); } BackLED (OFF, OFF);
das mit den hexadezimalcodes hab ich jetzt glaube ich verstanden. es ist also so, dass damit eigentlich nur die Zahlen anders notiert werden, sodass man statt einer ganzen zahl dann beispielsweise 0xfe00 hat.
zu dem pollswitch > 0. das funktioniert bei mir nicht so ganz, scheinbar weil der erste schalter, wie bereits beschrieben, irgendwelche aussetzer hat und scheinbar immer mal wieder ein signal sendet. es funktioniert nur, wenn ich die schalter wie im quelltext anspreche.
So, jetzt erstmal ab in die schule -.-
Gruß,
Sven
Testweise kannst du auch PollSwitch()>3 machen. dann sind zwar 2 taster abgeschaltet, aber dafür weniger fehler.
Schule? Mann, du schreibst strukturierten Code, da denkt man nicht an Schule.Zitat von dasisch
Deshalb hier vielleicht doch noch mal eine Übersicht für die 0x??-Dinger, da es auch noch Binärzahlen, Oktalzahlen und weitere 'Notierungen' gibt:
Code:Dezimal[10] Hexadezimal[16] Oktal[8] Dual[2] 0 0 0 0 1 1 1 1 2 2 2 10 3 3 3 11 4 4 4 100 5 5 5 101 6 6 6 110 7 7 7 111 8 8 10 1000 9 9 11 1001 10 A 12 1010 11 B 13 1011 12 C 14 1100 13 D 15 1101 14 E 16 1110 15 F 17 1111 16 10 20 10000 17 11 21 10001 Wie man sehen kann, benötigst du für jedes System so viele verschiedene Zeichen (0,1,2,...,9,A,B,..) wie das System nun heisst. (Dezimal, Dual, Oktal, Hexadezimal [auch nur Hex genannt]) Also 'zählst' du in der Einer-Stelle immer nur ein Zeichen weiter, bis du alle erlaubten Zeichen 'verbraucht' hast. Dann erhöhen wir nun die 'Zehner-Stelle', bzw. nehmen sie dazu und fangen wieder in der Einer-Stelle mit 0 an. Bei anderen System als Dezimal, ist die Zehner-Stelle aber z.B. beim Hexadezimal-System, nun eine 16-ner-Stelle. Im Dezimalsystem 'weisst' du seit der Grundschule, dass 572 eigendlich folgendes bedeutet: 5 * 10^2 plus 7 * 10^1 plus 2 * 10^0 Im Hex-System tauscht du nur die 10^ gegen 16^ aus und benutzt noch A bis F als 'Zahlen'. Beispiel: 0xFE00 bedeutet: F * 16^3 plus E * 16^2 plus 0 * 16^1 plus 0 * 16^0 Dabei sind A=10, B=11, C=12, D=13, E=14 und F=15 einzusetzen. Und um dieses 'Durcheinander' auseinanderzuhalten wurde das 0x erfunden. Heisst einfach, dass z.B. 0x123 eben 291 in dezimaler Schreibweise sein soll. 0b wird für Dualzahlen benutzt. (b wie binary) 0o wird für Oktal benutzt. (Bin mir hier nicht ganz sicher) So, ich hoffe, dass ich noch eine Kerze zur Erleuchtung beitragen konnte.
Lieber Asuro programieren als arbeiten gehen.
hi, vielen Dank für die genaue erklärung. jetzt hab ichs auch komplett verstanden
Gruß,
Sven
0o123 ist richtig, oktalzahlen haben ein kleines o.
der compiler versteht allerdings nur dezimalzahlen und 0x-hex-zahlen
ich muss mich korrigieren:
dezimalzahlen:
1234567890
binärzahlen:
0b01010101
hexadezimalzahlen:
0x90ABCDEF
oktalzahlen:
012345670
oktalzahlen werden nur dadurch ausgezeichnet dass sie eine null voranhaben, KEINEN buchstaben. allerdings weiss ich nicht, wie der gnu-compiler das handhabt, schliesslich will er ja auch keine binärzahlen kennen...
Lesezeichen