-
Nur keine falsche Bescheidenheit, wenn ich so das Forum durchsuche, finde ich oft hilfreiche Threats von "inka" ;-)
Ich habe das gefunden:
Code:
//
// uint8_t zufall()
//
// Liefert eine 8Bit Pseudozufallszahl zurück,
// die Zahlenfolge wiederholt sich spätestens nach 65535 Aufrufen
//
uint8_t zufall()
{
static uint16_t startwert=0x0AA;
uint16_t temp;
uint8_t n;
for(n=1;n<8;n++)
{
temp = startwert;
startwert=startwert << 1;
temp ^= startwert;
if ( ( temp & 0x4000 ) == 0x4000 )
{
startwert |= 1;
}
}
return (startwert);
}
Muss ich mir jetzt eine "zufall.c" und eine "zufall.h" machen , damit ich das einbauen kann?
-
ich würde es zunächstmal versuchen als funktion in deine datei, da wo du es brauchst aufzunehmen:
uint8_t zufall();
-----------------------
und weiter unten die funktion beschreiben:
-------------------
void uint8_t zufall(void)
{
static uint16_t startwert=0x0AA;
uint16_t temp;
uint8_t n;
for(n=1;n<8;n++)
{
temp = startwert;
startwert=startwert << 1;
temp ^= startwert;
if ( ( temp & 0x4000 ) == 0x4000 )
{
startwert |= 1;
}
}
return (startwert);
}
---------------
hoffe dass es so stimmt :-)
-
Irgendwie wird mir die Sache zu kompliziert, ich frage mich ob ich mir da nicht zu viel vorgenommen habe...
Trotzdem DANKE für deine Hilfe!
-
hi pinsel,
ich habe das bei meinem robby so gemacht das ich aus einem timer register(OCRx) den wert ausgelsen habe und überprüft ob die zahl gerade oder ungerade ist. Da der zeitpunkt an dem dein asuro ein hinderniss erkennt nicht immer gleich ist ensteht so eine einfache ufalls funktion.
MfG Martin
-
Hallo Martin,
hört sich gut an, kannst du mir weitere Infos dazu geben?
-
Code:
unsigned char ocr = 0;
unsigned char ocr1 = 0;
ocr = OCR0;
ocr1 =ocr/2;
ocr1 *=2;
if(ocr == ocr1){
//rechts
}
else{
//links
}
-
OK, ich habs mal eingefügt, es kommt aber eine Fehlermeldung:
test.c:18: error: 'OCR0' undeclared (first use in this function)
-
oh hab da das register verwechselt es muss heisen
-
Jetzt hat's geklappt.
Nur weicht er bei Abstand<15 immer noch auf die gleiche Seite aus.
Hier der Code:
Code:
#include "asuro.h"
#include "ultrasonic.h"
int main(void)
{
int abstand, sw, sw0, sw1, sw2;
unsigned char ocr = 0;
unsigned char ocr1 = 0;
Init();
while(1)
{
sw0=PollSwitch();
sw1=PollSwitch();
sw2=PollSwitch();
ocr = TCNT0;
ocr1 =ocr/2;
ocr1 *=2;
if ((sw0==sw1) && (sw0==sw2)) sw=sw0; else sw=0;
MotorDir(FWD,FWD);
MotorSpeed(150, 150);
abstand = Chirp();
StatusLED(YELLOW);
if (sw==32)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(FWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
}
if (sw==16)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(FWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
}
if (sw==8)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(FWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
}
if (sw==1)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(RWD,FWD);
MotorSpeed(150, 150);
Msleep(600);
}
if (sw==2)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(RWD,FWD);
MotorSpeed(150, 150);
Msleep(600);
}
if (sw==4)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(RWD,FWD);
MotorSpeed(150, 150);
Msleep(600);
}
else if (abstand<15)
{
if (ocr == ocr1){
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(RWD,FWD);
MotorSpeed(150, 150);
Msleep(600);
}
else
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(FWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
}
}
else
{
StatusLED(GREEN);
MotorDir(FWD, FWD);
MotorSpeed(150, 150);
}
}
return 0;
}
-
das sollte so aussehen:
Code:
#include "asuro.h"
#include "ultrasonic.h"
int main(void)
{
int abstand, sw, sw0, sw1, sw2;
unsigned char ocr = 0;
unsigned char ocr1 = 0;
Init();
while(1)
{
sw0=PollSwitch();
sw1=PollSwitch();
sw2=PollSwitch();
if ((sw0==sw1) && (sw0==sw2)) sw=sw0; else sw=0;
MotorDir(FWD,FWD);
MotorSpeed(150, 150);
abstand = Chirp();
StatusLED(YELLOW);
if (sw==32)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(FWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
}
if (sw==16)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(FWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
}
if (sw==8)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(FWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
}
if (sw==1)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(RWD,FWD);
MotorSpeed(150, 150);
Msleep(600);
}
if (sw==2)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(RWD,FWD);
MotorSpeed(150, 150);
Msleep(600);
}
if (sw==4)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(RWD,FWD);
MotorSpeed(150, 150);
Msleep(600);
}
else if (abstand<15)
{
ocr = TCNT0;
ocr1 =ocr/2;
ocr1 *=2;
if (ocr == ocr1){
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(RWD,FWD);
MotorSpeed(150, 150);
Msleep(600);
}
else
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(FWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
}
}
else
{
StatusLED(GREEN);
MotorDir(FWD, FWD);
MotorSpeed(150, 150);
}
}
return 0;
}