PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Programmstart mit Hindernissen



basteluwe
28.02.2014, 13:24
Ich hatte vor Kurzem in meinem I2C Thema am Ende schon mal diese Frage gestellt, aber leider keine Antwort mehr bekommen.
Hier also noch ein Versuch:

Auf der Base des RP6 läuft "RP6Base_I2CSlave" und auf der M256-WiFi läuft "Example_10_Move"
Die Programme sind unverändert aus dem Ordner "RP6_Examples_20120725". Der RobotLoader ist Version 2.5a

Nach dem Start vom Button auf der Base läuft das Programm so, wie es ursprünglich soll: Der Robby fährt fröhlich umher, ACS ist aktiv (die LED zappeln) und er weicht Hindernissen aus und auch die Bumper reagieren.
Nach dem Start vom WiFi Loader tut er "nur beinahe" das gleiche, aber das ACS ist nicht aktiv! Die entsprechenden LEDs zeigen keine Action und er weicht auch nicht aus. Die Bumper funktionieren aber!
Fakt ist, die installierten Programme reagieren unterschiedlich, je nachdem ob der Start von der Base oder vom WiFi Loader erfolgt.

SlyD hatte im I2C Thema schon erklärt, dass da eigentlich kein Unterschied sein soll/kann.
Irgendwelche Ideen? Kann das vielleicht jemand mit dem gleichen Setup testen?

Gruß Uwe

P.S. Ich hatte hier ursprünglich geschrieben, dass 09-Move auf dem M256 ist, das war falsch! Es ist 10-Move drauf. Hab ich im Text oben nachträglich geändert!

Dirk
28.02.2014, 19:55
Hi Uwe,

ich hatte dich ja auch schon an SlyD verwiesen, der den RP6 konstruiert und die Software dafür geschrieben hat.
Er hatte ja Timing-Probleme erwähnt, an die ich auch glaube.

Bei mir läuft das mit dem Example_09_Move so, dass ich nach dem Wifi-Start die Meldung:

Moving...

I2C ERROR - TWI State: 0x

Moving Forwards...

I2C ERROR - TWI State: 0x
... bekomme. Der RP6 bewegt sich nicht und ich muss mit Reset abbrechen.
Mit dem Start-Button auf dem RP6 klappt alles gut.

Wenn er bei dir nach dem Wifi-Start rumfährt, ist das also schon so, wie es sein soll.
Das ACS und die Bumper sind bei der Demo ja sowieso nicht in Betrieb, da kannst du weder eine Funktion noch Nichtfunktion beobachten.

Letztlich müßte SlyD das Problem eingrenzen.

basteluwe
01.03.2014, 10:56
Hi Dirk,
Ich muß mich korrigieren (echt doof)! Ich habe auf der M256 natürlich NICHT das Programm 09_Move, sondern 10_Move. Deshalb hatte ich auch von ACS und Bumpern geschrieben.
09_Move reagiert bei mir exakt genauso, wie bei dir. Bei Start über WiFi bekomme ich den selben Error-Code im terminal wir du und die Base fährt nicht! Bei Start über Base-Button ist alles OK.
Könntest du vielleicht das gleiche mit 10_Move testen? Über WiFi Start müsste er zwar fahren und auch die Bumper reagieren, aber ACS geht NICHT.
Über Base-Start funktioniert bei mir alles.
Wäre schön, wenn du das bestätigen könntest, bitte.

Gruß Uwe

Dirk
01.03.2014, 12:02
Hi Uwe,
habs getestet mit demselben Ergebnis wie bei dir:
Nach Wifi-Start funktioniert das ACS beim Example_10_Move2 nicht, wohl aber nach dem Programmstart mit dem Start-Button. Immerhin fährt der RP6 herum und reagiert auf die Bumper.
Die Ausgaben sehen aus wie vorgesehen, es gibt auch keine I2C-Fehlermeldungen.

