PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme beim Ausführen/programmieren



Chuck_Norris
14.06.2014, 16:13
Hey!

Ich habe vor ein paar Tagen meinen Asuro zusammengebaut und alles funktioniert super, beim Test gab es keine Probleme :)
Heute wollte ich mit dem Programmieren anfangen (bis jetzt habe ich hauptsächlich Python programmiert und ein wenig C++), habe aber jedesmal ein Problem wenn Asuro meinen Code ausführen soll. Ich wollte ein einfaches Programm schreiben, welches Asuro fahren und anhalten lässt wenn er gegen eine Mauer fährt und dabei soll sich die Led Farbe ändern. Das habe ich jetzt auch in allen erdenklichen Möglichkeiten probiert, die Richtige war scheinbar noch nicht dabei. Das Seltsame ist aber, dass der Compiler immer ohne Probleme durchläuft, nur Asuro will das dann nicht. Einmal ist er wenigstens losgefahren, hat dann aber an der Mauer nicht gehalten. Das Problem scheint irgendwie an meiner while Schleife zu liegen, ich habe da aber gerade so viel gelesen und probiert und finde den Fehler nicht, dass ich mich jetzt an Euch wende :)

Mein letzter Versuch sieht folgendermaßen aus:



#include "asuro.h"

int main(void)
{
Init();

StatusLED(GREEN);

MotorDir(FWD,FWD);
MotorSpeed(120,120);

while(PollSwitch() == 0)
{
continue;
}

MotorSpeed(0,0);

StatusLED(YELLOW);

while(1);
return 0;
}




Und eine weitere Frage habe ich noch; die Software die mitgeliefert wurde ist ja ziemlich veraltet und das Terminal was benutzt wurde gibt es so gar nicht mehr, gibt es dafür eine gute alternative die ihr mir empfehlen könnt? :)

LG,

Chuck

Che Guevara
14.06.2014, 16:26
Hi,

also gleichmal vorneweg, ich habe keinen Asuro und kenne deswegen auch die Funktionen nicht im Detail, aber dein Programm sollte in etwa so aussehen:


#include "asuro.h"

int main(void)
{
Init();

StatusLED(GREEN);

MotorDir(FWD,FWD);
MotorSpeed(120,120);

while(1)
{
if(PollSwitch()==1) //Kollision
{
MotorSpeed(0,0); //Stop Motors
StatusLED(RED);
}
}
}

Ich bin mir nicht sicher, ob die Motoren so korrekt gestoppt werden, aber das weißt du ja sicher.

Gruß
Chris

Chuck_Norris
14.06.2014, 16:45
Hey Chris!

Danke für die schneller Antwort, so ähnlich sah auch mal ein Versuch von mir aus, ich habe nur hinter StatusLED(RED); noch ein break; gehangen, aber das ist dann wohl nicht nötig? da hatte der compiler aber auch an dem break gemeckert.
Ich habe jetzt deinen Code 1:1 kopiert, same procedure as every time, Compiler läuft ohne Probleme durch, ich übertrage es auf Asuro, der will aber nicht und leuchtet rot wie er es immer bei Fehlern macht (deshalb hatte ich Status Led auch auf YELLOW gestellt).

LG,

Chuck

radbruch
14.06.2014, 18:26
Hallo

Ein möglicher Ersatz für das bei Windows 7/8 nicht mehr verfügbare Hyperterminal könnte z.B. das HTerm sein:
http://www.der-hammer.info/terminal/

Oder suchst du dir selbst was im Netz: https://www.google.de/search?q=ersatz+für+hyperterminal

