PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : US-Erweiterung Problem



Ezalo
15.07.2010, 20:03
Hallo,

habe gestern und heute die Erweiterungsplatine zusammengelötet. Dann hab ich folgenden Programmcode geflasht:


#include "asuro.h"

void LocalInit(void) {
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 0x64;
ADCSRA = 0x00;
ACSR = 0x02;
ADMUX = 0x03;
SFIOR|= (1 << ACME);
DDRD &= ~(1 << 6);
}

void Ping (unsigned char length) {
count72kHz = 0;
TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
while (count72kHz<length) {
OCR2 = 0x64 + length / 2 - count72kHz;
}
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 0x64;
}

int main (void) {
int pos, i;
int posmarker;
Init();
LocalInit();
while(1) {
posmarker = 0;
Ping(20);
for (pos = 0; pos < 100; pos++) {
Sleep(10);
if ((ACSR&(1<<ACI)) != 0) {
if (posmarker == 0) {
posmarker = pos;
}
}
ACSR |= (1 << ACI);
}
if (posmarker > 10) {
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(200,200);
}
else {
StatusLED(RED);
MotorDir(FWD,RWD);
MotorSpeed(0,200);
for (i = 0; i < 100; i++) {
Sleep(200);
}
}
}
return 0;
}

Das einzige was er nach dem Booten macht ist die StatusLED auf grün zu stellen und das wars. Keinerlei reaktion auf Bewegungen vor den Sensoren.

Woran kann das liegen?

Edit: Hab jetzt nochmal die ganzen Widerstände durchgemessen das nicht einer falsch gelandet ist. Die Verbindungen der Bauelemente auf der Rückseite habe ich auch verfolgt um Fehler aususchliessen. Kurzschlüsse sind ebenfalls keine vorhanden.
MfG

Ezalo

Ezalo
16.07.2010, 16:30
Hat keiner eine Idee was ich da machen kann?

Ezalo
16.07.2010, 18:36
So... hab nun mal folgendes Programm verwendet:


#include "asuro.h"
#include "ultrasonic.h"
int abstand=0;
int main(void)
{
Init();
SerPrint("\r\n --- ultrasonic test ---");
Msleep(1000);
do
{
abstand = Chirp();
SerPrint("\r\n distanz in cm: ");
Msleep(500);
PrintInt(abstand);
}
while(1);
return 0;
}

Dieses Programm gibt den Abstand zwischen Asuro und einem Gegenstand auf dem Terminal aus.

Als Antwort bekomme ich:

"distanz in cm: 0"

Heißt das nun der Fehler kann nur Hardwareseitig sein? Und wenn ja, wo am ehesten?

MfG

Ezalo

