PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem beim Flashen



isor
03.12.2009, 20:37
Also wie es der Titel schon sagt hab ich da so ein Problem beim Flashen des Asuro, dabei laufen alle Tests problemlos nur wenn ich ihn dann versuche zu flashen kommt das:

Open COM3 --> OK !
Bulding RAM --> OK !
Connect to ASURO --> OK !
Sending Page 000 of 024 --> tttttttttt
TIMEOUT !
ASURO dead --> FLASH damaged !!

Was könnte das Problem sein?
Könnte man vielleicht den Infrarot Controller und den Asuro überbrücken und den Asuro irgendwie anders Flashen?
Bin nen noob in Sachen Elektrotechnik aber Danke im Voraus für Antworten!

021aet04
06.12.2009, 10:12
ASURO dead --> FLASH damaged !!

Das Problem hast du schon geschrieben.
Hast du einen 2ten µC zum Testen? Ist vielleicht bei den Fuses etwas verstellt? Kenne mich mit dem Asuro bzw deren Bootloader nicht aus.

MfG Hannes

isor
06.12.2009, 10:40
Also ich habe keinen 2ten µC und was is ein Fuses.
Das ich das problem schon geschrieben haben weiß ich aber da kam nicht gans so viel bei rum und das problem hab ich immer noch.
Wie is das eig mit dem USB IR-ADAPTER kann das vll das problem beheben.
Danke für antworten.

Valen
06.12.2009, 12:49
Ich vermute Isor hat nur die standart asuro teilen. In diesen Asuro atmega 8 chip sind die fuse-bits (bestimmte einstellungen fur den chip)schon fest einprogrammiert. Diesen fusebits ändern geht nicht ohne weitere hardware und ohne die bootloader(das was das program beim flashen im speicherplatz setst) zu verlieren.

Die timeouts entstehen ganz sicher durch die IR communication. Beim flashen gehen dort ganz mehr und schneller daten durch die luft, als dem beim selbtest mit einzelne zeichen ubersenden. Manchmal sind das störungen von bildschirm und Leuchtstofflampen. Oder die IR modul halt man etwas unruhig und falsch orientiert in dem hand. Eine genaue einstellung der trimmer ist auch fur dauer-sendung der daten sehr wichtig. Versucht mal mit den weisblat-test und hyperterminal ein zeichen continu uber zu senden (taster festhalten). Und dan genau so drehen and die poti bis kein fehler (oder sehr wenig mit langen zwischenpausen) zuruck kommen.

Den USB modul hat das letzte problem nicht, weil es mit ein sehr genaue feste frequenz angesteuert wird. Aber dazu muss man etwas mehr geld ausgeben.

Diesen probleme mit dem IR rs232 modul kommen haufig bei vielen Asuro benutzer vor. Fur weitere lösungen kann man einfach suchen im forum. Ist aber ein ganze menge mehr fragen als antworten.

isor
06.12.2009, 15:20
Also erst mal danke für deine Antwort hab grade den weisblat-test nochmal gemacht es kommen so gut wie keine Fehler beim dauer drücken einer taste und auch wenn ich das IR Modul ganz grade halten bleibt das Problem beim Flachen bestehen.
Meinst du wenn ich mir das USB Modul kaufe könnte das Problem behoben sein oder kann man das IR Modul irgendwie mit über Kabel mit dem asuro verbinden?
Und noch ne Frage kann man eig auch andere infrarot Schnittstellen nutzen z.B. ein die fest am Laptop ist?

Valen
06.12.2009, 15:47
Nein, Asuro benutz ein bestimmte trägerfrequenz fur die IR kommunication. Laptop IR schnitstellen arbeiten auf eine andere protocoll.

Auch mit kabel geht das nicht ohne aufwand. Die rs232 signalen werden den asuro electronic teilen kaput machen.

Wie hast du den rs232 modul eigentlich an deinem rechner verbunden? Direkt an einem seriellen port, oder uber einem rs232 wandler an einem usb port?

hai1991
06.12.2009, 16:01
hallo isor