while(PollSwitch() == 0) ist ganz arg böse! Durch Bauteiletoleranzen sind die Werte von PollSwitch() häufig nicht so wie man es erwartet. Wenn du ein Terminalprogramm gefunden hast, dann schau dir mal die Werte an die PollSwitch() liefert (https://www.roboternetz.de/community/threads/31893-Tasterwerte-an-Hyperterminal-%C3%BCbergeben). Und schau mal, was bei laufenden Antrieben erkannt wird...

Init();
StatusLED(GREEN);

Init() setzt die StatusLED() schon auf grün, vielleicht hast die LED falschrum eingebaut?

Und noch ein Hinweis: asuro-Programme sollten NIE beendet werden! Das Programm springt dann an irgendeine Stelle im Speicher des asuro und ab dieser Adresse werden die gefunden Bytes als Programm interpretiert. Sicherer ist immer ein Ende mit

while(1);
return(0);

Gruß

mic

Chuck_Norris
14.06.2014, 18:39
Hey!

Danke, das Terminal werde ich gleich mal ausprobieren :)
oh, okay, dann werde ich das mal tun, in der Anleitung gab es aber glaube ich auch so ähnliche Beispiele. Nö, die Led ist richtig eingebaut, beim Test hast die Hardware einwandfrei funktioniert.Das while 1 return 0 hatte ich auch noch ergänzt, aber macht das bei dem Code oben einen Unterschied? da geht der doch sowieso nicht aus der while schleife raus mit dem motor raus, oder? Auf jeden Fall fängt er bei dem Code oben noch nichtmal an die Räder zu drehen sondern die Lampe ist einfach rot, was sie nach meinem Code gar nicht sein darf. für den Fall dass wegen falscher taster werde PollSwitch() auch so größer als 0 ist habe ich ja extra das gelbe leuchten angefügt um zu sehen dass er die Schleife trotzdem abarbeitet, da kommt er aber ja offensichtlich gar nicht hin.
Danke für deine Tipps, aber ich verstehe immer noch nicht so ganz warum bei mir dieser Fehler auftritt..hat vielleicht einen ähnlichen Code der bei ihm funktioniert den ich mal bei mir testen kann?

LG,

Chuck

radbruch
14.06.2014, 19:08
Hallo

Zeig doch noch deine aktuelle Programmvariante. Beim Beispiel aus dem ersten Beitrag liegt das Problem eindeutig bei Pollswitch().

Das "continue" kannst du dir bei deinem Programm sparen:

Die continue Anweisung springt weiter zum Anfang der Schleife, überspringt also die Anweisungen, die zwischen continue und dem Schleifenende liegen(Von http://www.peace-software.de/ckurs11.html)

Gruß

mic

[Edit]
Eine alternative Tastenabfrage kann man mit der Überprüfung des Tasten-Eingangspin PC4 ohne ADC durchführen:
https://www.roboternetz.de/community/threads/28448-Probleme-mit-if-Bedingungen?p=269681&viewfull=1#post269681

Chuck_Norris
14.06.2014, 19:24
Hey!

Okay, dann gucke ich mir nochmal an wie ich das mit dem PollSwitch realisiere, danke :)

Ich weiß aber jetzt auch warum mir das nicht aufgefallen ist. Ich dachte ja wenn der Sensor trotzdem Werte > 0 liefert sehe ich wenigstens dass die LED nach der Schleife gelb leuchtet, aber genau das tut sie nicht. wenn ich ein einfaches Programm schreibe:



#include "asuro.h"

int main(void)
{
Init();

StatusLED(GREEN);

while(1);
return 0;

}


funktioniert das. Wenn ich das GREEN durch YELLOW ersetze, leuchtet die Lampe rot. Im Selbsttest hat sie aber gelb geleuchtet. Was hab ich denn da falsch gemacht? ich hatte mich so über das gelbe leuchten im Selbsttest gefreut :D

LG,
Chuck

radbruch
14.06.2014, 19:56
Hallo


Wenn ich das GREEN durch YELLOW ersetze, leuchtet die Lampe rot.Das kann ich nicht erklären. Die zweifarbige StatusLED ist eine grüne und eine rote LED in einem Gehäuse. Wenn die Ansteuerung von Grün funktioniert und Rot auch leuchtet sollten beide LED auch funktionieren. Selbst wenn die LED falschrum eingelötet wurde sollten bei Yellow beide LED angesteuert werden und die Lampe Gelb leuchten. *kopfkratz


PD2 o--|>|--o--|<|--o PB0
gn gnd rt


In asuro.c endet Init() mit:


ODOMETRIE_LED_OFF;

FrontLED(OFF);
BackLED(ON,ON);
BackLED(OFF,OFF);
StatusLED(GREEN);

MotorDir(FWD,FWD);
MotorSpeed(0,0);
sei();
}
Das StatusLED(GREEN); kannst du dir also sparen...

In meinem letzen Beitrag gibt es ein Edit mit der Tastenabfrage ohne ADC.

Gruß

mic

Spacy Bar
14.06.2014, 21:24
Um nochmal meinen Senf dazuzugeben, habe ich auch einen passenden Code entwickelt.


#include "asuro.h"

int main(void){
while(1){
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(120,120);
if(PollSwitch()!=0){
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
StatusLED(RED);
}
}
while(1);
return 0;
}

Zu eventuellen elektronischen Fehler kann ich nix sagen ---> nur Programmierer :)

LG
Spacy Bar

