PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfänger Frage zum Programmieren



Felix1988
25.04.2007, 15:53
Hallo ich habe den Asuro soweit jetzt zusammen gebaut und getestet es läuft alles so wie es sein soll, aber ich bin gerade dabei mir die Programmierung in c näher zu bringen. Und bin gerade bei dem Punkt "Schleifen". Mein problem bzw. meine Frage ist ich habe jetzt mal versucht das Programm was in der Anleitung steht zu übertragen und auf den Asuro zu Flashen aber er fährt nicht los so wie es glaube ich sein sollte oder? Hier ist der Auszug aus dem Programm:
#include "asuro.h"
int main(void){
int()
MotorDir(FWD,FWD);
MotorSpeed(120;120);
StatusLED(GREEN);
while (PollSwitch()==0){
SerWrite("Alles OK!\n",10);
}
MotorSpeed(0,0);
StatusLED(RED);
while (1){
SerWrite("Aua!\n",5);
}
}
Ich weiß nicht ob ich was falsch gemacht habe, oder geht das gar nicht mit dem " Programmers Notepad" doch oder?
Selbst wenn ich einfach Prgrammiere das die Status Led Geld leuchten soll keine Reaktion.

Vielleicht könnt Ihr mir helfen!

Vielen Dank im Vorraus

damaltor
25.04.2007, 17:20
nicht int() sondern Init();

bitte benutze den code button um code zu posten. dann gibts diese hübsche kleine box...

HermannSW
25.04.2007, 17:31
Hallo,

...
Mein problem bzw. meine Frage ist ich habe jetzt mal versucht das Programm was in der Anleitung steht zu übertragen und auf den Asuro zu Flashen aber er fährt nicht los so wie es glaube ich sein sollte oder? Hier ist der Auszug aus dem Programm:
#include "asuro.h"
int main(void){
3: int()
MotorDir(FWD,FWD);
5: MotorSpeed(120;120);
...
8: SerWrite("Alles OK!\n",10);
...
13: SerWrite("Aua!\n",5);
...
}
Ich weiß nicht ob ich was falsch gemacht habe, oder geht das gar nicht mit dem " Programmers Notepad" doch oder?
...das Programm hat Syntax-Fehler in Zeilen 3 und 5, das dürftest Du so nicht übersetzt gekriegt haben:

