Dann würde ich an deiner Stelle hier ansetzen
1 | PORTB ^= (1 << LED1); // LED1 an PB1 an-/ausschalten
|
2 | startmagnetismus(); // readout the sensor
|
3 |
|
4 | testx = sign12(puzzle_x); // get 12bit from x-axis
|
5 | testy = sign12(puzzle_y); // get 12bit from y-axis
|
6 | testz = sign12(puzzle_z); // get 12bit from z-axis
|
7 |
|
8 | arcx = (double) testx; // typecast x-avlue to calculate atan2
|
9 | arcy = (double) testy; // typecast y-value ..
|
10 | kurs = atan2(arcx,arcy)/PI*180; // calculate heading by atan2 (so result is also possible if
|
11 | // x = 0 or y = 0)
|
und die Werte für testx, testy und testz mit bekannten Werten fix
besetzen und erst mal nachsehen ob die Ausgabekette bis zum
Hyperterminal den Fehler verursacht.
WEnn gesichert ist, dass das fehlerfrei funktioniert (auch die sign12
Funktion), kann der Fehler nur noch irgendwo in startmagnetismus()
stecken :-)
Sukzessive eine Fehlerquelle nach der anderen ausschliessen.
Angefangen wird immer bei den Ausgabefunktionen. Die müssen als erstes
getestet werden, denn sie sind deine einzige Möglichkeit Einblick in die
Porgrammfunktion zu gelangen.
Ich würde mir an deiner Stelle auch eine Funktion
1 | void uart_puti( int number )
|
2 | {
|
3 | char buffer[20];
|
4 | itoa( number, buffer, 20 );
|
5 | uart_puts( buffer );
|
6 | uart_puts( "\n" );
|
7 | }
|
8 |
|
9 | void uart_debug( const char* text, int number )
|
10 | {
|
11 | uart_puts( text );
|
12 | uart_puts( " " );
|
13 | uart_puti( number );
|
14 | uart_puts( "\n" );
|
15 | }
|
schreiben.
Mit dieser Hilfsfunktion ist es dann zb einfach, in den Programmcode
Zwischenausgaben einzufügen.
zb
1 | PORTB ^= (1 << LED1); // LED1 an PB1 an-/ausschalten
|
2 | startmagnetismus(); // readout the sensor
|
3 |
|
4 | uart_debug( "Vor sign12 X:", testx );
|
5 | uart_debug( "Vor sign12 Y:", testy );
|
6 | uart_debug( "Vor sign12 Z:", testz );
|
7 |
|
8 | testx = sign12(puzzle_x); // get 12bit from x-axis
|
9 | testy = sign12(puzzle_y); // get 12bit from y-axis
|
10 | testz = sign12(puzzle_z); // get 12bit from z-axis
|
11 |
|
12 | uart_debug( "Nach sign12 X:", testx );
|
13 | uart_debug( "Nach sign12 Y:", testy );
|
14 | uart_debug( "Nach sign12 Z:", testz );
|
15 |
|
16 | arcx = (double) testx; // typecast x-avlue to calculate atan2
|
17 | arcy = (double) testy; // typecast y-value ..
|
18 | kurs = atan2(arcx,arcy)/PI*180; // calculate heading by atan2 (so result is also possible if
|
19 | // x = 0 or y = 0)
|
wenn du keine Hilfsmittel zum debuggen hast, dann musst du dir eben
selbst welche machen! Ziel ist es, auf der UART Texte und Zahlen
ausgeben zu können, so dass du mit dieser Mitschrift mitverfolgen
kannst, was im Programm passiert, welche Werte woher kommen etc.
Dazu muss die UART Ausgabe unter allen Umständen funktionieren und
deshalb wird die als erstes getestet und fehlerfrei gemacht.
Systematisch vorgehen!
Vergiss, dass es auf einem anderen Board schon funktioniert hat. Das
interessiert hier nicht. Du bist jetzt auf diesem Board und da fängst du
bei 0 an. Nimm nichts als funktionierend an und nimm eine Komponente
nach der anderen in Betrieb. In der Reihenfolge so dass du auf eine
jeweils getestete Komponente aufbauen kannst.
Nicht raten, sondern Fakten schaffen. Im Programm Zwischenergebnisse
ausgeben lassen, so dass du aus den Zwischenergebnissen Rückschlüsse
ziehen kannst. Dann hört das Raten auf was das Problem sein könnte und
du fängst an, am Problem zu arbeiten.
Ergänze das Programm mit Ausgaben zwischendrinn, so dass dir das
Programm selber hilft, Fehler im Programm zu finden. Wenn dann alles
läuft, kann man diese Ausgaben immer noch entfernen. Aber besser jetzt 3
Minuten für ein paar Hilfsfunktionen investieren als 3 Stunden
Rätselraten.