radbruch
14.06.2014, 21:38
Das Init() fehlt noch und ich würde dies ergänzen:

StatusLED(RED);
while(PollSwitch()!=0);
}

Wenn PollSwitch() richtige Werte liefert sollte das funktionieren.

Chuck_Norris
15.06.2014, 22:49
Hey!

Danke für die Antworten, das gelbe Licht ist also eine Kombination aus grün und rot? Da ich YELLOW richtig geschrieben habe kann das Problem ja dann eigentlich nur an der Funktion liegen die man mit StatusLED aufruft, oder?
Und jetzt komme ich direkt schon wieder mit der nächsten Frage :D ich habe jetzt eine alte Version von Hyperterminal runterladen können mit der der Empfang beim Selbsttest funktioniert hat, Asuro hat immer brav gemeldet was er grade testet. ich habe dann als ersten Schritt in Richtung Sensor auslesen ein Programm geschrieben was einfach immer wieder hallo an Hyperterm schicken soll:



#include "asuro.h"

int main(void)
{
Init();

StatusLED(GREEN);
while(1)
{
SerWrite("Hallo",5);
/*
for (i=0; i<200; i++)
{
Sleep(255);
}
*/
}

while(1);
return 0;

}


Die Schleife, die dazwischen Pause machen soll habe ich erst einmal deaktiviert da der Compiler da meckert, er sagt immer i sei nicht deklariert, das macht man aber ja erst in der Schleife, dann muss wohl irgendwo anders der Fehler liegen.
Worum es mir aber eigentlich geht ist, dass ich immer nur kryptische Zeichen Empfange. Asuro sendet auf jeden Fall, ich empfange immer etwas wenn er an ist und in der Nähe ist, allerdings sind das irgendwelche Zeichen und leider nicht das Hallo. muss ich da irgendwie noch mitteilen wie die Zeichen zu interpretieren sind oder so? Im SelfTest hab ich auf jeden Fall immer normale Wörter empfangen :)

LG,

Chuck

PS: Ich bekomme jedes mal beim Kompilieren eine Warnung:
c:/winavr-20100110/lib/gcc/../../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. Use <avr/interrupt.h>."

Kann ich die ignorieren oder muss ich da etwas ändern?

Wsk8
15.06.2014, 23:21
SerWrite("Hallo",5);


uint8_t i;
for (i=0; i<200; i++) {
Sleep(255);
}



Worum es mir aber eigentlich geht ist, dass ich immer nur kryptische Zeichen Empfange. Asuro sendet auf jeden Fall, ich empfange immer etwas wenn er an ist und in der Nähe ist, allerdings sind das irgendwelche Zeichen und leider nicht das Hallo. muss ich da irgendwie noch mitteilen wie die Zeichen zu interpretieren sind oder so? Im SelfTest hab ich auf jeden Fall immer normale Wörter empfangen :)
Baudrate im Hyperterminal richtig gesetzt? 2400?

mfg

Spacy Bar
16.06.2014, 05:17
Die variable i muss schon vor Init()
deklariert werden, da sonst der Prozessor keinen Speicherplatz für sie reserviert. Die Warnung unten kannst du ignorieren, er beschwert sich nur, dass die Headerdatei signal.h überflüssig
eingebunden wurde.

LG
Spacy Bar

radbruch
16.06.2014, 07:29
Hallo

Die Warnung verschwindet, wenn du in asuro.h die Zeile #include signal.h in #include interrupt.h änderst:

#include <avr/io.h>
#include <avr/interrupt.h>
//#include <avr/signal.h>
#include <stdlib.h>

Vielleicht solltest du nach "Hallo" noch ein LFCR senden:

SerWrite("Hallo\n\r",7);

Gruß

mic

Chuck_Norris
16.06.2014, 18:15
Hey!

Super, die Warnung ist jetzt weg, danke :) Jetzt habe ich noch folgende Warnung:



test.c:10: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness


(nur für den Fall, dass es relevant ist)

der neue Code mit



SerWrite("Hallo\n\r",7);


führt leider auch nicht zum Erfolg. Die Baudrate (ich nehme an Bits pro Sekunde) steht auf 2400, ja.

Vielleicht eine blöde Frage, aber kann das irgendwie mit dem Compiler zusammenhängen? Vor allem irritiert mich eben auch, dass die LED nicht gelb leuchtet, da kann man ja beim programmieren nicht so viel falsch machen. Den Selbsttest muss man ja nicht compilieren und da hat es funktioniert.

Ich hänge mal an, was im Hyper Terminal ankommt.