C:\ASURO_src\AsuroLib\work\Simple1>make
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -I../../lib/inc -funsigned-char -fu
nsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahl
ms=test.lst 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.exe (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.

Size before:
test.elf :
section size addr
.text 1956 0
.data 22 8388704
.bss 21 8388726
.noinit 0 8388747
.eeprom 0 8454144
.stab 8040 0
.stabstr 3174 0
Total 13213


avr-gcc -c -mmcu=atmega8 -I. -g -Os -I../../lib/inc -funsigned-char -funsigned-b
itfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.l
st test.c -o test.o
test.c: In function `main':
test.c:3: error: parse error before ')' token
test.c:5: error: parse error before ';' token
make: *** [test.o] Error 1

In Zeile 3 sollte es Init(); heißen, anstelle von int(), und in Zeile 5 müssen die Argumente von MotorSpeed() mit Komma getrennt sein.
In Zeilen 8 und 13 solltest Du besser \r\n anstelle von \n nehmen, da Du sicher nicht nur eine Zeile nach unten, sondern zum nächsten Zeilenanfang im (Hyper)Terminal möchtest.
Hier der korrigierte Quelltext, Du solltest Quelltext mit [ code ][ / code ] einrahmen:

#include "asuro.h"
int main(void){
Init();
MotorDir(FWD,FWD);
MotorSpeed(120,120);
StatusLED(GREEN);
while (PollSwitch()==0){
SerWrite("Alles OK!\r\n",11);
}
MotorSpeed(0,0);
StatusLED(RED);
while (1){
SerWrite("Aua!\r\n",6);
}
}

Felix1988
26.04.2007, 15:07
Hallo danke dafür, die Fehler hätte ich eigentlich auch finden können aber es scheint immer noch ein fehler zu sein ich habe dein korrigiertes Programm eingefügt und geflasht aber es ist das gleiche wie vorher er bewegt sich kein Stück oder muss man da erst noch irgendwo drauf drücken das er los fährt?
Felix

damaltor
26.04.2007, 16:08
füg mal hinter init()

Msleep(1000);

ein. der asuro müsste dann nach ca einer sekunde losfahren. so wird verhindert, dass die pollswitch-abfrage schon zu beginn danebengreift.

halt mal den transceiver drüber. was "sagt" der asuro?

Felix1988
26.04.2007, 19:08
Du meinst sagen im Hyper Terminal? das sagt er gar nichts :-(

HermannSW
26.04.2007, 20:10
Hi,

Du meinst sagen im Hyper Terminal? das sagt er gar nichts :-(... da sollte er aber was sagen, zuerst immer "Alles OK!", und danach immer "Aua!" ... :)

Hier der Output bei mir, fährt bis Tasteranschlag, dann stoppt er und gib endlos "Aua!" aus:

Alles OK!
Alles OK!
Alles OK!
Aua!
Aua!
Aua!
Aua!
Aua!
Aua!
Aua!
Aua!
Aua!
Aua!
Aua!


Anbei mein Hexfile zum Vergleich und/oder Flashen.

damaltor
27.04.2007, 01:35
bist du sicher dass du das richtige file editiert, gespeichert, kompiliert undgeflasht hast? er muss mit dir reden, das ist sicher...

Felix1988
27.04.2007, 14:55
@HermannSW
Hallo also ich habe dein Programm geflasht und es hat funktioniert, wie kann ich mir den dein Programm anschauen? Was habe ich falsch gemacht? Im Programmers Notepad habe ich die "test.c" datei geladen und habe ich immer mit dem Tool "clean" alles "gecleant" und dann wenn ich mit dem Programm fertig war habe ich das Tool "make" benutzt und dann habe ich die entstandene Hex datei im Flash programm ausgewählt und geflasht. Oder habe ich einen fehler da gemacht?
Vielen dank im Vorraus!
Felix

damaltor
27.04.2007, 18:52
du musst zuerst abspeichern, sonst wird eine leere hex-datei erstellt. das passiert mir bis heute gelegentlich mal...

Felix1988
27.04.2007, 20:36
Ja abgespeichert habe ich es und was muss ich dann machen?
Weil wenn ich es ins Programma Notepad einfüge kommt immer:
:1000000012C02BC079C029C0A8C127C026C025C0F6
:1000100024C023C022C021C020C01FC084C01DC076
:100020001CC01BC01AC011241FBECFE5D4E0DEBF28
:10003000CDBF10E0A0E6B0E0E4EAF7E002C0059032
:100040000D92A837B107D9F710E0A8E7B0E001C0DA
:100050001D92AD38B107E1F701C0D2CFCFE5D4E0B2
:10006000DEBFCDBF1AD060E2862FE1D168E7862FD0
:10007000D6D181E0B7D104C06BE080E690E0D0D269
:1000800048D28823C9F360E0862FC9D182E0AAD183
:1000900066E08CE690E0C4D2FBCF10927A0089E74C
:1000A00085BD81E983BD89B7806489BF1BB81AB853
:1000B00096E890BD8FEC89B98FE387BB84EF81BB55
:1000C00081EA8FBD82E08EBD96B9979880E09CD181
:1000D00061E0862F73D160E0862F70D181E082D1FC
:1000E00060E2862FA4D160E0862F99D11092830020
:1000F00010928200789408951F920F920FB60F927B
:1001000011248F939F9381E090E0909381008093DE
:1001100080008BB78F778BBF9F918F910F900FBE11
:100120000F901F9018951F920F920FB60F921124E7
:100130002F933F934F938F939F93AF93BF93EF93DF
:10014000FF938091820090918300892B09F445C030
:1001500040917700E42FFF27ED58FF4F85B1808352
:10016000442311F080E601C081E687B9242F3327AC
:10017000F901ED58FF4F80818C3888F4D901AB58D4
:10018000BF4F8C91813059F4F901E20FF31FEC5706
:10019000FF4F808191810196808391831C92242F4F
:1001A0003327F901ED58FF4F8081813A90F0D90152
:1001B000AB58BF4F8C91882361F4F901E20FF31F14
:1001C000EC57FF4F8081918101968083918381E07C
:1001D0008C9381E0482740937700FF91EF91BF9186
:1001E000AF919F918F914F913F912F910F900FBEA3


....

HermannSW
27.04.2007, 21:24
Hallo,

Ja abgespeichert habe ich es und was muss ich dann machen?
Weil wenn ich es ins Programma Notepad einfüge kommt immer:
:1000000012C02BC079C029C0A8C127C026C025C0F6
:1000100024C023C022C021C020C01FC084C01DC076
:100020001CC01BC01AC011241FBECFE5D4E0DEBF28
:10003000CDBF10E0A0E6B0E0E4EAF7E002C0059032
:100040000D92A837B107D9F710E0A8E7B0E001C0DA
:100050001D92AD38B107E1F701C0D2CFCFE5D4E0B2
:10006000DEBFCDBF1AD060E2862FE1D168E7862FD0
:10007000D6D181E0B7D104C06BE080E690E0D0D269
:1000800048D28823C9F360E0862FC9D182E0AAD183
:1000900066E08CE690E0C4D2FBCF10927A0089E74C
:1000A00085BD81E983BD89B7806489BF1BB81AB853
:1000B00096E890BD8FEC89B98FE387BB84EF81BB55
:1000C00081EA8FBD82E08EBD96B9979880E09CD181
:1000D00061E0862F73D160E0862F70D181E082D1FC
:1000E00060E2862FA4D160E0862F99D11092830020
:1000F00010928200789408951F920F920FB60F927B
:1001000011248F939F9381E090E0909381008093DE
:1001100080008BB78F778BBF9F918F910F900FBE11
:100120000F901F9018951F920F920FB60F921124E7
:100130002F933F934F938F939F93AF93BF93EF93DF
:10014000FF938091820090918300892B09F445C030
:1001500040917700E42FFF27ED58FF4F85B1808352
:10016000442311F080E601C081E687B9242F3327AC
:10017000F901ED58FF4F80818C3888F4D901AB58D4
:10018000BF4F8C91813059F4F901E20FF31FEC5706
:10019000FF4F808191810196808391831C92242F4F
:1001A0003327F901ED58FF4F8081813A90F0D90152
:1001B000AB58BF4F8C91882361F4F901E20FF31F14
:1001C000EC57FF4F8081918101968083918381E07C
:1001D0008C9381E0482740937700FF91EF91BF9186
:1001E000AF919F918F914F913F912F910F900FBEA3


....Du mußt in test.c den Quelltext von weiter oben abspeichern (hier nochmal):
#include "asuro.h"
int main(void){
Init();
MotorDir(FWD,FWD);
MotorSpeed(120,120);
StatusLED(GREEN);
while (PollSwitch()==0){
SerWrite("Alles OK!\r\n",11);
}
MotorSpeed(0,0);
StatusLED(RED);
while (1){
SerWrite("Aua!\r\n",6);
}
}


dann das Programm mit make im PN übersetzen, und sicherstellen, daß das make im PN auch die richtige Datei im richtigen Pfad übersetzt.

Überrüfen kannst Du es am einfachsten, wenn du erst ein clean im PN machst, und dann mit dem Windows-Explorer überprüfst, daß im Verzeichnis .../Firsttry genau 4 Dateien stehen (Makefile, test.c, und die beiden .bat-Files).

Nach einem make sollten dann viel mehr Dateien in diesem Ordner stehen insbesondere die Datei test.hex, welche Du dann auch mit dem Flashtool auf den Asuro bringen kannst (Pfad im Flashtool überprüfen!).

fotomarco
27.04.2007, 22:03
eine frage wo ist der code botton ? mit der box

fotomarco
27.04.2007, 22:25
was soll der asuro mit diesem program machen ?

Felix1988
27.04.2007, 22:36
Normalerweise soll er vorwärtsfahren und wenn er irgendwo gegnfährt anhalten! Nur mein problem ist das ich wissen will wie man die hex datei ins Programm Notepad kriegt in Form von einem Programm nicht so wie ich es oben geschrieben habe..

fotomarco
27.04.2007, 22:53
mir dreht er sich im kreis herum ,hast du die hex file geflasht,im notepad glaube ich musst du in c schreiben

Felix1988
27.04.2007, 22:53
@HermannSW
Kann ich denn nicht diese Zahlen irgendwie in ein Programm umwandeln mit Init Motorspeed etc.? Damit kann ich dann besser vergleichen woran der fehler liegt. Bei deinem Programm was du mir zum runterladen gegeben hast sind es 31 Datensätze die er flasht aber bei dem eigenen geschriebenen Programm von mir sind es nur 24!?

Bei mir stehen da 6 dateien die du gesagt hast und dann noch Asuro.c und .h
Also ich habe den Quelltext von dir jetzt kopiert und ins PN eingeügt und dann habe ich das Tool make benutzt und dann entsteht die hex Datei bin dann auf das Flash Programm gegeangen und habe es geflasht aber er bleibt immer noch stehen.
Felix

HermannSW
28.04.2007, 06:23
@HermannSW
Kann ich denn nicht diese Zahlen irgendwie in ein Programm umwandeln mit Init Motorspeed etc.? Damit kann ich dann besser vergleichen woran der fehler liegt. Bei deinem Programm was du mir zum runterladen gegeben hast sind es 31 Datensätze die er flasht aber bei dem eigenen geschriebenen Programm von mir sind es nur 24!?
...Überprüfe doch bitte mal Datum und Uhrzeit des Hexfiles, welches Du auf den Asuro flashst -- klingt so, also ob Du nicht das neu erzeugte Hexfile flashst.

Im Verzeichnis des neu erzeugten Hexfiles test.hex gibt es auch eine Datei test.lss; öffne diese im Editor, da kannst Du sehen, welches Programm im Hexfile ist (ist 'ne Mischung aus C-Befehlen und den daraus generierten Assembler statements ...).

fotomarco
28.04.2007, 08:41
woran kann das liegen dass mein asuro sich um sich herum dreht und nicht grade aus faehrt ,falsche polung der motoren ?

Felix1988
28.04.2007, 10:04
@HermannSW
Ich habe Datum überprüft und ist das neuste Datum, aber in dem Verzeichnis ist keine test.lss datei sondern nur test.lst ...
Und dann habe ich nochmal eine Frage wo sollte ich denn die hex file von dir reinkopieren? Und ich wollte mir die im PN anschauen als Progamm mit init... aber dann kommt da eben nur das was ich dir gestern Abend geschickt habe!
Vielen Dank im Vorraus
Felix

damaltor
28.04.2007, 11:59
hex-files sind kompiliert. den original-c-programmcode bekommst du daraus nicht wieder zurück. hex-dateien sind dazu da, um auf den asuro geflasht zu werden, und für nichts anderes. mit einem disassembler kann man sie in assemblercode zurückführen, aber das hilft dir leider nichts.

eine hex-datei im PN zu öffnen ist also quatsch... warum sollte man dann erst die getippten dateien zu hex umwandeln...

PN (test.c): quellcode
HEX (test.hex) kompiliertes programm in prozessorverständlicher sprache

die verschiedenen größen könnten an verschiedenen versionen der library liegen.

fotomarco: wenn dein asuro den selbsttest bestanden hat und zwar komplet fehlerfrei, wie du glaube ich mal geschrieben hast, dann liegt das wohl an deinem programmcode.

der code btton mit der box ist über dem texteingabefeld wo du deinen post eingibst.

alternativ kannst du auch deinen programmcode im post mit [code ] und [/code ] einrahmen, wobei du das leerzeichen vor der klammer weglassen musst.

fotomarco
28.04.2007, 16:49
danke dalmator ich dachte der selbstest war ok ,da er sich rechts und links drehte aber ,er war nicht ok jezt faehrt er gradeaus ich hatte ihn verpolt

damaltor
28.04.2007, 18:06
sehr gut =) na dann ist ja alles klar

Felix1988
29.04.2007, 16:48
Hallo also ich habe es jetzt hingekriget das er bei einem Programm fährt aber nur Rückwärts obwohl ich Vorwärts Programmiert habe woran kann das liegen?
Hier ist nochmal das Programm:
#include "asuro.h"
int main(void){
Init();
MotorDir(FWD,FWD);
MotorSpeed(120,120);
StatusLED(GREEN);
while (PollSwitch()==0){
SerWrite("Alles OK!\r\n",11);
}
MotorSpeed(0,0);
StatusLED(RED);
while (1){
SerWrite("Aua!\r\n",6);
}
}

damaltor
29.04.2007, 19:01
das ist einer der bekanntesten fehler des asuro... such mal nach "motor"und "richtung". du musst die beiden kabel an den beiden motoren vertauschen. leider st das bei vielen neuen asuros der fall.

Felix1988
29.04.2007, 19:16
Also meinst du das Kabel auf MR- auf MR+ und bei Ml genauso?

damaltor
29.04.2007, 19:21
ja genau. aber es ist DEUTLICH einfacher die kabel an den motoren zu tauschen, als auf der platine.

Felix1988
01.05.2007, 12:36
Jo das habe ich gemacht und jetzt FUnktioniert es.
Mittlerweile habe ich mein erstes Selbst geschrieben Programm erstellt und würde euch bitten mal rüber zu schauen weil es klappt nicht so ganz wie es soll! Vielen Dank im Vorraus!+

#include "asuro.h"

int main(void){
Init();
MotorDir(FWD,FWD); //Beide Motoren auf Vorwärts
MotoSpeed(200,200); //Bei Motoren mit ca dreivirtel Kraft vorraus
StatusLED(GREEN); //Status LED auf grün schalten

if (PollSwitch()>0); //wenn ein taster gedrückt wird
MotorSpeed(0,0); // Anhalten
StatusLED (RED); // Status LED auf Rot schlaten
MotorDir(RWD,BREAK); // Der Linke Motor auf rückwärts und der Rechte soll stehen bleiben
MotorSpeed(120,0); //Geschwindigkeit der Motoren
else {StatusLED(GREEN);} // Sonst Status LED auf grün schalten
MotorDir(FWD,FWD); // Beide Motoren auf vorwärts
MotorSpeed(200,200); // Motoren mit dreivirtel Karft vorraus
while (1); // Endlosschleife
return 0; // Ende
}

}


wahrscheinlich habe ich da eine Sache doppeltgemoppelt :-/
Vielen Dank
Felix

damaltor
01.05.2007, 19:19
hrhr... lies mal in der anleitung wie ein "if" auszusehen hat... du brauchst geschweifte klammern {}. dann sollte das gehen.

Felix1988
02.05.2007, 16:27
Um nochmal auf das selbstgeschriebene Programm von mir zurück zu kommen: Ich habe das Programm jetzt korrigiert aber er fährt so wie es jetzt ist gleich rückwärts obwohl der ASURO erst vorwärts fahren soll! Vielleicht könnt ihr mir dabei helfen. Hier ist das umgeschriebene Programm:
#include "asuro.h"

int main(void){
unsigned int i;

Init();
MotorDir(FWD,FWD); //Beide Motoren auf Vorwärts
MotorSpeed(200,200); //Bei Motoren mit ca dreivirtel Kraft vorraus
StatusLED(GREEN); //Status LED auf grün schalten
while(1){
if (PollSwitch()>0) //wenn ein taster gedrückt wird
{MotorSpeed(0,0); // Anhalten
for (i = 0; i < 847; i++){ //3 Sekunden warten
Sleep(255);}
StatusLED (RED); // Status LED auf Rot schlaten
MotorDir(RWD,BREAK); // Der Linke Motor auf rückwärts und der Rechte soll stehen bleiben
MotorSpeed(120,0); //Geschwindigkeit der Motoren
for (i = 0; i < 847; i++) // 3 Sekunden rückwärts fahren
Sleep(255);}

else
{StatusLED(GREEN); // Sonst Status LED auf grün schalten
MotorDir(FWD,FWD);
MotorSpeed(200,200);} // Motoren mit dreivirtel Karft vorraus
}
while (1); // Endlosschleife
return 0; // Ende
}


Hallo ich habe vor kurzem das Buch gekauft:"Mehr spaß mit ASURO Band 1
Und habe da mal ein paar Programmierungsaufgaben versucht zu lösen nur bei der einen komme ich nicht weiter:
Stopp am Abgrund Asuro soll mit maximaler Geschwindigtkeit vorwärtsfahren und anhalten wenn er auf ein schwarzes Papier trifft: Ich aheb dazu versucht das Prograqmm zu schreiben ist mir so halbwegs gelungen und habe mir die Lösung zu Rate gezogen und habe diese übernommen aber er zeigt mir einen Fehler an.
Hier ist das Programm:

#include "asuro.h"
#define STOP 200
int main(void)
{
unsigned int lineData[2];
unsigned char running = TRUE;
Init();
MotorDir(FWD,FWD);
MotorSpeed(255,255);
do {
LineData(lineData);
if ((lineData[0] < STOP) && (lineData[1] < STOP)) {
MotorSpeed(0,0);
BackLED(ON,ON);
15 running = false;
}
}
while (running);
while(1);
return 0;
}

zu Zeile 15 zeigt er diese Fehlermeldung an:

avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o
test.c: In function `main':
test.c:15: error: `true' undeclared (first use in this function)
test.c:15: error: (Each undeclared identifier is reported only once
test.c:15: error: for each function it appears in.)
make: *** [test.o] Error 1

> Process Exit Code: 2
vielleicht könnt ihr mir helfen woran der Fehler liegen könnte ich verstehe auch noch nicht so richtig was das heißt mir True und False (wahr und falsch) trotz lesen der Anleitung!
Vielleicht könnt ihr mir helfen
Vielen Dank im Vorraus
Felix

Nepi
02.05.2007, 16:47
Schreib das true einfach klein, dann sollte es klappen.

Felix1988
02.05.2007, 20:04
ne das Funktioniert nicht

damaltor
02.05.2007, 20:36
in einem unsigned char kann kein "true" oder "false" gespeichert werden. ein unsigned char ist ein einzelner buchstabe oder eine zahl zwischen 0 und 255.

du kannst also zB 0 und 1 speichern, dann sollte das programm funktionieren. ersetze alle "true" durch 1 und alle "false" durch 0.

alternative: die variable zum speichern eines wahrheitswertes (die glaube ich GROß geschreiben werden muss) heisst entweder bool oder boolean, bin mir nicht ganz sicher. sollte allerdings mit 0 und 1 einfacher gehen.

in deinem ersten programm: fährt er mit beiden rädern rückwärts? oder nur mit einem rad?

Felix1988
04.05.2007, 15:03
Also das Programm aus dem Buch funktioniert jetzt danke dafür.
Beim meinem selbstgeschriebenem Programm bleibt er kurz Stehen und fährt nur mit einem Rad rückwärts !

damaltor
04.05.2007, 16:07
das könnte am fehlerbehafteten pollswitch liegen. tu mal direkt vor PollSwitch() folgendes:

Sleep(216);

das hilft evtl etwas.

radbruch
04.05.2007, 16:19
Ich glaube, true und false sind einfach nirgends definiert. Ich verwende eine solche Konstruktion:

char flag;

flag=(1==1); // flag wird true
flag=(1==0); // falg wird false
flag=(!flag); // flag wieder true :)

Könnte wohl auch mit

define true (1==1)
define false (1==0)

funktionieren. Muss ich mal testen bei Gelegenheit. Booleans sind bei Abfragen eleganter und fehlerunanfälliger als Bytes, belegen aber vermutlich den selben Speicherplatz.

damaltor
04.05.2007, 17:19
ich meinte das erste programm in seinen post...

Felix1988
04.05.2007, 18:07
Ne das klappt auch nicht, ist das gleiche Problem wie vorher! :-(
Wobei am Anfang zuckt er kurz nach vorne und dann fährt er automatisch mit dem Linken Motor rückwärts ohne das ich einen taster betätigt habe.
Und mir ist auf gefallen das er eine Fehlermeldung noch Anzeigt, die scheinbar aber nicht so wichtig scheint da man das Programm trotzdem falshen kann! Hier ist die Meldung:

avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o
test.c:28:12: warning: no newline at end of file
avr-gcc -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.o test.o asuro.o --output test.elf -Wl,-Map=test.map,--cref -lm
avr-objcopy -O ihex -R .eeprom test.elf test.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \

damaltor
04.05.2007, 18:18
ok... dann such mal im forum nach taster und asuro... da gibts tausende möglichkeiten =)

leider ist die tasterabfrage sehr haperig, und es werden oft fehleingaben registriert. es gibt viele unterschiedliche lösungsansätze (fehlerkorrigierende programmierung, entfernung des kondensators c7, veränderung der widerstände, anpassung der asuro.c...)

Felix1988
08.05.2007, 15:14
Hallo
Das es mit den tastern tausend möglichkeiten gibt kann ich verstehen, aber ich habe da nochmal eine Frage und zwaar habe ich mal ein Programm aus dem Asuro Buch übernommen um mal zu testen ob jeder Taster Funktioniert aber wenn ich das Programm zu einer Hex Datei wandeln will zeigt er Fehler an und zwar in diesem Programm hier:

#include "asuro.h"
#include <stdlib.h>
#define OFFSET 0x3F
#define RWD_KEY ´2´
#define FWD_KEY ´8´
#define LEFT_KEY ´4´
#define RIGHT_KEY ´6´
#define STOP_KEY ´5´
volatile unsigned char switchPressed;
int speedLeft,speedRight;
SIGNAL (

void PCStop (void)
{
speedRight = speedLeft = 0;
FrontLED(OFF);
BackLED(OFF,ON);
}
int main (void)
{
unsigned char cmd;
unsigned char leftDir = FWD rightDir = RWD; // Zeile 79
int();
StartSwitch();
sei();
for(;;) {
cmd = 0;
SerRead (&cmd,1,0xFFFE);
switch (cmd) {
case RWD_KEY : PCRwd(); break;
case FWD_KEY : PCFwd(); break;
case LEFT_KEY : PCLeft(); break;
case RIGHT_KEY : PCRight(); break;
case STOP_KEY : PCStop(); break;
}

if (speedLeft > 0 && speedLeft < OFFSET)
speedLeft +=OFFSET;
if (speedLeft < 0 && speedLeft < -OFFSET)
speedLeft -=OFFSET;
if (speedRight > 0 &&speedRight < OFFSET)
speedRight += OFFSET;
if (speedRight < 0 &&speedRight > -OFFSET)
speedRight -= OFFSET;

if (switchPressed) {
speedLeft = 0;
speedRight = 0;
switchPressed = 0;
}
leftDir = rightDir = FWD; //Zeile 108
if (speedLeft < 0) leftDir = RWD;
if (speedRight < 0) rightDir = RWD;

if (speedLeft > 255) speedLeft = 255;
if (speedLeft < -255) speedLeft = -255;
if (speedRight > 255) speedRight = 255;
if (speedRight < -255) speedRight = -255;

MotorDir(leftDir,rightDir);
MotorSpeed (abs (speedLeft),abs (speedRight));
}
return 0;

und da zeigt er mir folgende Fehler an:

r-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o
test.c: In function `main':
test.c:79: error: parse error before "rightDir"
test.c:80: error: parse error before ')' token
test.c:87: error: stray '\264' in program
test.c:87: error: stray '\264' in program
test.c:88: error: stray '\264' in program
test.c:88: error: stray '\264' in program
test.c:89: error: stray '\264' in program
test.c:89: error: stray '\264' in program
test.c:89: warning: implicit declaration of function `PCLeft'
test.c:90: error: stray '\264' in program
test.c:90: error: stray '\264' in program
test.c:91: error: stray '\264' in program
test.c:91: error: stray '\264' in program
test.c:108: error: `rightDir' undeclared (first use in this function)
test.c:108: error: (Each undeclared identifier is reported only once
test.c:108: error: for each function it appears in.)
test.c:120:10: warning: no newline at end of file
test.c:120: error: parse error at end of input
make: *** [test.o] Error 1

Die meisten Fehler konnte ich mittlerweile auch schon selber korrigieren aber bei denne weiß ich nicht weiter.
Vielleicht wäre jemand von euch nochmal so nett sich das Programm zu gemühte führt.
Ich wäre euch sehr dankbar dafür!

(Und nochmal was anderes gibt es irgendwo eine seite wo man sich besipiel Programme runterladen bzw einsehen kann? weil dann könnte man sich da auch anregungen holen. Ich habe bei Google schon gesucht aber nicht wirklich was gefunden)

Mfg
Felix

wanderer
08.05.2007, 15:53
Nun.. ich wuerde erstmal vor das RightDir ein komma setzen, wenns dann noch nicht tut, solltest du die Zuweisung darunter schreiben, also:


unsigned char leftDir,rightDir;
leftDir = FWD;
rightDir = RWD;

Felix1988
08.05.2007, 17:38
Danke das klappt jetzt ist der Fehler in Zeile 79 weg aber die anderen sind noch da... ;-)
mfg Felix