1) so viel ich hier im forum gelesen haber gibt es mir dem USB Modul weniger bis keine probleme beim flashen

2) ich hab hier im forum schon gelesen, dass es möglichkeiten einer direkten verdrahtung gibt, kann aber selber nichts genaueres dazu sagen

3) bei den IR-Schnittstellen des laptops, o.ä. gibt es probleme mit den verwendeten frequenzen. d.h. beim asuro wird zum übertragen der signale eine frequenz von 38Hz verwendet (wenn ich mich nicht irre) und bei den schnittstellen anderer geräte wird eine andere frequenz verwendet


und nu noch kurz etwas zum weißblatt-test. als ich das oti eingestellt habe ist mir aufgefallen, dass es sein kann, dass die übertragung bei einigen tasten ohne fehler funktionierte, bei einigen anderen aber die fehlerquote über 50% lag. nach einiger zeit fand ich heraus, dass alle zeichen funktionieren, wenn ich das poti bei gedrücktem U (wichtig, das große U)

Valen
06.12.2009, 16:16
hallo isor

...d.h. beim asuro wird zum übertragen der signale eine frequenz von 38Hz verwendet (wenn ich mich nicht irre) und bei den schnittstellen anderer geräte wird eine andere frequenz verwendet.Asuro braucht 36KHz. Laptop IR braucht einer viel höhere frequenz.

hai1991
06.12.2009, 19:59
@ Valen: danke für die korrektur, ich war mir nicht mehr sicher

isor
06.12.2009, 21:08
hey ho
danke für eure antworten.
Ich hab das rs232 modul über einem rs232 wandler an einem usb port angeschlossen aber macht das einen Unterschied?
Hab das grade mit dem weißblatt-test noch mal gemacht großes U geht und auch sonst alle andre Buchstaben egal ob groß oder klein.
Problem bleibt leider weiterhin bestehend.
Das mit der Verdrahtung werde ich mir morgen mal genauer angucken
wen irgendwer was genaues darüber wies bitte melden!

Osser
07.12.2009, 10:51
Hi isor,


