PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] NiboBee unerklaerliche LED Anzeigen + Motorbewegung



LittleBoy
27.12.2014, 18:35
Hallo erstmal!
Ich habe mir neulich einen Nibobee zugelegt und aufgebaut.
Danach haben die Testprogramme, die in der NiboBee stdlib dabei sind
ergeben, dass eigentlich alles funktioniert.

Ein kleines Programm zum Ausweichen von Hindernissen hat auch schon wunderbar funktioniert,
aber als ich mit den Bodensensoren/Linienverfolgung angefangen habe hat die Bee auf einmal angefangen
seltsame Sachen zu machen.
Hier ist der Code



#define F_CPU 16000000ul // Prozessor Frequenz

#define UNNORMAL // nich von Bedeutung
#include "../src/nibobee/iodefs.h" //habe die lib noch nicht richtig installiert
#include "../src/nibobee/motpwm.h"
#include "../src/nibobee/sens.h"
#include "../src/nibobee/delay.h"
#include "../src/nibobee/line.h"
#include "../src/nibobee/led.h"


int loop(void)
{
enable_interrupts();
int16_t motor_left,motor_right;
if(line_get(LINE_L)<480)
{
led_set(LED_L_RD,1);
motor_left=350;
}
else
{
led_set(LED_L_RD,0);
motor_left=0;
}
if(line_get(LINE_R)<480)
{
led_set(LED_R_RD,1);
motor_right=350;
}
else
{
led_set(LED_R_RD,0);
motor_right=0;
}
motpwm_setLeft(motor_left);
motpwm_setRight(motor_right);
delay(0.5);
return loop(); //unendlich rekursiv
}


int main(void)
{
motpwm_init();
sens_init();
line_init();
led_init();
return loop();
}


Eigentlich sollte das ja wenn etwas helles da ist stehen bleiben und die roten Leds aus sein und wenn etwas
dunkles da ist fahren und die Leds an sein.

Das tut es manchmal auch, aber meistens nicht.
Dann leuchten die gelben Leds (wieso???) oder die Motoren fahren rückwärts (wer hat ihnen das angeschafft?) oder mit 100% Leistung...

Manchmal fährt ein Motor auch, ohne dass die entsprechende Led leuchtet.

Eine gewisse Ungenauigkeit würde ich ja vollkommen verstehen und ich habe auch schon versucht das auszugleichen,
aber das was der Roboter da macht ist einfach kompletter Wahnsinn.

Bedeuten die Leds vielleicht irgendwas (z.B. ein Segfault)?
Ich kenne mich zwar mit C Programmierung so halbwegs aus, aber weder mit der Library, noch mit der Hardware so richtig.

Ein bisschen Hilfe wäre nett.
mfg Daniel

radbruch
29.12.2014, 08:39
Hallo

Ich würde es mal so versuchen:


//int loop(void)
loop(void)
{
...
motpwm_setLeft(motor_left);
motpwm_setRight(motor_right);
delay(0.5);
//return loop(); //unendlich rekursiv
}


int main(void)
{
motpwm_init();
sens_init();
line_init();
led_init();
//return loop();
while(1) loop();
return(0); // wird nie erreicht
}

Weil durch "unendlich rekursiv" läuft vermutlich der Stapel der Rücksprungadressen über.

Gruß

mic

LittleBoy
29.12.2014, 13:50
JA ! das wars.
Klar, bei dem kleinen AVR kommt halt kein netter Kernel und schreibt die
Rücksprungadressen in den Hauptspeicher...

Danke .