Ezalo
17.07.2010, 10:39
Tjo... und nun? Von euch scheint mir ja keiner Helfen zu können und bei google hab ich auch nix hilfreiches gefunden... Soll ich das Teil jetzt verschrotten? :(

Richard
17.07.2010, 14:45
Ich kenne mich mit c nicht aus, aber zum DO Befehl sollte auch
ein Loop oder ähnlich folgen. Außerdem hast Du zwar Print
Befehle, aber ich kann nichts finden wo Du den Sensor abfragst?
Auch wenn die Lib`s eingebunden sind, müssen die darin
enthaltenen Programme auch aufgerufen werden...?

Gruß Richard

Ezalo
17.07.2010, 18:43
Laut Beschreibung soll


abstand = Chirp();

die Sensoren abfragen und mir den Wert in mm zurückgeben.

Ezalo
17.07.2010, 19:29
Könnte jemand der diese Erweiterung hat, mal messen ob am US-Sender und -Empfänger bei Betrieb eine Spannung anliegt? Wenn ja wieviel Volt?

dremler
17.07.2010, 20:21
mach doch mal fotos dass wir drübergucken können....

Ezalo
17.07.2010, 21:01
Von was genau willst du da Bilder haben?

dremler
17.07.2010, 21:18
von deiner löterei...


weil dir niemand sagen kann ob du nen hardware fehler hast.....


ist wie wenn ich sage ich hab die und die platine un der code hier geht nicht...wo ist das problem.....


da kann auch keiner helfen;)

Ezalo
17.07.2010, 21:47
Auf den Bildern wirst du aber net viel erkennen denke ich :o/ weder kalte lötstellen, noch Widerstandswerte und auch die Verbindungen der Bauteile sind nicht ordentlich auf dem Bild erkennbar. Und mir gehts bei dem Hardwarefehler im moment mehr um Teile die evtl defekt sein könnten.

Die Lötstellen hab ich mittlerweile zum 5mal kontrolliert, selbst alle widerstände kontrolliert das keiner falsch eingelötet ist und die Verbindungen mehrmals mit der Schaltung kontrolliert.

Ezalo
17.07.2010, 23:19
Mir ist gerade aufgefallen, wenn ich beide US-Kapseln mit dem Isolierten Teil nach oben einlöte, liegt an der einen Kapsel am isolierten Beinchen der + Pol an und beim anderen der - Pol. Ist das entscheidend oder ist die Polarität hier egal?

genutzte anleitungen:

http://www.arexx.com/downloads/asuro/us_bauplan.zip

http://www.andreae-gymnasium.de/inhalt/aktivitaeten/projekte/Asuro-Projekt/Asuro_Ultraschallsensor.pdf

+ Ausro Band I

vistauser
18.07.2010, 13:43
Hallo Ezalo,
durch deine Fragen zu diesem US-Teil angeregt, habe ich es wieder herausgesucht und zum 100-tausendsten Mal versucht, es in Betrieb zu
nehmen.
Ergebnis: Wie schon vor Jahren = Negativ, Mißerfolg, Frust...
distanz in cm ist immer 0

Habe auch mal an den Pins der Sensoren gemessen, ob da eine Spannung
anliegt ---> Nein, kein gar nix.

Also ich tendiere stark dazu das lausige Teil zu verschrotten.

An der Erweiterung des Asuro funktioniert Snake Vision übrigens prima.

Falls du das Teil doch noch zum Laufen bekommst, schreib mal wie.

Freundliche Grüße und nicht den Mut verlieren. Der Asuro kann noch viele
andere dolle Kunststücke.
Olaf

Arexx-Henk
18.07.2010, 14:26
Hallo,

Euh... bin da nicht sicher aber sollte da bei deinem zweiten Program nicht zuerst die InitUltrasonics() Funktion angerufen werden?

Wenn 'abstand = Chirp();' ersatzt wird von 'abstand = 1234;' komt da die Wert 1234 heraus?


Gruss,

Arexx-Henk

Ezalo
18.07.2010, 16:45
Der Code ist aus der Anleitung des 2. Links kopiert.

Hab gestern das Programm von "luma" aus folgendem Thread: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=10907&postdays=0&postorder=asc&highlight=ultraschall&start=22 geflasht und es kommt dauern nur 0 auf dem Bildschirm. Es kann ja dann eigentlich nur noch irgendwo was nich mit der Hardware stimmen :(

Ezalo
18.07.2010, 21:02
Wenn ich mein Ohr an die rechte Kapsel (von vorn draufgeschaut) ranhalte, hör ich ein leises "klacken" was wohl soviel heißt das ein Signal gesendet wird. Die Spannung die ich dabei Messe liegt bei 2,38-2,42V diese sinkt als ständig und steigt wieder. Was wohl soviel heißt das die Kapsel i.O. ist. Wäre vllt doch mal jmd so nett die Spannung an der Rechten kapsel (wohl empfänger) zu messen?

Wenn der Sender ein Signa ausgibt bedeutet dies dann gleichzeitig das der IC i.O. ist?

Ezalo
24.07.2010, 12:28
So, hab die Platine einem Arbeitkollegen gegeben. Der hat mehr möglichkeiten das ganze mal durchzumessen und so (Oszi und co.). Am Ende hat sich herrausgestellt das sich eine Verbindung vor dem löten "gedrückt" hat :-O

Und Zwar einer der Anschlüsse des Potis hatte keine Verbindung zum IC.
Habe das ganze jetzt mit folgendem Programm getestet:



#include "asuro.h"
#include "ultrasonics.h"


int main(void)
{
// Variablen
int chirpData = 0;

// Asuro initialisieren
Init();
set_sleep_mode(SLEEP_MODE_IDLE);

for(;;) {
chirpData = Chirp(TRUE);
PrintInt(chirpData);
SerWrite(" ", 2);
// Bischen warten und dabei Stromsparen
sleep_mode();
MSleep(250);
}

return 0;
}

Im Terminal kommt jetzt entweder ein Wert größer 0 oder es kommt "0 0". Danach kommt erst wieder ein Signal wenn ich die Senderkapsel antippe.

Werde heute mal weiter probieren.

Edit:

Das war jetzt wohl nur eine Einstellungssache des Potis ^^ Bekomme allerdings erst bei einem Abstand von ca. 10cm akzeptable Werte im Terminal zu sehen. Aber vllt lässt sich da ja noch was machen.

Ezalo
25.07.2010, 21:21
Hallo,

da bin ich wieder mit dem Problem ^^

Folgendes:

Habe nun verschieden Programme probiert und sie laufen auch wie sie es machen sollen. Sobald ich aber folgendes Programm umänder:


#include "asuro.h"

void LocalInit(void)
{
// Change Oscillator-frequency of Timer 2
// to 40kHz, no toggling of IO-pin:
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 0x64; // 40kHz @8MHz crystal
ADCSRA = 0x00; // ADC off
// Analog comparator:
ACSR = 0x02; // Generate interrupt on falling edge
ADMUX = 0x03; // Multiplexer for comparator to
// ADC pin 3
SFIOR |= (1 << ACME); // Enable muliplexing of comparator
DDRD &= ~(1 << 6); // Port D Pin 6 is input!
}


void Ping(unsigned char length)
{
count72kHz = 0;
TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
// Toggling of IO-Pin on

// generate the Chirp
while(count72kHz < length) {
OCR2 = 0x64 + length / 2 - count72kHz;
}

TCCR2 = (1 << WGM21) | (1 << CS20); // Toggling of IO-Pin off
OCR2 = 0x64; // set frequency to 40kHz
}


int main(void)
{
int pos, i;
int posmarker;
Init();
LocalInit();
while(TRUE) {
posmarker = 0;
Ping(20);
for(pos = 0; pos < 100; pos++) {
Sleep(10);
if((ACSR & (1 << ACI)) != 0) {
if(posmarker == 0) { posmarker = pos; }
}
ACSR |= (1 << ACI);
}
if(posmarker > 10) {
StatusLED(GREEN);
MotorDir(FWD, FWD);
MotorSpeed(200, 200);
}
else {
StatusLED(RED);
MotorDir(FWD, RWD);
MotorSpeed(0, 200);
for(i = 0; i<100; i++) { Sleep(200); }
}
}

return 0;
}


auf:


#include "asuro.h"

void LocalInit(void)
{
// Change Oscillator-frequency of Timer 2
// to 40kHz, no toggling of IO-pin:
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 0x64; // 40kHz @8MHz crystal
ADCSRA = 0x00; // ADC off
// Analog comparator:
ACSR = 0x02; // Generate interrupt on falling edge
ADMUX = 0x03; // Multiplexer for comparator to
// ADC pin 3
SFIOR |= (1 << ACME); // Enable muliplexing of comparator
DDRD &= ~(1 << 6); // Port D Pin 6 is input!
}


void Ping(unsigned char length)
{
count72kHz = 0;
TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
// Toggling of IO-Pin on

// generate the Chirp
while(count72kHz < length) {
OCR2 = 0x64 + length / 2 - count72kHz;
}

TCCR2 = (1 << WGM21) | (1 << CS20); // Toggling of IO-Pin off
OCR2 = 0x64; // set frequency to 40kHz
}


int main(void)
{
int pos, i;
int drive;
int posmarker;
Init();
LocalInit();
while(TRUE) {
posmarker = 0;
Ping(20);
for(pos = 0; pos < 100; pos++) {
Sleep(10);
if((ACSR & (1 << ACI)) != 0) {
if(posmarker == 0) { posmarker = pos; }
}
ACSR |= (1 << ACI);
}
if(posmarker < 10) {
StatusLED(GREEN);
MotorDir(RWD, RWD);
MotorSpeed(175,175);
for(drive = 0; drive < 71; drive++){
Sleep(255);
}
MotorDir(BREAK,RWD);
MotorSpeed(0,175);
for(drive = 0; drive < 71; drive++){
Sleep(255);
}
}
else {
StatusLED(RED);
MotorDir(FWD,FWD);
MotorSpeed(200,200);
for(i = 0; i<100; i++) { Sleep(200); }
}
}

return 0;
}


leuchtet nur noch die StatusLED grün und nix passiert mehr.

Liegt der Fehler in meinem Code oder eher in der verwendeten Asuro 2.8 rc1 lib?

Ezalo
26.07.2010, 18:43
Hilfe wäre schon nett :D

Arexx-Henk
26.07.2010, 19:09
Hallo,

Probiere dein Program nochmal aber jetzt ohne die Motoren ein zu schalten. Vielleicht zerstoren die irgendwie die Messung?

Gruss,

Henk

Ezalo
26.07.2010, 19:20
An den Motoren liegt es nicht, folgendes Programm läuft:


#include "asuro.h"

void LocalInit(void)
{
// Change Oscillator-frequency of Timer 2
// to 40kHz, no toggling of IO-pin:
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 0x64; // 40kHz @8MHz crystal
ADCSRA = 0x00; // ADC off
// Analog comparator:
ACSR = 0x02; // Generate interrupt on falling edge
ADMUX = 0x03; // Multiplexer for comparator to
// ADC pin 3
SFIOR |= (1 << ACME); // Enable muliplexing of comparator
DDRD &= ~(1 << 6); // Port D Pin 6 is input!
}


void Ping(unsigned char length)
{
count72kHz = 0;
TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
// Toggling of IO-Pin on

// generate the Chirp
while(count72kHz < length) {
OCR2 = 0x64 + length / 2 - count72kHz;
}

TCCR2 = (1 << WGM21) | (1 << CS20); // Toggling of IO-Pin off
OCR2 = 0x64; // set frequency to 40kHz
}


int main(void)
{
int pos, i;
int posmarker;
Init();
LocalInit();
while(TRUE) {
posmarker = 0;
Ping(20);
for(pos = 0; pos < 100; pos++) {
Sleep(10);
if((ACSR & (1 << ACI)) != 0) {
if(posmarker == 0) { posmarker = pos; }
}
ACSR |= (1 << ACI);
}
if(posmarker < 15) {
StatusLED(GREEN);
MotorDir(FWD, FWD);
MotorSpeed(200, 200);
}
else {
StatusLED(RED);
MotorDir(FWD, RWD);
MotorSpeed(0, 200);
for(i = 0; i<100; i++) { Sleep(200); }
}
}

return 0;
}


werde es jetzt nochmal nach und nach auf Ausweichen statts folgen umschreiben.

Ezalo
26.07.2010, 19:33
Code geändert auf:


#include "asuro.h"

void LocalInit(void)
{
// Change Oscillator-frequency of Timer 2
// to 40kHz, no toggling of IO-pin:
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 0x64; // 40kHz @8MHz crystal
ADCSRA = 0x00; // ADC off
// Analog comparator:
ACSR = 0x02; // Generate interrupt on falling edge
ADMUX = 0x03; // Multiplexer for comparator to
// ADC pin 3
SFIOR |= (1 << ACME); // Enable muliplexing of comparator
DDRD &= ~(1 << 6); // Port D Pin 6 is input!
}


void Ping(unsigned char length)
{
count72kHz = 0;
TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
// Toggling of IO-Pin on

// generate the Chirp
while(count72kHz < length) {
OCR2 = 0x64 + length / 2 - count72kHz;
}

TCCR2 = (1 << WGM21) | (1 << CS20); // Toggling of IO-Pin off
OCR2 = 0x64; // set frequency to 40kHz
}


int main(void)
{
int pos, i;
int posmarker;
Init();
LocalInit();
while(TRUE) {
posmarker = 0;
Ping(20);
for(pos = 0; pos < 100; pos++) {
Sleep(10);
if((ACSR & (1 << ACI)) != 0) {
if(posmarker == 0) { posmarker = pos; }
}
ACSR |= (1 << ACI);
}
if(posmarker < 15) {
StatusLED(GREEN);
MotorDir(FWD, RWD);
MotorSpeed(0, 200);
for(i = 0; i<100; i++){
Sleep(200);
}
}
else {
StatusLED(RED);
MotorDir(FWD, FWD);
MotorSpeed(200, 200);
}
}

return 0;
}

Da gehts auch schon los ^^

Anstatts das sich beide Räder vorwäts drehen, dreht sich nur das rechte rückwärts. Dabei ist ja garnix vor dem US-Sensor und selbst wenn da etwas ist, ändert sich nix am verhalten...

Was mach ich denn falsch? Läuft das Programm denn bei jemanden?
Hat vielleicht einer einen Tipp oder ein funktionierendes Programm das ich testen kann?

Ezalo
27.07.2010, 16:52
Ich bin doch nicht der einzige der diese Erweiterung nutzt, da müsste doch mal jemand einen Testcode für mich haben, von mir aus auch per PN wenn es nicht jeder sehen soll ^^

Arexx-Henk
27.07.2010, 19:21
Hallo,

Da hab ich leider keine Ahnung mehr aber vielleicht liegt's am compiler?

Probier mal dies:


if((ACSR & (1 << ACI)) != 0) {

auseinander zu schreiben:


unsigned char aci,acsr;


aci = ( 1 << ACI ) ;
acsr = ACSR & aci ;
if ( acsr != 0 ) {


und auch einige Sleep() im "else { StatusLED(RED);" ein zu bauen.

Gruss,

Henk

Ezalo
27.07.2010, 19:46
Also die StatusLED leuchtet nur grün wenn ich mit der neuen Lib compeliere (scheint mir so).

ältere lib: auf asuro werden 32pages geflasht
neuere lib: auf asuro werden nur 18pages geflasht

Das er am Anfang nicht einfach gerade fährt, liegt wohl an dem Teil wo:

posmarker =0; gesetzt wird. posmarker wird aber nicht größer 10 und somit wird alles unter else ausgeführt weil if nicht zutrifft >.<

mal weiter grübeln und deine idee mal verstehen und umsetzen :D

Ezalo
27.07.2010, 20:19
Soho! ^^

Der Code sieht jetzt wiefolgt aus:


#include "asuro.h"

void LocalInit(void)
{
// Change Oscillator-frequency of Timer 2
// to 40kHz, no toggling of IO-pin:
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 0x64; // 40kHz @8MHz crystal
ADCSRA = 0x00; // ADC off
// Analog comparator:
ACSR = 0x02; // Generate interrupt on falling edge
ADMUX = 0x03; // Multiplexer for comparator to
// ADC pin 3
SFIOR |= (1 << ACME); // Enable muliplexing of comparator
DDRD &= ~(1 << 6); // Port D Pin 6 is input!
}


void Ping(unsigned char length)
{
count72kHz = 0;
TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
// Toggling of IO-Pin on

// generate the Chirp
while(count72kHz < length) {
OCR2 = 0x64 + length / 2 - count72kHz;
}

TCCR2 = (1 << WGM21) | (1 << CS20); // Toggling of IO-Pin off
OCR2 = 0x64; // set frequency to 40kHz
}


int main(void)
{
int pos, i;
int posmarker;
unsigned char aci,acsr;
Init();
LocalInit();
while(TRUE){
posmarker = 0;
Ping(20);
for(pos = 0; pos < 100; pos++) {
Sleep(10);
aci = ( 1 << ACI ) ;
acsr = ACSR & aci ;
if ( acsr != 0 ) {
if(posmarker == 0) { posmarker = pos; }
}
ACSR |= (1 << ACI);
}
if(posmarker < 13) {
StatusLED(GREEN);
MotorDir(FWD, RWD);
MotorSpeed(0,170);
}
else {
StatusLED(RED);
MotorDir(FWD, FWD);
MotorSpeed(200,200);
for(i = 0; i<100; i++) { Sleep(200); }
}
}

return 0;
}


jetzt läfuts fast so wie ich will. Nur das wohl manchmal auch ohne Hinderniss der wert von "posmarker" über 13 steigt.