basteluwe
01.03.2014, 14:42
Hi Uwe,
habs getestet mit demselben Ergebnis wie bei dir:
Nach Wifi-Start funktioniert das ACS beim Example_10_Move2 nicht, wohl aber nach dem Programmstart mit dem Start-Button. Immerhin fährt der RP6 herum und reagiert auf die Bumper.
Die Ausgaben sehen aus wie vorgesehen, es gibt auch keine I2C-Fehlermeldungen.
OK, genau so sieht's bei mir auch aus. Danke für deinen Test!
Das ist dann ja aber wohl ein Fehler, denn wie SlyD in meinem I2C-Thema geschrieben hatte:


"...normalerweise sollten immer alle Controller gestartet werden, wenn einer davon startet (Signal über den I2C Bus wird von allen Bootloadern beim Start gesendet / empfangen). Also auch wenn das Programm vom RobotLoader aus gestartet wird. Ist das nicht so läuft irgendwas verkehrt.


Frage also: WAS ist verkehrt? Es scheint ja ein genereller Fehler zu sein, der mehrere User betrifft!

Gruß Uwe

SlyD
04.03.2014, 07:38
Hallo,

bin diesen Monat leider extrem beschäftigt - werde mir das nächsten Monat genauer anschauen.

Als Workaround: Pack einfach mal die Initialisierung für ACS usw


// ---------------------------------------
// Setup ACS power:
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_ACS_POWER, ACS_PWR_MED);
// Enable Watchdog for Interrupt requests:
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT, true);
// Enable timed watchdog requests:
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT_RQ, true);


nochmal vor die Pausen am Anfang also direkt vor die Ausgabe auf dem Display (Zeile 699),
ggf. auch zweimal mit weiterer Pause dazwischen (200ms).
Könnte dann funktionieren.

MfG,
SlyD

basteluwe
04.03.2014, 14:40
Als Workaround: Pack einfach mal die Initialisierung für ACS usw. nochmal vor die Pausen am Anfang also direkt vor die Ausgabe auf dem Display (Zeile 699),
ggf. auch zweimal mit weiterer Pause dazwischen (200ms).
Könnte dann funktionieren.

MfG,
SlyD
Danke SlyD.
Mal sehen, ob ich das hinkriege. Der RP6 ist mein erster Einstieg in C (bisher nur Bascom). Ich fang also ganz klein an!
Das wird wohl spannend :confused:

Gruß Uwe

SlyD
04.03.2014, 15:04
Hallo Uwe,

ah OK - naja ist keine große Sache: wirklich einfach nur den Text da oben in die genannte Zeile kopieren (der steht dann also zweimal im Programm getrennt durch die Pausen und Display ausgaben) und dann neu compilieren.

Dann nochmal probieren.


Ich habs noch nicht getestet daher ohne Garantie dass es was ändert.

MfG,
SlyD

basteluwe
06.02.2016, 16:17
Ich hole dieses Thema noch mal hoch, weil ich gerade mal wieder drüber gestolpert bin. Aus meiner Sicht ist es immer noch nicht gelöst.


Als Workaround: Pack einfach mal die Initialisierung für ACS usw
nochmal vor die Pausen am Anfang also direkt vor die Ausgabe auf dem Display (Zeile 699),
ggf. auch zweimal mit weiterer Pause dazwischen (200ms).
Könnte dann funktionieren.
SlyD
Das hab ich versucht, bringt leider gar nichts. Wundert mich aber auch nicht, weil ja nicht nur Move10 sondern auch Move9 nicht fehlerfrei vom WiFi-Loader starten, und Move9 arbeitet ja nicht mit ACS. Mit dem ACS hat das also nichts zu tun.
Es muß irgendwie an der Startroutine beider Prozessoren über I2C liegen.:confused:

Uwe

SlyD
08.02.2016, 08:41
Hallo,

es geht dabei auch nicht um das ACS - es geht darum irgendwas beliebiges über den I2C Bus zu senden weil das den Start auslöst (kannst auch an Adresse 0, daten 0 senden ist egal).
Das normale Programm braucht am Anfang evtl. zu lange bis der Bus reagiert und dann kommt es eben zu den "slave antwortet nicht" 0x20 Fehlern oben.
Also möglichst früh senden, dann eine lange Pause machen. Dann sollte es normal laufen.