probier mal AsuroFlash (http://www.secius.com/AsuroFlash/download/AFSetup_1_7_11_102.exe), evtl. geht's damit.
Das mitgelieferte Flashtool hat ein paar Bugs was Timeouts betrifft die in meiner Version nicht auftreten, kann Dir aber nicht garantieren das es daran liegt.
Ein Tutorial zur Benutzung von AF findest Du auf dieser seite How to build and flash a file (http://www.secius.com/AsuroFlash/tutorial-movies)


Gruss,

O.

isor
07.12.2009, 16:39
hi Osser
das Programm sieht echtgeil aus besser als das was dabei war aber wen ich das Project Kompilieren will kommt folgende Fehler Meldung:


>Session Environment Variables:
AF_AVRDIR=D:\WinAVR
AF_PROJECT=AsuroTest
AF_SOURCE_FILES=test.c asuro.c
AF_ASM_SRC_FILES=
AF_PRGDIR=C:\Program Files\AsuroFlash
AF_PRJDIR=C:\Users\Patrick\Desktop\TestAsuroProjek t
AF_ASURO_LIB_PATH=%AllUsersProfile%\AsuroFlash\asu ro-lib\lib
File test.c saved.
File asuro.c saved.
File asuro.h saved.
>Default make_all.cmd file created.
>Default makefile created.
Make
C:\Users\Patrick\Desktop\TestAsuroProjekt>C:\WinAVR\utils\bin\make.exe all
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst -IC:\Program Files\AsuroFlash\include asuro.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > asuro.d; \
[ -s asuro.d ] || rm -f asuro.d
avr-gcc.exe: FilesAsuroFlashinclude: No such file or directory
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst -IC:\Program Files\AsuroFlash\include test.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \
[ -s test.d ] || rm -f test.d
avr-gcc.exe: FilesAsuroFlashinclude: No such file or directory
-------- begin --------
avr-gcc --version
avr-gcc (GCC) 3.3.1
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst -IC:\Program Files\AsuroFlash\include test.c -o test.o
avr-gcc: cannot specify -o with -c or -S and multiple compilations
make.exe: *** [test.o] Error 1


ExitCode 2
>Ready
Danke für eure hilfe.

isor
07.12.2009, 17:43
So hab grade mal versucht eine schon erstelte .hex datei zu flachen dabei kam dieser Fehler:

Flashing file C:\ProgramData\AsuroFlash\Projects\AsuroLibTest\As uroLibTest.hex
Open: COM4
Building RAM... Bulding RAM OK
Start Page 0 End Page 13 will occupy 848Bytes
Try connecting ASURO -- Switch on ASURO now!..................OK !
Flashing Firmware
Sending Page 0 of 13 CRC 31901c;
* Try 2/10;c;
* Try 3/10;c;
* Try 4/10;c;
* Try 5/10;v;
* Try 6/10;v;
* Try 7/10;v;
* Try 8/10;c;
* Try 9/10;c;
* Try 10/10;c;
ERRORS 7 CRC Fault(s), 3 Errors, 0 Invalid handshake(s), 0 Timeouts
ASURO RETURNED MEMORY ERRORS!
Flash memory damaged!! (>10000 access cycles?)
ASURO dead ?!?! (Firmware damaged try again!)

Osser
08.12.2009, 07:45
Hi isor,

1) Compilierung
Du benutzt Vista und Dein Compiler ist Steinalt!
Deine Version ist "avr-gcc (GCC) 3.3.1"
Meine ist "avr-gcc (WinAVR 20090313) 4.3.2"
Installier mal bitte einen neuen WinAVR, da ist dann auch der "Vista BUG" gelöst.

2) Flashversuch
Du bekommst "v" als Meldung vom Asuro zurück, was bedeutet dass der Asuro findet dass die Spannung zu niedrig ist ==> mal neue volle Batterien oder Akkus einsetzen und nochmal probieren.

Benutzt Du Akkus oder Batterien?

Gruss,

O.

Ceos
08.12.2009, 08:52
v heisst aber verify error oder hab ic da was falsches gelesen ?!
d.h. er konnte entweder den geschriebenen code nicht vreifizierren (controller defekt, aber unwahrscheinlich) oder bei der übertragung ist murks passiert (fremdlicht oder schlecht eingestellt)

versuch doch mal beim aufspielen ein klein wenig am poti zu stellen, manchmal klappt es mit dem flashen dann besser

und auf jeden fall solltest du jedes künstliche fremdlicht und direkte sonneneinstrahlung zu vermeiden

PS das große U entspricht der bitreihenfolge 01010101, daher wird es damit wohl am besten gehen

isor
08.12.2009, 14:29
hey ho
also ich benutze win7
und das Problem mit dem kompilieren bleibt auch bei der neuen Version von WinAVR bestehen.
ich habe das flashen mit vollen Batterien und vollen Akkus (mit Jumper)
versucht.
Wenn das v heist das die Spannung zu niedrige ist wo soll ich messen um zu gucken wo Spannung verloren geht?
und macht es eig. einen unterschied ob ich den rs232 an einem usb zu seriellen Wandler angeschlossen haben?
Wie gesagt bin Elektrotechnik mäßig nen ziemlicher Anfänger.

Ceos
08.12.2009, 14:38
ja das mit dem wandler kann ein problem sein, da diese meist über die entsprechenden pins zu wenig spannung für den betrieb des tranceiver liefern

die USB variante des transceiver würde sich an dieser stelle für dich anbieten, der muss auch nicht eingestellt werden, der funktioniert eigentlich immer!

radbruch
08.12.2009, 15:13
Hallo

"verify error" bedeutet, der Mega8 schafft es nicht, die Daten korrekt in sein Flash zu schreiben:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=21223

Und das sagt ja auch das Flashtool:

ASURO RETURNED MEMORY ERRORS!
Flash memory damaged!! (>10000 access cycles?)