Danke für die ganze Mühe! :)

LG,

Chuck28499

radbruch
16.06.2014, 19:18
Hallo

Die Pointerwarnung kam irgendwann mal nach einem Update vom WinAVR. Der zu ändernde Code in asuro.h:

/* function for serial communication */
void SerWrite(char *data, unsigned char length); // edit by mic 1.4.2011

Und entsprechend in asuro.c:

/* function for serial communication */
void SerWrite(char *data, unsigned char length) // edit by mic 1.4.2011
{


Parameter für das Terminalprogramm sind 2400Baud, 8Bit, none Parity, 1Stopbit und keine Flußkontrolle. Die 7 Zeichen kommen an, werden aber nicht richtig eingelesen: "Ha_|CoR". Da der Fehler mit jedem Zeichen schlimmer zu werden scheint, tippe ich auf das Stopbit...


Vor allem irritiert mich eben auch, dass die LED nicht gelb leuchtet, da kann man ja beim programmieren nicht so viel falsch machen.
Nicht richtig kompilliert? Falsche Datei geflasht? Fehler beim Flashen? Oder der Klassiker beim Notepad: Quellcode nicht gespeichert vor dem Kompillieren. Versuch's doch einfach nochmal:

#include "asuro.h"

int main(void)
{
Init();
StatusLED(YELLOW);
while(1);
return 0;
}(ungetestet)

Gruß

mic

Chuck_Norris
16.06.2014, 20:31
28500Hey!

Super, danke! Das hat so funktioniert, die Warnung kommt nicht mehr. Hab ich de ganze Teit genau so eingestellt, ich Poste das Bild mal im Anhang, geht aber leider nicht. Im Test sind aber mit gleichen Einstellungen so Sachen wie
LED Test
Motor Test
o.Ä. darüber ganz problemlos empfangen worden.
Und ich habe gar nicht den Eindruck dass es schlimmer wird, zwischendrin sind nur mal störeffekte, aber hinterher kommt meine ich immer wieder das gleiche an..
Wegen der Lampe:
Kompiliert habe ich es ganz normal, ich hatte dann erst die Datei die Lampe auf Grün stellt -> LED ist grün. Dann habe ich GREEN in YELLOW umgewandelt, kompiliert, geflasht -> LED leuchtet rot :/ wäre es möglich, dass du mir deinen Quellcode den du oben für die gelbe Lampe geschrieben hast einmal kompilierst und ich flashe den drauf? Wenn die Lampe bei dir gelb leuchtet müsste sie es ja dann auch bei mir gelb sein..

LG,

Chuck

Valen
17.06.2014, 12:12
StatusLED:

Und wie ist es mit ein mögliche Hardware Fehler? Sind zbs. die Beinchen der Widerstanden vielleicht zu einander gebogen? Machen sie vielleicht Kontakt? Gibt es kleine (ungewünschte) Lötbrücken zwischen die Leiterbahnen auf die Platine? Vielleicht gibt es auch ein Verbindung zu den Widerstand R16 und IR-LED D10 das die Serielle Daten zerstört.

radbruch
17.06.2014, 12:22
Hallo

"Schlimmer" bezog sich auf die Änderung innerhalb eines "Ha_|CoR"-Blockes. H und a wurden noch fehlerfrei erkannt, aber dann wurde es immer schlimmer. Vielleicht funktioniert es jetzt nachdem du fehler- und warnungsfrei kompilieren kannst.

Die StatusLED ist eine Grundfunktion die beim asuro schon immer so funktionierte. Über Probleme durch den Kompiler habe ich bisher noch nichts gelesen. Da die Led D12 direkt zwischen zwei Ausgangspins und GND angeschlossen ist (natürlich mit den passenden Vorwiderständen R10/R31) kannst du mit gezogenem Mega8 die LED auch mit Drahtbrücken zwischen VCC (Pin 1 oder 7 des Mega8-Sockel) und PD2 (Pin 4) für rot bzw. PB0 (Pin 14) für grün zum Leuchten bringen:

https://www.roboternetz.de/community/attachment.php?attachmentid=28501&stc=1&d=1403003887
https://www.roboternetz.de/community/attachment.php?attachmentid=28502&stc=1&d=1403003905

Gruß

mic

Chuck_Norris
17.06.2014, 13:23
Hey!

Mist, es tut mir soo leid! Jezt habe ich euch so lange mit der lampe aufgehalten und das war alleine mein dummer Fehler :( Das gelbe leuchten wirkt einfach so rot, dass man es nur bei abwechselndem blinken rot->gelb als gelb erkennen kann (zumindest ich). Ich habe das grade nochmal ausprobiert...zu meiner verteidigung: ich war nocht der einzige der das als rot gedeutet hat, das haben schon ein paar Leute gesehen :rolleyes:
Bleibt jetzt nur noch der IR-Fehler, den habt ihr ja jetzt auch gesehen, dass liegt jetzt nicht an einer Sehschwäche :D . Dass es schlimmer innerhalb eines Blockes wird stimmt, da hatte ich dich falsch verstanden. Das kompilieren mit den Veränderungen hat leider keine Verbesserung gebracht. Ich habe auch schon Hterm oder so und AVR Terminal ausprobiert, da empfange ich aber leider überhaupt nichts und außerdem hat die Übertragung beim Self Test mit Hyper Terminal ja auch problemlos geklappt...

LG,

Chuck

Chuck_Norris
19.06.2014, 11:27
Hey!

So langsam habe ich das Gefühl dass ich irgendwo einen Wackelkontakt oder so habe...gestern war ein Freund da dem ich zeigen wollte, dass das hallo senden nicht funktioniert, auf einmal lief es mit genau dem gleichen Code einwandfrei.
Na gut, komisch, aber hauptsache es funktioniert. Dann habe ich eben die Daten der Tastsensoren ausgelesen, die passen perfekt, also 1 wenn der erste Taster gedrückt wurde, dann 2, 4,..
Der Code fürs auslesen:



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

int main(void)
{
char text[6];
unsigned char t1, t2;

Init();
SerWrite("\r\nTastsensor Test\r\n",19);
while(1)
{
t1 = PollSwitch();
t2 = PollSwitch();
if(t1 && t2 && t1 == t2)
{
itoa(t1,text,10);
SerWrite(text,6);
SerWrite("\r\n", 2);
}
}
}


hab mich erstmal gefreut und erst ein Programm geschrieben, bei dem ASURO stoppt wenn er gegen eine Wand fährt, danach eins, bei dem er je nachdem ob er rechts oder links gegen eine Wand fährt rechts rückwärts oder links rückwärts dreht und dann wieder geradeaus fährt. Hat erstmal super funktioniert, dann hat sich teilweise nur moch ein Motor gedreht, er hat gar nicht mehr auf die taster reagiert oder nach dem einschalten einfach nur gelb geblinkt.
Vor allem dass er nicht mehr auf die Taster reagiert hat fand ich komisch, also habe ich die Werte mit dem Programm noch einmal ausgelesen und jetzt bekomme ich auf einmal für jeden Sensor statt einer 1 eine 165, statt einer zwei eine 265, 4 -> 465 usw.
was hab ich denn jetzt schon wieder falsch gemacht :confused:

LG,

Chuck

Edit: Und ist es normal dass die Motoren leicht riechen wenn die sich drehen :D

Sisor
19.06.2014, 12:10
char text[6] = {0}; ?

Spacy Bar
21.06.2014, 22:23
Ich sehe da 2 kleine Fehler:

volatile unsigned char t1, t2;

und


if( (t1) && (t2) && (t1 == t2) ){//.....
}

Kleiner Tipp am Ende:


t1 = 0;
t2 = 0;

LG
Spacy Bar

Sisor
22.06.2014, 08:12
Ich sehe da 2 kleine Fehler:

volatile unsigned char t1, t2;

Nein, volatile macht hier keinen Sinn. Die Variablen sind nur im Sketch bekannt, wie kann da äußerlich zugegriffen werden?




if( (t1) && (t2) && (t1 == t2) ){//.....}

Wie wärs mit:

if(t1 && (t1 == t2) ){//.....}
oder

if(t1 & t2){//.....}


Kleiner Tipp am Ende:

t1 = 0;
t2 = 0;

Ja, Variablen initialisieren ist guter Stil, und manchmal ist fehlendes Initialisieren Grund von Programmfehlern;)!

radbruch
22.06.2014, 08:41
if(t1 && t2 >0) ){//.....}

ist ja nicht das was wir wollen! Wenn schon kürzen, dann richtig:

if( (t1 > 0) && (t1 == t2) ){//.....}

Wenn eine Taste gedrückt wurde und zweimal die selbe Taste erkannt wurde, dann...

Gruß

mic

Sisor
22.06.2014, 09:04
Verdammte Operatoren... ich meinte:

if((t1 & t2) > 0) ){//.....}

bzw gekürzt ;):

if(t1 & t2){//.....}