MfG,
SlyD

basteluwe
09.02.2016, 07:42
Hallo SlyD, nun geht es tatsächlich!
Wie man hier unten im Code sieht, habe ich die Initialisierung des ACS, wie von dir vorgeschlagen noch 2x vor den "showScreenLCD" Befehl gepappt, jeweils mit einer Pause danach. 1x reichte NICHT! Mit 2x zusätzlich funktioniert es, aber es sieht echt seltsam aus.
Das muß doch auch formschöner hinzukriegen sein!?
Ich hab verschieden Versionen versucht, mit und ohne Pausen, verschiedene Pausenlängen usw. Bisher klappt es bei mir sicher nur so, wie hier zu sehen.
Danke nochmals für den Hinweis.
Vielleicht hat trotzdem jemand einen Tip, wie man das Problem generell löst. Dirk hatte ja oben bestätigt, das es zumindest auch beim Beispiel Move9 auftritt. Da müsste aber das Programm anders geändert werden (ACS ist ja nicht drin).
Eine allgemeingültige "formschöne" Lösung wäre besser als dieses "Workaround", finde ich.

Gruß Uwe



setLEDs(0b1111);

// ---eingefügt wegen Startup-Problem I2C---
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_ACS_POWER, ACS_PWR_MED);
// Enable Watchdog for Interrupt requests:
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT, true);
// Enable timed watchdog requests:
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT_RQ, true);

mSleep(200);

// Setup ACS power:
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_ACS_POWER, ACS_PWR_MED);
// Enable Watchdog for Interrupt requests:
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT, true);
// Enable timed watchdog requests:
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT_RQ, true);

mSleep(200)
// ---Ende Einfügung wegen Startup-Problem I2C---

showScreenLCD("################", "################");
mSleep(500);
showScreenLCD("I2C-Master", "Behaviours");
mSleep(1000);
setLEDs(0b0000);

// ---------------------------------------
// Setup ACS power:
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_ACS_POWER, ACS_PWR_MED);
// Enable Watchdog for Interrupt requests:
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT, true);
// Enable timed watchdog requests:
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT_RQ, true);

SlyD
09.02.2016, 12:56
Wie ich schon sagte ist es egal was gesendet wird. Beispielsweise sollte auch ein "I2C general call" funktionieren.



I2CTWI_transmitByte(0, 0);
mSleep(200);
I2CTWI_transmitByte(0, 0);



MfG,
SlyD

basteluwe
09.02.2016, 13:11
Wie ich schon sagte ist es egal was gesendet wird. Beispielsweise sollte auch ein "I2C general call" funktionieren.
MfG,
SlyD

OK, das versuche ich heute abend mal!

Danke, Uwe

SlyD
09.02.2016, 13:37
Genau genommen sollte es sogar so



mSleep(250);
I2CTWI_transmitByte(0, 0);


bereits funktionieren. Die Pause ggf. etwas länger machen.

Noch zur Erläuterung:
Das Problem ist einfach, dass der ältere Bootloader im Slave (RP6 Mainboard) nach dem Reset zu lange auf Kommunikation vom PC über USB wartet, in der Zeit aber nicht auf den I2C Bus achtet.
Das M256 Modul kann das Programm wesentlich schneller starten wenn der Befehl vom PC kommt und dann bekommt der Slave Bootloader den Start nicht mit (könnte man ggf. sogar im RobotLoader künstlich etwas verzögern - müsste ich aber ausführlich testen und habe da aktuell leider noch weniger Zeit zu ;-) ).

MfG,
SlyD

basteluwe
09.02.2016, 18:16
mSleep(250);
I2CTWI_transmitByte(0, 0);


Der Code oben hat tatsächlich gereicht, um Programm 10-Move2 sicher zu starten!

Allerdings wollte das Programm 9-Move damit NICHT starten, auch nicht mit längerer Pause. Ich habe schließlich für beide Programme diesen Schnipsel versucht:


I2CTWI_transmitByte(0, 0);
mSleep(200);
I2CTWI_transmitByte(0, 0);

Damit starten beide sicher!
Problem gelöst, Danke! :)

Uwe