Ein neuer Mega8 mit Bootloader kostet beim C 8€:
http://conrad.de/goto.php?artikel=191359

Gruß

mic

Ceos
08.12.2009, 15:24
nein es muss nicht gleich ein neuer chip sein, wenn er denn nciht mehr als 10000 mal beschrieben wurde natürlich ^^

es kann acuh sein, dass der empfänger zusammenbricht und keine vernünftigen daten mehr empfängt während des übertragen oder von aussen her fehler beim übertragen eigestreut werden, schließe wenn möglich erstmal fremdlicht und probleme mit dem USB-seriell wandler aus, dann evtl. nen neuen controller, vll. aber vorher den USB transceiver

radbruch
08.12.2009, 15:36
Hallo

Laut Doku werden Übertragungsfehler mit "c" oder "t" gemeldet, "c" bedeutet dabei Prüfsummenfehler, "t" steht für keine Antwort. Wenn die Daten korrekt empfangen wurden, aber nicht fehlerfrei ins Flash geschrieben werden können, sendet der asuro ein "v". Leider :(


8.4. Flash Fehler
Folgende Fehler können während des Flashens auftreten:


• “c” � Checksum Error. Es sind andere als die vom PC geschickten Daten bei ASURO angekommen.
Das kann durch Störlicht (wie Leuchtstoff ampen) kurze Unterbrechungen in der
Sichtverbindung oder ähnliches passieren.
• “t” � Timeout. Die Sichtverbindung zu ASURO ist abgerissen.
* “v” � Verify Error. ASURO hat falsche Daten in seinen Flashspeicher geschrieben. Das sollte
normalerweise nicht passieren und ist ein Zeichen dafür, dass der nichtf üchtige Programmspeicher
(Flash-EPROM) das Ende seiner Lebenszeit erreicht hat, was typischerweise erst nach 10.000
Programmierungen passiert.
Es wird bis zu zehnmal versucht den Fehler zu beheben. Gelingt dies nicht, wird der Flashvorgang
abgebrochen.(Aus dem Manual Seite 54)

Defekte Kontroller sind sehr selten:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=30312
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=288268#288268

Grundsätzlich könnte man auch einen jungfräulichen ATMega8 mit einem Bootloader programmieren. Aber der Aufwand und die Zeit, die man als ungeübter ISP-Neuling investieren muss, steht in keinem Verhältniss zur Ersparniss. Vor allem wenn man sicherheitshalber gleich mehrere leere Kontroller besorgt:
http://home.kpn.nl/winko001/Asuro/Bootloader/AsuBtlPagFrm.htm

Gruß

mic

isor
08.12.2009, 15:54
hey danke für eure antworten werde mit jetzt wohl erstmal nen neuen Asuro Prozessor kaufen und mal gucken obs dan funktionirt aber an dem sache mit zuwenig Spannung oder so liegt das nicht oder?

Osser
09.12.2009, 07:45
Hi isor,

hab da wohl auf die Schnelle "v" und "vl" verwechselt, sorry.
Schau Dir den folgenden Artikel mal an, da hab ich eine Lösung gepostet um die Übertragung auf der RS232-Dongle Seite zu verbessern Flashen: Connect to ASURO --> Timeout ! (https://www.roboternetz.de/phpBB2/viewtopic.php?p=413484#413484)

Vielleicht hilft Dir das weiter, da ich eigentlich nicht glaube, dass das Flash hinüber ist. Das würde nämlich bedeuten, dass Du z.B. ca. 1 Jahr lang jeden Tag 27 mal pro Tag geflasht hast, was ich bezweifle ;)

Mein RS232 Dongle hat am Anfang auch nicht vernünftig funktioniert, nach dem Einbau des Kondensators und dem einkleben von schwarzem Papier zwichen IR-Diode und IR-Empfänger beim Asuro und dem RS232-Dongle ging die Übertragung einwandfrei.


Gruss,

O.

isor
09.12.2009, 19:21
hey also hab beides gemacht das mit dem Papier und auch das mit dem 100µF Kondensator leider ohne Erfolg werd mit nen neuen Flash kaufen und mal bei nen alten Rechner den echten seriellen Port probieren wenn es dann nicht funktioniert hol ich mir das USB Modul.
Wenn sonst noch jemand ne idea hat immer her damit.^^

021aet04
09.12.2009, 19:46
Den Flash kannst du nicht extra kaufen. Du musst den gesamten µC kaufen. Achte darauf dass der Bootloader drauf ist (ErsatzµC für Asuro)


MfG Hannes

isor
10.12.2009, 13:12
jojo und
Danke euch allen

isor
19.12.2009, 16:17
Hey wollte mich nur noch mal für eure Hilfe bedanken.
hab mir nen neuen Prozessor gekauft und alles läuft wunderbar.
DANKE!

021aet04
19.12.2009, 16:24
Schön, wenn jetzt alles funktioniert.

MfG Hanne

isor
19.12.2009, 18:08
hey könntet ihr mir vll doch noch ma helfen ich habe folgenden code auf denn asuro geflasht aber die startusled zeigt die ganse zeit grünn an und die backleds leuchten auch
was mach ich jetzt schon wider falsch??


#include "asuro.h"
int main(void) {
Init();
while(1){
BackLED(OFF,OFF);
StatusLED(RED);
Sleep(500);
StatusLED(GREEN);
Sleep(500);
StatusLED(OFF);
};
return 0;
}

Valen
19.12.2009, 19:09
Dan ist das falsche hex file gewählt beim flashen. Oder das obene program ist nie richtig compiliert. (ein falsche pfad oder du hast es nicht gespeichert vordem du make ausfuhrt) Grünne statusled und backleds sieht aus Asuro hat das Firsttry program drin. Dein program ansich ist prima. Versuch es nochmal aber poste bitte den text ausgabe von dem make/compiler program.

isor
19.12.2009, 19:36
hier is der text

>Session Environment Variables:
AF_AVRDIR=C:\WinAVR_20071221
AF_PROJECT=testproject
AF_SOURCE_FILES=test.c asuro.c
AF_ASM_SRC_FILES=
AF_PRGDIR=C:\AsuroFlash
AF_PRJDIR=C:\Users\Patrick\Desktop\Neuer Ordner
AF_ASURO_LIB_PATH=%AllUsersProfile%\asuro_lib\lib
File test.c saved.
File asuro.h saved.
File asuro.c saved.
>Default make_all.cmd file created.
>Default makefile created.
Make
C:\Users\Patrick\Desktop\Neuer Ordner>C:\WinAVR_20071221\utils\bin\make.exe all
set -e; avr-gcc -MM -mmcu=atmega32 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst -IC:\AsuroFlash\include asuro.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > asuro.d; \
[ -s asuro.d ] || rm -f asuro.d
set -e; avr-gcc -MM -mmcu=atmega32 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst -IC:\AsuroFlash\include test.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \
[ -s test.d ] || rm -f test.d
-------- begin --------
avr-gcc --version
avr-gcc (WinAVR 20090313) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Size before:
testproject.elf :
section size addr
.text 1840 0
.data 88 8388704
.bss 1 8388792
.debug_aranges 64 0
.debug_pubnames 263 0
.debug_info 1080 0
.debug_abbrev 421 0
.debug_line 1182 0
.debug_frame 288 0
.debug_str 382 0
.debug_loc 388 0
Total 5997


avr-gcc -c -mmcu=atmega32 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst -IC:\AsuroFlash\include test.c -o test.o
In file included from asuro.h:34,
from test.c:32:
c:/winavr_20071221/lib/gcc/../../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. Use <avr/interrupt.h>."
test.c: In function 'main':
test.c:40: warning: large integer implicitly truncated to unsigned type
test.c:42: warning: large integer implicitly truncated to unsigned type
avr-gcc -c -mmcu=atmega32 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst -IC:\AsuroFlash\include asuro.c -o asuro.o
In file included from asuro.h:34,
from asuro.c:29:
c:/winavr_20071221/lib/gcc/../../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. Use <avr/interrupt.h>."
avr-gcc -mmcu=atmega32 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.o -IC:\AsuroFlash\include test.o asuro.o --output testproject.elf -Wl,-Map=testproject.map,--cref -IC:\AsuroFlash\lib -lm
avr-objcopy -O ihex -R .eeprom testproject.elf testproject.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O ihex testproject.elf testproject.eep
c:\WinAVR_20071221\bin\avr-objcopy.exe: --change-section-lma .eeprom=0x00000000 never used
avr-objdump -h -S testproject.elf > testproject.lss
Size after:
testproject.elf :
section size addr
.text 1806 0
.bss 1 8388704
.debug_aranges 64 0
.debug_pubnames 263 0
.debug_info 1060 0
.debug_abbrev 401 0
.debug_line 1182 0
.debug_frame 288 0
.debug_str 376 0
.debug_loc 388 0
Total 5829


Errors: none
-------- end --------


ExitCode 0
>Ready.
C:\Users\Patrick\Desktop\Neuer Ordner\testproject.hex
is set as default flash file.
Use program button to flash it to hardware.

radbruch
19.12.2009, 19:49
Hallo

Hauptfehler: Sleep(500);

Sleep() erwartet einen Byte-Parameter zwischen 0 und 255. In asuro.c sollte #include <signal.h> durch #include <interrupt.h> ersetzt werden weil signal.h veraltet ist.

Code für eine Sekunde Pause:

int i;
for(i=0; i<1000; i++) Sleep(72); // Sleep(72) dauert eine Millisekunde

Gruß

mic

isor
19.12.2009, 20:13
okay danke jetzt gehts

isor
19.12.2009, 22:17
hey noch mal ne frage wies einer ob oder wo es eine Referenz Liste für den asuro gib mit Parametern

radbruch
19.12.2009, 22:59
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=43979

isor
20.12.2009, 10:22
danke schön :)

