Nachrichten
Sie sind nicht eingeloggt.
Site-Statistic
7433 private projects
378 public projects
16179466 lines compiled
58199 builds
Nitrama
OFFLINE
Junior Boarder
Beiträge: 10
Hey,
also ich möchte bei meinem Nibo die Rand() Funktion verwennden von C.
aber es kommt immer die Fehlermeldung.
main.c:123: warning: implicit declaration of function 'rand'
was bedeuted das?
Hier der Kommplette Quellcode
#include <nibobee/iodefs.h>
#include <nibobee/sens.h>
#include <nibobee/motpwm.h>
#include <nibobee/motpid.h>
#include <nibobee/analog.h>
#include <nibobee/led.h>
#include <nibobee/delay.h>
#include <nibobee/clock.h>
#include <nibobee/odometry.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
int main( ) {
motpwm_init( ) ;
sens_init( ) ;
analog_init( ) ;
uint8_t toggle;
int16_t lval, rval;
int16_t speed_l= 0 ;
int16_t speed_r= 0 ;
int8_t matrix= 0 , random;
activate_output_group( IO_LEDS) ; // LED bits als Output
activate_output_groupbit( IO_EXT, 2 ) ;
activate_output_groupbit( IO_EXT, 3 ) ;
led_set( LED_L_RD, 1 ) ;
led_set( LED_R_RD, 1 ) ;
_delay_ms( 700 ) ;
led_set( LED_L_YE, 1 ) ;
led_set( LED_R_YE, 1 ) ;
_delay_ms( 700 ) ;
led_set( LED_L_RD, 0 ) ;
led_set( LED_R_RD, 0 ) ;
led_set( LED_L_YE, 0 ) ;
led_set( LED_R_YE, 0 ) ;
_delay_ms( 700 ) ;
led_set( LED_L_RD, 1 ) ;
led_set( LED_R_RD, 1 ) ;
led_set( LED_L_YE, 1 ) ;
led_set( LED_R_YE, 1 ) ;
_delay_ms( 300 ) ;
led_set( LED_L_RD, 0 ) ;
led_set( LED_R_RD, 0 ) ;
led_set( LED_L_YE, 0 ) ;
led_set( LED_R_YE, 0 ) ;
while ( 1 == 1 ) {
enable_interrupts( ) ;
sei( ) ;
// IR LEDs einschalten
clear_output_groupbit( IO_EXT, 2 ) ;
clear_output_groupbit( IO_EXT, 3 ) ;
_delay_ms( 10 ) ;
// Werte links und rechts messen
lval = analog_getValue( ANALOG_EXT2) ;
rval = analog_getValue( ANALOG_EXT3) ;
// IR LEDs ausschalten
set_output_groupbit( IO_EXT, 2 ) ;
set_output_groupbit( IO_EXT, 3 ) ;
_delay_ms( 10 ) ;
// Werte links und rechts messen und von vorherigem Ergebnis abziehen,
// damit das Umgebungslicht rausgerechnet wird!
lval -= analog_getValue( ANALOG_EXT2) ;
rval -= analog_getValue( ANALOG_EXT3) ;
if ( ( rval > 10 ) && ( lval > 10 ) ) {
speed_l = - 600 ;
speed_r = - 600 ;
led_set( LED_L_YE, 1 ) ;
led_set( LED_R_YE, 1 ) ;
matrix = 1 ;
}
else if ( ( rval && lval > 8 ) && ( rval > lval) ) {
speed_l = - 600 ;
speed_r = 0 ;
led_set( LED_R_YE, 1 ) ;
matrix = 1 ;
}
else if ( ( rval && lval > 8 ) && ( rval < lval) ) {
speed_l = 0 ;
speed_r = - 600 ;
led_set( LED_L_YE, 1 ) ;
matrix = 1 ;
}
else if ( ( sens_getRight( ) != 0 ) && ( sens_getLeft( ) != 0 ) ) {
speed_l = - 600 ;
speed_r = - 600 ;
led_set( LED_R_RD, 1 ) ;
led_set( LED_L_RD, 1 ) ;
matrix = 1 ;
}
else if ( sens_getRight( ) != 0 ) {
speed_l = - 600 ;
speed_r = - 300 ;
led_set( LED_R_RD, 1 ) ;
matrix = 1 ;
}
else if ( sens_getLeft( ) != 0 ) {
speed_r = - 600 ;
speed_l = - 400 ;
led_set( LED_L_RD, 1 ) ;
matrix = 1 ;
}
else { speed_l = 600 ; speed_r = 600 ; }
motpwm_setLeft( speed_l) ;
motpwm_setRight( speed_r) ;
if ( matrix == 1 ) {
matrix = 0 ;
random = rand ( 1000 ) ;
delay ( random) ;
led_set( LED_L_YE, 0 ) ;
led_set( LED_R_YE, 0 ) ;
led_set( LED_L_RD, 0 ) ;
led_set( LED_R_RD, 0 ) ;
}
}
return 0 ;
}
Gruß Nitrama
Letzte Änderung: 11 Jahre 11 Monate her von Nitrama .
BirgerT
OFFLINE
Gold Boarder
Beiträge: 325
Versuch mal Google "AVR rand();
Du müsstest noch ein #include <stdlib.h> einfügen, wo all die anderen #includes stehen, und mit einer funktion srand() muß der Zufall erstmal initialisiert werden.
Die explicit declaration heisst soviel wie "warum soll ich hier eine unbekannte Funktion aufrufen", dann ist die Funktion entweder falsch getippt oder es fehlt die Headerdatei, mit dem prototypen der Funkion.
workwind
OFFLINE
Administrator
Beiträge: 573
Wobei immer noch ein Problem bleibt: Der Zufallszahlengenerator sollte mit einer Zufallszahl initialisiert werden
Da wir einen Roboter mit Sensoren haben, können wir uns den Zufall aus der Umwelt holen! Einfach alle Werte der Analogeingänge (Bodensensoren etc...) aufeinanderaddieren und damit den Generator initialisieren:
uint16_t zufall = 0 ;
for ( uint8_t i= ANALOG_EXT0; i<= ANALOG_R1; i++ ) {
zufall += analog_getValue( i) ;
}
srand ( zufall) ;
Nitrama
OFFLINE
Junior Boarder
Beiträge: 10
wenn ich das genau so einfüge in meinen Quellcode dann Funktioniert das?
Kann ich da jetzt die Rand() funktion benutzen?
Nitrama
OFFLINE
Junior Boarder
Beiträge: 10
so Habs Hinbekommen vllt interresiert es ja jemmand
#include <nibobee/iodefs.h>
#include <nibobee/sens.h>
#include <nibobee/motpwm.h>
#include <nibobee/motpid.h>
#include <nibobee/analog.h>
#include <nibobee/led.h>
#include <nibobee/delay.h>
#include <nibobee/clock.h>
#include <nibobee/odometry.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
int main( ) {
motpwm_init( ) ;
sens_init( ) ;
analog_init( ) ;
int8_t matrix= 0 ;
uint8_t toggle;
int16_t lval, rval;
int16_t speed_l= 0 ;
int16_t speed_r= 0 ;
uint16_t zufall = 0 , random = 0 ;
activate_output_group( IO_LEDS) ; // LED bits als Output
activate_output_groupbit( IO_EXT, 2 ) ;
activate_output_groupbit( IO_EXT, 3 ) ;
led_set( LED_L_RD, 1 ) ;
led_set( LED_R_RD, 1 ) ;
_delay_ms( 700 ) ;
led_set( LED_L_YE, 1 ) ;
led_set( LED_R_YE, 1 ) ;
_delay_ms( 700 ) ;
led_set( LED_L_RD, 0 ) ;
led_set( LED_R_RD, 0 ) ;
led_set( LED_L_YE, 0 ) ;
led_set( LED_R_YE, 0 ) ;
_delay_ms( 700 ) ;
led_set( LED_L_RD, 1 ) ;
led_set( LED_R_RD, 1 ) ;
led_set( LED_L_YE, 1 ) ;
led_set( LED_R_YE, 1 ) ;
_delay_ms( 300 ) ;
led_set( LED_L_RD, 0 ) ;
led_set( LED_R_RD, 0 ) ;
led_set( LED_L_YE, 0 ) ;
led_set( LED_R_YE, 0 ) ;
while ( 1 == 1 ) {
enable_interrupts( ) ;
sei( ) ;
// IR LEDs einschalten
clear_output_groupbit( IO_EXT, 2 ) ;
clear_output_groupbit( IO_EXT, 3 ) ;
_delay_ms( 10 ) ;
// Werte links und rechts messen
lval = analog_getValue( ANALOG_EXT2) ;
rval = analog_getValue( ANALOG_EXT3) ;
// IR LEDs ausschalten
set_output_groupbit( IO_EXT, 2 ) ;
set_output_groupbit( IO_EXT, 3 ) ;
_delay_ms( 10 ) ;
// Werte links und rechts messen und von vorherigem Ergebnis abziehen,
// damit das Umgebungslicht rausgerechnet wird!
lval -= analog_getValue( ANALOG_EXT2) ;
rval -= analog_getValue( ANALOG_EXT3) ;
if ( ( rval > 10 ) && ( lval > 10 ) ) {
speed_l = - 600 ;
speed_r = - 600 ;
led_set( LED_L_YE, 1 ) ;
led_set( LED_R_YE, 1 ) ;
matrix = 1 ;
}
else if ( ( rval && lval > 8 ) && ( rval > lval) ) {
speed_l = - 600 ;
speed_r = 0 ;
led_set( LED_R_YE, 1 ) ;
matrix = 1 ;
}
else if ( ( rval && lval > 8 ) && ( rval < lval) ) {
speed_l = 0 ;
speed_r = - 600 ;
led_set( LED_L_YE, 1 ) ;
matrix = 1 ;
}
else if ( ( sens_getRight( ) != 0 ) && ( sens_getLeft( ) != 0 ) ) {
speed_l = - 600 ;
speed_r = - 600 ;
led_set( LED_R_RD, 1 ) ;
led_set( LED_L_RD, 1 ) ;
matrix = 1 ;
}
else if ( sens_getRight( ) != 0 ) {
speed_l = - 600 ;
speed_r = - 300 ;
led_set( LED_R_RD, 1 ) ;
matrix = 1 ;
}
else if ( sens_getLeft( ) != 0 ) {
speed_r = - 600 ;
speed_l = - 400 ;
led_set( LED_L_RD, 1 ) ;
matrix = 1 ;
}
else { speed_l = 600 ; speed_r = 600 ; }
motpwm_setLeft( speed_l) ;
motpwm_setRight( speed_r) ;
if ( matrix == 1 ) {
matrix = 0 ;
zufall = 0 ;
zufall = sens_getLeft( ) + sens_getRight( ) + rval + lval;
srand ( zufall) ;
random = rand ( ) % 1001 ;
delay ( random) ;
led_set( LED_L_YE, 0 ) ;
led_set( LED_R_YE, 0 ) ;
led_set( LED_L_RD, 0 ) ;
led_set( LED_R_RD, 0 ) ;
}
}
return 0 ;
}
Gruß Nitrama
Letzte Änderung: 11 Jahre 11 Monate her von Nitrama .
BirgerT
OFFLINE
Gold Boarder
Beiträge: 325
Ich finde das interessant, weil ich mir vorstellen kann nach einem Ausweichmanöver eine zufällige neue Richtung einzuschlagen. Danke.