wanderer
08.05.2007, 18:40
Das hier: int(); in zeile 80 sollte wohl init(); bedeuten?

Asuro-n00b
08.05.2007, 18:46
Darf ich mal kurz ne ganz einfache Frage dazwischen werfen?
Mir ist gerade das erste mal aufgefallen, dass die BackLEDs schwach leuchten, während ich flashe.
Ist das bei euch auch so?

Asuro-n00b
08.05.2007, 18:55
Die Forum-Uhr hängt eine Stunde zurück.
Ich poste das hier jetzt um 19:55.

damaltor
08.05.2007, 19:35
ja, das ist ok.

in dem prgramm sind einige fehler:

am beginn: int(). das muss wahrscheilich Init(); (gross-kleinschreibung ist WICHTIG) heissen.

am beginn steht SIGNAL (
da fehlt irgendwas.

vor rightdir muss ein komma.

mit den case-anweisungen stimmt was nicht. der fehler "stray" bedeutet dass ein ungültiges zeichen im quelltext ist.

die funktion PCleft ist nicht definiert.

die variable rightdir wird nicht gefunden, was aber behoben wird durch das komma was du oben gesetzt hast.
unter return 0; muss wenigstens noch eine } die die main-finktion schliesst. ausserdem sollte das letzte zeichen in JEDEM quellcode ein RETURN sein. ("no newline at EOF")

HermannSW
08.05.2007, 19:47
Die Forum-Uhr hängt eine Stunde zurück.
Ich poste das hier jetzt um 19:55.Ja und Nein!

Für eingeloggte Benutzer des Forums ist die Zeit OK (linker Screenshot), für nicht eingeloggte Benutzer stimmt Deine Aussage (rechter Screenshot).

Felix1988
08.05.2007, 19:55
Vielen Dank dafür! Jetzt suche ich nur gerade das ungültige zeichen.... in den Zeilen. Kann mir vielleicht jemand helfen welches es sein könnte? wärenett ;-) Vielne dank im Vorraus!
mfg Felix