isor
20.12.2009, 21:37
hey ho ich hab da noch ma so nenn Problem hoffentlich könnt ihr mir weiter helfen also ich wollte nenn Programm schreiben das guckt ob es eine Kollision gibt aber es funktioniert nicht so ganz.
also wenn ich das was jetzt aus kommentiert ist hin schreibe und die Funktion motorFWD aus kommentiere dann funktionieren die Tasten alle aber sonst fährt er die ganze Zeit nach vorne.
wo ist mein Fehler?


#include "asuro.h"

int main(void)
{
Init();
int i;
MotorSpeed(0,0);
MotorDir(FWD,FWD);

while(1)
{


unsigned char sw;
//MotorDir(FWD,FWD);
//MotorSpeed(0,0);
sw = PollSwitch();
StatusLED(OFF);
FrontLED(OFF);
BackLED(OFF,OFF);


if (sw & 0x01)
Back();
else if (sw & 0x02)
Back();
else if (sw & 0x04)
Back();
else if (sw & 0x08)
Back();
else if (sw & 0x10)
Back();
else if (sw & 0x20)
Back();

MotorFWD();
}
return 0;
}

void MotorFWD()
{
MotorDir(FWD,FWD);
MotorSpeed(120,120);
FrontLED(ON);
return 0;
}

