PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro defekt?!?!?



neo98
28.10.2010, 18:38
Hallo zusammen,

ich hab mir vor kurzem einen Asuro zugelegt. Der Zusammenbau, das flashen usw. hatt alles problemlos funktioniert. Aber je mehr Programme ich schreib, desto verrückter werd ich. Ich verwende zum Programmieren Programmers Notepad 2 so wie in der Anleitung beschrieben. Nur, selbst wenn Programmers Notepad keine Fehler noch Warnungen, ausgibt, macht der Asuro manchmal einfahc was er will. Manchmal überspricht er einfach manche Programmschleifen und springt einfach weiter zur nächsten. So wie beim folgenden Programm die erste Schleife übersprungen wird:


#include "asuro.h"
#include <stdio.h>

unsigned char colo = FALSE;
unsigned char zahl[5];
int i = 0;

int main(void)
{
int zaehler = 0;
unsigned int data[2], licht;
Init();
licht = 5;
data[0] = 0;
MotorDir(FWD, FWD);
MotorSpeed(102, 95); //Motoren laufen unterschiedlich

ODOMETRIE_LED_ON;

StatusLED(RED);

while(1) {
DDRC &= ~((1 << PC0) | (1 << PC1)); // Input => no break LED
ADMUX = (1 << REFS0) | WHEEL_RIGHT; // AVCC reference with external capacitor
ADCSRA |= (1 << ADSC); // Start conversion
while (!(ADCSRA & (1 << ADIF))); // wait for conversion complete
ADCSRA |= (1 << ADIF); // clear ADCIF
data[1] = ADCL + (ADCH << 8);

licht += data[1];
data[0]++;
if(data[0] > 50)
break;

}

StatusLED(GREEN);
licht = licht / 50;
MotorSpeed(0, 0);
for(i = 0; i < 600; i++)
Sleep(255);
MotorSpeed(100, 100);

while(zaehler < 126){
ADMUX = (1 << REFS0) | WHEEL_RIGHT; // AVCC reference with external capacitor
ADCSRA |= (1 << ADSC); // Start conversion
while (!(ADCSRA & (1 << ADIF))); // wait for conversion complete
ADCSRA |= (1 << ADIF); // clear ADCIF
data[1] = ADCL + (ADCH << 8);


if((data[1] < licht) && (colo == FALSE)) {
colo = TRUE;
zaehler = zaehler + 1;

}
else
colo = FALSE;

sprintf(zahl, "%d\n", data[1]);
SerWrite(zahl, 5);

}
StatusLED(RED);
MotorSpeed(0, 0);
while(1);


return 0;
}

Die zweite Schleife funktioniert auch erst wie durch ein Wunder durch hinzufügen von spritnf und serwrite. Kann mir jemand sagen was ich falsch mach?

MfG Neo

markusj
28.10.2010, 21:13
Hallo Neo,

du solltest dich noch etwas gründlicher mit der C-Programmierung auseinandersetzen. Was auch immer der ASURO tut, ist sicherlich nicht das was du möchtest - Deine erste Schleife ist mit "while(1)" eine Endlossschleife, alles was danach kommt wird also schon einmal nicht ausgeführt.

Gerade am Anfang ist es von Vorteil, wenn man seine Gedanken zuerst auf Papier bringt (Sequenzdiagramm als Stichwort zum selbersuchen) und davon ausgehend die einzelnen Elemente dann ausprogrammiert.

mfG
Markus

neo98
28.10.2010, 21:32
du solltest dich noch etwas gründlicher mit der C-Programmierung auseinandersetzen.


Ich denk ich beherrsch C relativ gut, weil ichs doch schon etwas länger mache. Mein Code ist zwar ein reines Durcheinander aber ich weis was ich mach.



Was auch immer der ASURO tut, ist sicherlich nicht das was du möchtest -

richtig


Deine erste Schleife ist mit "while(1)" eine Endlossschleife, alles was danach kommt wird also schon einmal nicht ausgeführt.


