PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : probleme mit hinderniserkennung [gelöst]



inka
23.12.2009, 07:16
hi allerseits,

mit folgendem progrämmchen, welches ich zusammengestückelt habe gibt es probleme:



#include "asuro.h"

int main(void)
{
Init();

DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW

// OCR2 = 0xEF; // Pulsbreite 16

// MotorSpeed(255,255); // volle Kraft

// MotorDir(FWD,FWD); // voraus

StatusLED(YELLOW);
Msleep(400);
while (1)
{
if (PIND & (1 << PD0)) { // wenn kein IR-Echo
BackLED(OFF,OFF);
// MotorDir(FWD,FWD); // dann vorwärts
StatusLED(GREEN);
Msleep(400);
StatusLED(YELLOW);
}
else { // sonst
BackLED(ON,ON);
// MotorDir(RWD,FWD); // nach links
StatusLED(RED);
}
}

return 0;
}

die statuslED leuchtet kurz gelb auf, wird grün und bleibt es. wechselt nicht wieder zu gelb, was sie m.e. nach sollte. Auch beim simulieren eines hindernisses wechselt sie nicht zum rot...
ausprobiert mit zwei normalen AM 8 (kein asurochip), an zwei asuros abwechselnd, was auf sodftware schliessen lässt (?)

was mich iritiert ist, dass mit dem original asuro prozessor auch die übertragung zum hyperterminal zwar funktioniert, aber beim selbsttest kommen die vom asuro gesendeten zeichen eher sporadisch, eine verbindung zum flaschen mit USB-adapter lässt sich nicht ausfbauen. nach dem versuch die seite 1 zu flaschen ist schluss (asuro dead)...

könnt ihr mir bitte helfen?


edit: nochmaliger versuch beim flaschen über USB-IR ging bei beiden asuros, bleibt also ein softwarefehler. Aber wo?

noch etwas seltsames: wenn ich den eingeschalteten asuro (statusLED grün) in den lichtkegel meiner tischlampe eintauche, wird die statusLED rot! beim rausholen aus dem licht wird sie wieder grün...

radbruch
23.12.2009, 10:35
Hallo


StatusLED(GREEN);
Msleep(400);
StatusLED(YELLOW);Ohne empfangenes IR-Signal gibt der TSOP ein High aus (er invertiert das Signal), deshalb wird die StatusLED im Wechsel 400ms auf Grün und einen Progammschleifendurchlauf auf Gelb geschaltet.

Auf den ersten Blick sollte es so funktionieren. Wenn du OCR2 nicht änderst (auskommentiert) wird das orginale 36kHz-Setup aus der Library verwendet. Was fehlt:

UCSRB = 0; // schaltet den USART aus

Denn sonst kann man PD1 nicht steuern! Das Ganze funkioniert nur mit den moderneren Libs die den Timer2 im PWM-Mode betreiben. Hier mein Versuch die Funktion zu erklären:

https://www.roboternetz.de/phpBB2/viewtopic.php?t=51380

Gruß

mic

inka
23.12.2009, 12:00
hi mic,
vielen dank, dein ungetestetes beispiel in der erklärung der funktion funktioniert so weit, bedeutet, meine hardware ist ok, auch die erklärung habe ich denke ich halbwegs verstanden...

beim versuch einer kompilierung mit der 8.1 lib bekomme ich allerdings folgende fehlermeldung:
------------------
../../../_asuro_lib/2_8_rc1/lib/asuro.c:145: error: `F_CPU' undeclared (first use in this function)
------------------

die bedeutet das da was feht, fehlt da außer den lib-dateien noch etwas? In avr - sources habe ich zum schluss alle lib´s hinzugefügt, die meldung kommt immer noch...

radbruch
23.12.2009, 12:17
Hallo

F_CPU kann im Makefile definiert werden oder direkt im Programm:

#define F_CPU 8000000

Gruß

mic

inka
23.12.2009, 12:38
hi mic,

danke, habe doch schon lange (zu lange) nichts am asuro und umgebung gemacht. War einfach eine einstellung im avr-studio...

inka
25.12.2009, 15:26
hi allerseits,


/************************************************** *****************************
*
* Description: asuro linksausweicher
*
************************************************** ***************************/

#include "asuro.h"
#include <stdlib.h>
#include "inka.h"

static unsigned char ocr2 = 0x91; // Wert für 50:50 Pulsweite laden

void InitIRDetect(void)
{
UCSRB = 0; // USART ausschalten
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
}

void InitUart(void)
{
OCR2 = 0x91; // duty cycle fuer 36kHz
}

int main(void)
{

unsigned char sw;

Init(); // Library initialisieren
InitIRDetect(); // IR-Funktion initialisieren
WaitforStart();


while (1)
{
OCR2 = ocr2; // Puls-Pause-Verhältniss setzen
Sleep(10); // kurz warten bis TSOP genügend Flanken erkennt

if (PIND & (1 << PD0)) // TSOP-Eingang auf IR Echo überprüfen
{
StatusLED(GREEN); // kein Echo
BackLED(OFF,OFF);
//MotorSpeed(255,255); // volle Kraft
//MotorDir(FWD,FWD); // voraus
}
else
{
StatusLED(RED); // Echo!
BackLED(ON,ON);
//MotorDir(RWD,RWD); // rückwärts
//Msleep(100);
//MotorDir(RWD,FWD); // nach links
}
sw = PollSwitch();
if (sw & 0x01) // K6 neben Schalter
ocr2 = 0xFE; //Pulsbreite 1
if (sw & 0x02)
ocr2 = 0xFD; //Pulsbreite 2
if (sw & 0x04)
ocr2 = 0xFB; //Pulsbreite 4
if (sw & 0x08)
ocr2 = 0xF7; //Pulsbreite 8
if (sw & 0x10)
ocr2 = 0xEF; //Pulsbreite 16
if (sw & 0x20)
ocr2 = 0x90; //Pulsbreite 110

/* if (sw) // bei Tastendruck Wert zum Terminal senden
{
InitUart(); // Pulsbreite für IR-Kommunikation setzen
PrintInt(sw);
SerWrite(" ",1);
PrintInt(ocr2);
SerWrite("\r\n",2);
InitIRDetect(); // Abstandsmessung aktivieren
Msleep(100);
}*/
}
return 0;
}

habe jetzt das programm etwas modifiziert, die entfernungen kann ich auch mit hilfe der schalter einstellen, die StatusLED wird bei annäherung an ein hindernis rot, wenn ich aber versuche die motorfunktionen zu aktivieren, fährt der asuro an, aber reagiert nicht mehr auf hindernisse...
habe versucht die aktivierung der IR abfrage in die while-schleife zu setzen (hinter den motorstart) bringt aber auch nichts...
bewirkt die aktivierung der motoren eine deaktivierung der IR-sensoren? Muss alles neu initialisiert werden "Init()"?

edit:
letztlich lag es am nicht vorhandenem kurzschlussjumper an der (accu)-spannungsversorgung - jetzt gehts...