void Turn (void)
{
MotorDir(FWD,RWD);
MotorSpeed(120,120);
BackLED(ON,ON);
StatusLED(RED);
FrontLED(ON);
pSleep(350);

return 0;
}
void Back (void)
{
MotorDir(RWD,RWD);
MotorSpeed(120,120);
BackLED(ON,ON);
StatusLED(GREEN);
FrontLED(ON);
pSleep(500);

Turn();
return 0;
}

void pSleep(int p)
{
int i;
for(i=0;i<=p;i++) { Sleep(72); }
return 0;
}

Valen
20.12.2009, 22:10
Ich verstehe deine problem beschreibung nicht.

Was macht er mit das obene program. Und was macht er mit MotorFWD auskommentiert und MotorDir und MotorSpeed wieder eingestellt.

Auserdem söllte die
unsigned char sw; nicht (in diesen fall) im inneren der While-schleife stehen. Variabelen sind nur gultig zwischen der gleich daneben stehenden {} klammern. In dein program wird sw jede schleife durchlauf wieder auf neu deklariert. Ich denke nicht das es die ursache ist deiner problem. Aber schön ist es nicht.

Die ganze if-statement kan man auch einkurzen wen er das selbe reagieren mus auf die taster:

if (sw & 0x3F) /* irgend einer taster? */
Back();
else MotorFWD();