1. Fakt ist, dass der Asuro nichtmal die while-schleife ausführt sondern einfach einmal durchläuft und weiter macht wie wenn da keine schleife wäre ](*,) Komischerweise beachtet er aber die 2. Schleife.
2. Wenn ichs richtig weis, wird die while-schleife durch das break in der if-bedingung beendet.

radbruch
28.10.2010, 21:57
Hallo

"Ich denk ich beherrsch C relativ gut,..." Führe endlos aus, aber brich ab wenn data[0] > 50 ist. Klingt echt viel besser als "mach 50 mal". Du scheinst C echt zu beherrschen.

Woran merkst du, dass die erste Schleife nur einmal ausgeführt wird? Was macht du da eigentlich?

Dein Programm kann ich nur mit Warnung kompilieren:

test.c: In function 'main':
test.c:61: warning: pointer targets in passing argument 1 of 'sprintf' differ in signednesssprintf() ist eh der Overkill im Mega8 ;)

Gruß

mic

markusj
28.10.2010, 22:00
Pardon, das "break" hatte ich übersehen/nicht erwartet.

An für sich sehe ich keinen wirklichen Fehler im Code, aber du solltest dringend aufräumen und in Funktionen auslagern (zum Bleistift der ADC-Code gibt eine wunderbare Funktion).
Zum Debuggen würde ich dir empfehlen, einmal "SerWrite" nach jedem Abschnitt zu platzieren. Ich würde aber jedes komische Verhalten am ehesten deiner kreativen Codestruktur zuordnen.

Wenn du glaubst, dass eine Schleife zu wenig ausgeführt wird, kannst du dir ja die relevanten Variablen ausgeben lassen. Manchmal gibt es bei der Auswertung von Sensordaten unerwartete Überraschungen ;)

mfG
Markus

neo98
28.10.2010, 22:37
@radbruch:
"Führe endlos aus, aber brich ab wenn data[0] > 50 ist. Klingt echt viel besser als "mach 50 mal"", geb ich dir recht. Irgendwann kommt man halt zum verzweifeln, wenns net funktioniert obwohl eig kein Fehler drin ist.

"Woran merkst du, dass die erste Schleife nur einmal ausgeführt wird? Was macht du da eigentlich? "
1. Die Led wird rot, und fast gleich danach wieder grün und die Variable licht wird trotzdem gesetzt.
2. Ich will den Roboter über die OdometrieSensoren steuern, heißt z.B. den Asuro 50cm weit fahren lassen. Um schwarz und weiß richtig zu unterscheiden hab ich mir gedacht ich errechne zuerst ein Mittelwert (1. while-schleife). und danach wird ausgewählt, alles was unter dem mittelwert ist, ist weiß und alles drüber schwarz.(2. while-schleife).

Warnungen beim Kompilieren hab ich nicht.


spritnf() hat bis jetzt prima funktioniert, überhaupt kein Problem, aber ich werds mal weglassen vllt. hilfts.

@markusj:
kann ja mal vorkommen

Ich werd deinen Rat morgen beherzigen und es nochmal umändern,. Mal schauen was dabei herauskommt.

mfg Neo

radbruch
28.10.2010, 23:04
zu 1: 50 mal ADC-Wert ermitteln dauert ein Fingerschnippen für den Mega8
zu 2: Das mit dem Mittelwert wird so nix

Ich erkenne leider den Sinn noch nicht so ganz. Warum startet licht mit 5? Fünfzig Lesungen bei MotorSpeed(102, 95); sehen nicht alle Segmente. Und alles nach StatusLED(GREEN); ist mir schleierhaft.

Den Mittelwert bildet man, indem man bei laufenden Motoren über eine bestimmte Zeit die Min- und Maxwerte sucht. Als "Schaltschwelle" sollte man dann noch eine kleine Hysterese berücksichtigen.


Irgendwann kommt man halt zum verzweifeln, wenns net funktioniert obwohl eig kein Fehler drin ist.Don't panic (http://www.google.de/webhp?q=Don't+panic) ;)

Gruß

mic

[Edit]
Das wäre auch wichtig:

ODOMETRIE_LED_ON;
Sleep(10);
StatusLED(RED);

while(1) {
Warum verwendest du nicht OdometrieData()?