RoboterCC - Robotic Code Compiler
Forum Robot Kits NIBObee Speichern von Liniensensorenwerten

Welcome

Nachrichten

Sie sind nicht eingeloggt.

Werbung

Banner

Letzte Themen

  • Keine Beiträge vorhanden

Site-Statistic

  • 7432 private projects
  • 378 public projects
  • 16179195 lines compiled
  • 58194 builds
NIBO @ facebook YouTube Twitter
Willkommen, Gast
Benutzername: Passwort: Angemeldet bleiben:
  • Seite:
  • 1

THEMA: Speichern von Liniensensorenwerten

Speichern von Liniensensorenwerten 8 Jahre 5 Monate her #3404

Hey,

Ich bin neu in der Programmierung und habe meine Biene gerade zusammengebaut. Beispielprogramme funktionieren soweit auch einwandfrei, nur bei der eigenen Programmierung hapert es.

Und zwar will ich die Werte der Liniensensoren speichern um davon abhängig die Motoren oder LEDs anzusteuern. Bei der Programmierung hier auf Roboter.cc klappt das auch, vergleichbare Codes bringen aber unter AVR Studio 4 rein gar nichts.

Hier mal ein Versuch von mir:

#include <nibobee/iodefs.h>
#include <nibobee/line.h>
#include <nibobee/led.h>

int main()
{
line_init();
led_init();
enable_interrupts();

int line_left = line_get(LINE_L);

if(line_left>500)
led_set(2,1);

return 0;
}

Die Sensoren scheinen gar keine Werte zu erfassen. Habe ich was vergessen oder ist die Benutzung von line_get() schlicht falsch? :kopfkratz:
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Speichern von Liniensensorenwerten 8 Jahre 4 Monate her #3406

  • BirgerT
  • BirgerTs Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 325
Hallo wedemännchen, (hat Dein Nickname eigentlich etwas mit der Wedemark zu tun?)

schau Dir doch nochmal die Beispielprogramme und das Programmiertutorial an - www.roboter.cc/index.php?option=com_nicaiwci&view=project&projectid=40&Itemid=41 - denn in Deinem Programm fehlt etwas Wesentliches:

Damit der Mikrocontroller tut, muss er das Programm immer wieder in einer Schleife durchlaufen, das müsste dann midestens so aussehen:
#include <nibobee/iodefs.h>
#include <nibobee/line.h>
#include <nibobee/led.h>

int main()  // Hier beginnt das Hauptprogramm
{
// Dieser Code soll nur einmal am Anfang durchlaufen werden
line_init();
led_init();
 
// Und ab hier soll der Code immer wiederholt werden
 
while(1=1){  // dieses Statement fehlte
 
	enable_interrupts();
 
	int line_left = line_get(LINE_L);
 
	if(line_left>500)
	led_set(2,1);
 
	delay(1); // kleine Pause
 
} // while Endeklammer
 
return 0; // Dieses "return" darf nie zur Ausführung kommen!
          // das steht hier nur, damit der Compiler beim Übersetzen der "main()" nix zu meckern hat,
          // "int main()" erwartet einen Rückgabewerte
}
 
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Speichern von Liniensensorenwerten 8 Jahre 4 Monate her #3413

Hey BirgerT,

vielen Dank, jetzt wird mir das einiges klarer. Ich hatte ja auch schon viel mit der while-Schleife versucht, allerdings habe ich die Initialisierung des line_left immer außerhalb der Schleife gelassen. Ich Dussel.

Allgemein, falls es sonst noch jemals irgendwen interessiert, müsste bei deinem Code noch delay.h eingespannt werden und in der while-Schleife ein Vergleich 1==1 gesetzt werden.

Vielen Dank für die Hilfe.

PS. Nein, mein Nick ist an meinen Nachnamen angelehnt :)
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Speichern von Liniensensorenwerten 8 Jahre 4 Monate her #3423

Hey,

danke für die Antwort, dadurch ist mir jetzt einiges klarer geworden.
Ich habe mir nun noch ein BGX1 angebaut und nach längerem rumprobieren hat sich eine neue Frage ergeben. Ich poste die
einfach mal hier drunter:

Und zwar habe ich mir den Beispielcode zu bgx1_test_term angesehen und ausprobiert. Nun stellt sich mir die Frage,
wieso motpwm.h eingespannt werden muss. Wenn ich aus dem Code motpwm_init(); lösche, funktioniert es nicht mehr und mir wird gesagt: bgx1.c:(.text.bgx1_init+0x4): undefined reference to `nibobee_initialization'
Aber ich will die Motoren ja gar nicht ansprechen, sondern nur Text ausgeben. Wo ist da der Zusammenhang?
Im Example wurde auch motpid.h eingespannt und initialisiert. Das Löschen dieser Zeilen hat für mich jedoch keine ersichtlichen Auswirkungen.

Hier der relevante Teil vom Code:
#include <nibobee/iodefs.h> #include <nibobee/i2cmaster.h> #include <nibobee/bgx1.h> #include <nibobee/analog.h> #include <nibobee/led.h> #include <nibobee/delay.h> #include <nibobee/clock.h> #include <nibobee/odometry.h> #include <nibobee/motpwm.h> #include <nibobee/motpid.h> #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> int main() { activate_output_group(IO_LEDS); // LED bits als Output i2c_init(); [...] while (!bgx1_init()); [...] bgx1_setStatus(0xff); [color=#ff0000]motpwm_init();[/color] motpid_init(); while(1) { [Code für Textausgabe]} [\code][code]
#include <nibobee/iodefs.h>
#include <nibobee/i2cmaster.h>
#include <nibobee/bgx1.h>
#include <nibobee/analog.h>
#include <nibobee/led.h>
#include <nibobee/delay.h>
#include <nibobee/clock.h>
#include <nibobee/odometry.h>
#include <nibobee/motpwm.h>
#include <nibobee/motpid.h>

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>


int main() {
activate_output_group(IO_LEDS); // LED bits als Output
i2c_init();

[...]

while (!bgx1_init());

[...]

bgx1_setStatus(0xff);

motpwm_init();
motpid_init();

while(1) {
} [\code][Code für Textausgabe]}
[\code]
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Speichern von Liniensensorenwerten 8 Jahre 4 Monate her #3424

  • workwind
  • workwinds Avatar
  • OFFLINE
  • Administrator
  • Beiträge: 573
Hallo wedemännchen,

ich vermute, das Problem hat mit der "Link-Magic" des gcc-Compilers/Linkers zu tun. Da kommt es bei den Bibliotheken auf die genaue Reihenfolge an um die Symbole aufzulösen... In Deinem Fall wird vermutlich die libnibobee_base.a vor der libnibobee_bgx1.a gelinkt! Dadurch kann das Symbol nibobee_initialization nicht gebunden werden (Das Symbol ist in der libnibobee_base.a definiert). Das Problem ist vorher nicht aufgetreten, da das Symbol von der libnibobee_pwm.a verwendet wird, wenn Du pwm_init() verwendest!
:kopfkratz:

Also prinzipielle Reihenfolge beim Linken:
  1. Spezialbibliotheken
  2. allgemeine Bibliotheken
  3. Systembibliotheken

bzw. bei Dir: libnibobee_base.a weiter nach unten verschieben...

-workwind-
Der Administrator hat öffentliche Schreibrechte deaktiviert.
  • Seite:
  • 1
Ladezeit der Seite: 0.077 Sekunden

Werbung