Die tastertest mit PollSwitch ist aber empfindlich fur störung von den motoren. Ein einfache lösung ist mehrfach die PollSwitch abfragen, und nur darauf reagieren wan der wert stabiel ist.


sw = PollSwitch();
if (sw==PollSwitch()) && (sw & 0x3F) Back(); /* Auwa, meine nase tut wirklich weh! Doppelt gechecked. */
else MotorFWD();
...

isor
21.12.2009, 19:05
Hey danke für deine Hilfe hab das Programm noch mal nenn bisschen umgeändert und das mit dem PollSwitch geändert jetzt funktioniert es.

radbruch
21.12.2009, 19:13
Hallo

Schön, dass es nun funktioniert. Könntest du uns noch die aktuelle Version deines Programms zeigen?

Gruß

mic

isor
21.12.2009, 19:41
Natürlich vll hat ja jemand noch eine Verbesserung Vorschlag dafür.
Ich arbeite grade schon an der Odometrie.



int main(void)
{
Init();
MotorSpeed(0,0);
MotorDir(FWD,FWD);
unsigned char sw;
MotorFWD();

while(1)
{

sw = PollSwitch();

if (sw==PollSwitch() && (sw & 0x3F)) { Back(); }
else { MotorFWD(); }

}
return 0;
}


void MotorFWD(void)
{
MotorDir(FWD,FWD);
MotorSpeed(120,120);
FrontLED(ON);
return 0;
}

void Turn (void)
{
MotorDir(FWD,RWD);
MotorSpeed(120,120);
pSleep(350);
StatusLED(OFF);
FrontLED(OFF);
BackLED(OFF,OFF);
return 0;
}

void Back (void)
{

MotorDir(RWD,RWD);
MotorSpeed(120,120);
BackLED(ON,ON);
StatusLED(GREEN);
FrontLED(ON);
pSleep(500);

Turn();
return 0;
}

void pSleep(int p)
{
int i;
for(i=0;i<=p;i++) { Sleep(72); }
return 0;
}

Valen
21.12.2009, 21:33
Ich arbeite grade schon an der Odometrie.Achte darauf das odometrie nicht gleichzeitig benutzt werden kan mit leuchten von den backleds. Die odometriescheiben beleuchtung geht dan aus und die swärz/weiss ubergangen werden dan möglich niet richtig erkannt.

isor
23.12.2009, 11:54
hey junges ihr könnt mir doch garantiert helfen, also wie bereits beschrieben versuche ich mich grade an Odometrie.
dazu hab ich mir nenn Quellcode aus dem netzt geholt, der funktioniert auch aber wenn ich denn so veränder das ich den als extra Funktion verwenden kann (func Drehzahl) fährt der asuro nicht mehr grade aus sonder so wie immer im Kreis.
Ich hätte den Quellcode auch eig. lieber ohne globale variablen aber ich weis nicht mehr wie man 2 Werte aus einer Funktion zurück gibt, also wen das schon mal jemand weiß würde ich mich auch schon freuen.
ich hoffe ihr könnt mir weiter helfen.^^

Quellcode aus dem netzt:


#include "asuro.h"
// Schwellwert für die Hell/Dunkel-Unterscheidung
// Eventuell muss damit etwas variiert werden
#define TRIGGERLEVEL 600
#define HYSTERESIS 10
#define LOW 0
#define HIGH 1

int main(void)
{
int iSpeed = 120;
unsigned int data[2];
signed int status[2]={0,0};
signed int difference=0;
Init();
MotorDir(FWD, FWD);
while(1) {
// Helligkeitswerte der Lichtschranken auslesen
OdometrieData(data);
// Wechsel linker Sensor von niedrig auf hoch?
if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status[0]=HIGH;
difference++;
}
// Wechsel linker Sensor von hoch auf niedrig?
if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
}
// Wechsel rechter Sensor von niedrig auf hoch?
if ((status[1]==LOW) && (data[1]>TRIGGERLEVEL+HYSTERESIS)) {
status[1]=HIGH;
difference--;
}
// Wechsel rechter Sensor von hoch auf niedrig?
if ((status[1]==HIGH) && (data[1]<TRIGGERLEVEL-HYSTERESIS)) {
status[1]=LOW;
difference--;
}
// zur Sicherheit: verhindern, dass der Differenzz�ler
// den erlaubten Wertebereich verl�st
if (difference<-iSpeed) difference=-iSpeed;
if (difference>iSpeed) difference=iSpeed;

// Status-LED noch entsprechend der erkannten Segmente
// aufleuchten lassen, grn fr links, rot fr rechts
StatusLED(status[0]+status[1]*2);

// Z�ldifferenz passend auf die Motoren verteilen
if (difference>0) MotorSpeed(iSpeed-difference,iSpeed);
else MotorSpeed(iSpeed,iSpeed+difference);

}
return 0;
}
mein veränderter Quellcode:


#include "asuro.h"
#define TRIGGERLEVEL 600
#define HYSTERESIS 10
#define LOW 0
#define HIGH 1

int iaSpeed[2]={120,120};

int main()
{
BackLED(OFF,OFF);
Init();
while(1)
{
MotorFWD();
}
}

void MotorFWD(void)
{
MotorDir(FWD,FWD);
drehzahl(120,120);
MotorSpeed(iaSpeed[0],iaSpeed[1]);

FrontLED(ON);
return 0;
}

int drehzahl(int iSpeed_left,int iSpeed_right)
{
unsigned int data[2];
signed int status[2]={0,0};
signed int difference=0;

// Helligkeitswerte der Lichtschranken auslesen
OdometrieData(data);
// Wechsel linker Sensor von niedrig auf hoch?
if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status[0]=HIGH;
difference++;
}
// Wechsel linker Sensor von hoch auf niedrig?
if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
}
// Wechsel rechter Sensor von niedrig auf hoch?
if ((status[1]==LOW) && (data[1]>TRIGGERLEVEL+HYSTERESIS)) {
status[1]=HIGH;
difference--;
}
// Wechsel rechter Sensor von hoch auf niedrig?
if ((status[1]==HIGH) && (data[1]<TRIGGERLEVEL-HYSTERESIS)) {
status[1]=LOW;
difference--;
}
// zur Sicherheit: verhindern, dass der Differenzz�ler
// den erlaubten Wertebereich verl�st
if (difference<-255) difference=-255;
if (difference>255) difference=255;

// Status-LED noch entsprechend der erkannten Segmente
// aufleuchten lassen, grn fr links, rot fr rechts
//StatusLED(status[0]+status[1]*2);

// Z�ldifferenz passend auf die Motoren verteilen
if (difference>0) iSpeed_left-difference;
else iSpeed_right+difference;


iaSpeed[0] = iSpeed_left;
iaSpeed[1] = iSpeed_right;

return 0;
}

Valen
23.12.2009, 16:55
deine code:


// Z�ldifferenz passend auf die Motoren verteilen
if (difference>0) iSpeed_left-difference;
else iSpeed_right+difference;Hier passiert nichts! Dort wird nur eine summe/differenz gemacht. Aber die iSpeed_left und iSpeed_right variabelen werden damit nicht geändert.

Mache das mit:

iSpeed_left-=difference; /* nehm difference ab von iSpeed_left */
iSpeed_right+=difference; /* addiere difference zu iSpeed_right */

isor
24.12.2009, 11:06
jo danke hab ich ganz vergessen