PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro Go/Turn



µcFlo
09.06.2012, 16:03
Hi,
ich bin noch ein echter Auro anfänger und wollte eine ganz ganz kleines mini Programm schreiben um die Befehle Go/Turn zu testen.
Also ich hab die neusten Header heruntergeladen (soweit ich weiss) aber es gibt mir trozdem immernoch einen Fehler aus :( .
Vielleicht, nein sicher, könnt ihr mir ja helfen.



#include "asuro.h"
#include "myasuro.h"

int main(void) {
EncoderInit ();
while(1) {
Go (200, 150);
Turn (90, 150);
}
}


und die Fehler sind:


asuro.c:145: error: 'F_CPU' undeclared (first use in this function)
asuro.c:145: error: (Each undeclared identifier is reported only once
asuro.c:145: error: for each function it appears in.)


Danke

rXenon
09.06.2012, 16:39
Hallo Flo,

in F_CPU definierst du die Frequenz deines externen Taktes. Beim Asuro sind das glaube ich 8MHz.
Du kannst also einfach in deine .c Datei folgendes hinter den includes schreiben:

#define F_CPU 8000000UL

Ist übrigens auch nur ein Fehler, den du da gepostet hast.

Viele Grüße und Erfolg, Stefan

µcFlo
09.06.2012, 16:45
Danke rXenon,
schön dass du so schnell geantwortet hast, aber leider funktioniert es nicht. Ich hab #define F_CPU 8000000UL eingfügt doch komischer Weise verändert sich nichts an der Fehlermeldung.

Mfg Florian

rXenon
09.06.2012, 16:50
Achso richtig, F_CPU wird schon in der Asuro Bibliothek benötigt (also vor deinem Code).
Am besten ist es sowieso, wenn man das in dem Makefile einstellt, so wie hier: http://www.mikrocontroller.net/articles/Beispiel_Makefile

µcFlo
09.06.2012, 17:38
Danke rXenon,
also ich hab mir das mal angeguckt und wenn ich das recht verstehe muss ich einfach in das Makefile F_CPU = 8000000 schreiben oder?

Danke
Mfg Florian

radbruch
09.06.2012, 17:43
Init() vergessen.

µcFlo
10.06.2012, 00:59
Danke radbruch, ich vermute du meinst im Code. Aber leider löst das mein Problem nicht wirklich.
Und das F_CPU = 8000000 im Makefile hat mir leider auch nicht geholfe die Fehlermeldung bleibt immernoch bestehen.

Trozdem Danke
Mfg Florian

radbruch
10.06.2012, 05:33
Hallo

"Du kannst also einfach in deine .c Datei folgendes hinter den includes schreiben:" dürfte ja wohl zu spät sein, wenn die Definition in asuro.c fehlt. Vielleicht hilft es auf die schnelle F_CPU in der Zeile 145 in asuro.c zu ersetzen. Vermutlich werden an dieser Stelle einmalig die Werte für die Baudratenregister des USART berechnet. Das könnte man auch von Hand erledigen und die Werte direkt im Code eintragen. Dann würde es wieder weitergehen...

https://www.roboternetz.de/community/threads/53308-AsuroLib

Gruß

mic

µcFlo
10.06.2012, 15:10
Hallo,
ich hoffe ich nerve jetzt nicht aber es funktioniert immernoch nicht.
Ich hab alle ausprobiert was hier gesagt wurde, ich hab es ins Makefile geschrieben und in asuro.c in die Zeile 145 F_CPU = 8000000 geschrieben (Was zu nem ganzen haufen Fehlern geführt hat).
Und F_CPU = 8000000 ganz einfach in mein Programm zuschreiben hat auch nicht fuktioniert.

Danke

radbruch
10.06.2012, 15:37
Hallo


in asuro.c in die Zeile 145 F_CPU = 8000000 geschrieben (Was zu nem ganzen haufen Fehlern geführt hat).Keine Ahnung was du damit meinst. Der betreffende Bereich in asuro.c sieht so aus:


/*
Die serielle Schnittstelle wurde waerend der Boot-Phase schon
programmiert und gestartet. Hier werden die Parameter auf 2400 1N8 gesetzt.
*/
#if defined(__AVR_ATmega168__)
UBRR0L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1);
UBRR0H = (F_CPU/(BAUD_RATE*16L)-1) >> 8;
UCSR0B = (1<<RXEN0) | (1<<TXEN0);
UCSR0C = (1<<UCSZ00) | (1<<UCSZ01);
#else
UBRRH = (((F_CPU/BAUD_RATE)/16)-1)>>8; // set baud rate
UBRRL = (((F_CPU/BAUD_RATE)/16)-1);
UCSRB = (1<<RXEN)|(1<<TXEN); // enable Rx & Tx
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // config USART; 8N1
#endif
Zeile 145 ist rot markiert. Hier ersetzt du F_CPU durch 8000000 oder rechnest den Wert für das jeweilige Register selbst aus:

UBRRH = (((8000000/2400)/16)-1)>>8; // set baud rate
UBRRL = (((8000000/2400)/16)-1);

Oder du verwendest direkt den Wert für UBRR aus dem Datenblatt unter "Examples of Baud Rate Setting"

UBRRH=0; // set baud rate
UBRRL=207;

Das funktioniert aber nur, weil der asuro alle seine Zeiten selbst berechnet und nicht delay.h verwendet.

Gruß

mic

µcFlo
10.06.2012, 15:59
Danke,
jetzt weiss ich wass du meinst, und ich habs genaus so gemacht, aber dann kommen nurnoch mehr Fehler.
Der Code aus asuro .c:


#else
UBRRH = (((8000000/2400)/16)-1)>>8; // set baud rate
UBRRL = (((8000000/2400)/16)-1);
UCSRB = (1<<RXEN)|(1<<TXEN); // enable Rx & Tx
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // config USART; 8N1
#endif


Das führt zu diesen Fehlern:


test.o: In function `main':
C:\Users\Grau\Desktop\Asuro/test.c:8: undefined reference to `EncoderInit'
C:\Users\Grau\Desktop\Asuro/test.c:10: undefined reference to `GoTurn'
C:\Users\Grau\Desktop\Asuro/test.c:11: undefined reference to `GoTurn'
asuro.o: In function `__vector_4':
C:\Users\Grau\Desktop\Asuro/asuro.c:225: undefined reference to `count36kHz'
C:\Users\Grau\Desktop\Asuro/asuro.c:225: undefined reference to `count36kHz'
C:\Users\Grau\Desktop\Asuro/asuro.c:226: undefined reference to `count36kHz'
C:\Users\Grau\Desktop\Asuro/asuro.c:227: undefined reference to `timebase'
C:\Users\Grau\Desktop\Asuro/asuro.c:227: undefined reference to `timebase'
C:\Users\Grau\Desktop\Asuro/asuro.c:227: undefined reference to `timebase'
C:\Users\Grau\Desktop\Asuro/asuro.c:227: undefined reference to `timebase'
C:\Users\Grau\Desktop\Asuro/asuro.c:227: undefined reference to `timebase'
asuro.o:C:\Users\Grau\Desktop\Asuro/asuro.c:227: more undefined references to `timebase' follow
asuro.o: In function `__vector_4':
C:\Users\Grau\Desktop\Asuro/asuro.c:228: undefined reference to `Ovr2IntFunc'
C:\Users\Grau\Desktop\Asuro/asuro.c:228: undefined reference to `Ovr2IntFunc'
C:\Users\Grau\Desktop\Asuro/asuro.c:229: undefined reference to `Ovr2IntFunc'
C:\Users\Grau\Desktop\Asuro/asuro.c:229: undefined reference to `Ovr2IntFunc'
asuro.o: In function `__vector_3':
C:\Users\Grau\Desktop\Asuro/asuro.c:242: undefined reference to `count36kHz'
C:\Users\Grau\Desktop\Asuro/asuro.c:242: undefined reference to `count36kHz'
C:\Users\Grau\Desktop\Asuro/asuro.c:243: undefined reference to `count36kHz'
C:\Users\Grau\Desktop\Asuro/asuro.c:244: undefined reference to `timebase'
C:\Users\Grau\Desktop\Asuro/asuro.c:244: undefined reference to `timebase'
C:\Users\Grau\Desktop\Asuro/asuro.c:244: undefined reference to `timebase'
C:\Users\Grau\Desktop\Asuro/asuro.c:244: undefined reference to `timebase'
C:\Users\Grau\Desktop\Asuro/asuro.c:244: undefined reference to `timebase'
asuro.o:C:\Users\Grau\Desktop\Asuro/asuro.c:244: more undefined references to `timebase' follow
asuro.o: In function `__vector_2':
C:\Users\Grau\Desktop\Asuro/asuro.c:269: undefined reference to `switched'
C:\Users\Grau\Desktop\Asuro/asuro.c:269: undefined reference to `switched'
asuro.o: In function `__vector_14':
C:\Users\Grau\Desktop\Asuro/asuro.c:303: undefined reference to `AdcIntFunc'
C:\Users\Grau\Desktop\Asuro/asuro.c:303: undefined reference to `AdcIntFunc'
C:\Users\Grau\Desktop\Asuro/asuro.c:304: undefined reference to `AdcIntFunc'
C:\Users\Grau\Desktop\Asuro/asuro.c:304: undefined reference to `AdcIntFunc'
asuro.o: In function `Init':
C:\Users\Grau\Desktop\Asuro/asuro.c:181: undefined reference to `FrontLED'
C:\Users\Grau\Desktop\Asuro/asuro.c:182: undefined reference to `BackLED'
C:\Users\Grau\Desktop\Asuro/asuro.c:183: undefined reference to `BackLED'
C:\Users\Grau\Desktop\Asuro/asuro.c:184: undefined reference to `StatusLED'
C:\Users\Grau\Desktop\Asuro/asuro.c:186: undefined reference to `MotorDir'
C:\Users\Grau\Desktop\Asuro/asuro.c:187: undefined reference to `MotorSpeed'
C:\Users\Grau\Desktop\Asuro/asuro.c:189: undefined reference to `autoencode'
C:\Users\Grau\Desktop\Asuro/asuro.c:189: undefined reference to `autoencode'
C:\Users\Grau\Desktop\Asuro/asuro.c:191: undefined reference to `Ovr2IntFunc'
C:\Users\Grau\Desktop\Asuro/asuro.c:191: undefined reference to `Ovr2IntFunc'
C:\Users\Grau\Desktop\Asuro/asuro.c:192: undefined reference to `AdcIntFunc'
C:\Users\Grau\Desktop\Asuro/asuro.c:192: undefined reference to `AdcIntFunc'


Danke für die Gedult

radbruch
10.06.2012, 16:45
Hallo

Nur keine Panik. Das F-CPU-Problem betraf den Preprocessor der vor dem Kompilieren die #defines ersetzt. Das scheint jetzt funktioniert zu haben, denn nun wird versucht, das C-Programm in die Maschinensprache der AVRs zu übersetzen. Dabei "merkt" der Kompiler, dass er für einige Funktionen die Definitionen nicht findet: "undefined reference to"

Das passiert, wenn asuro.c nicht gefunden wurde. Die Meldung dazu sollte etwa so aussehen: "temp.c:5:20: error: asuro.h: No such file or directory" Aber das erscheint ja bei dir offensichtlich nicht. Hier kann ich nun wirklich nur raten: Du includest die Datei asuro.h mit "", für die aktuelle Library muss man sie aber mit <> einbinden (""= im selben Verzeichniss wie der Quellcode des Programms, <> im GCC-Pfad) Das ist aber eher geraten als gewußt, denn ich verwende Version 2.3 der Lib.

Gruß

mic


[Edit]
Das count36kHz nicht gefunden wird zeigt, dass wirklich die orginale CD-Library eingebunden wurde. Ab Version 2.3, und deshalb auch in der aktuellen Lib, ist count36kHz bekannt.

µcFlo
12.06.2012, 01:02
Hi,
danke erstmal, ich hab das mit <> ausprobiert, doch leider verändert sich nichts. Aber ich denke muss muss eine einfachere Lösung geben, bei anderen funktioniert es ja auch, vielleicht könnte es helfen eine andere Version der Lib zu benutzen.
Für weitere Tipps wäre ich dankbar.

Danke
Mfg

radbruch
12.06.2012, 06:06
Hallo


...vielleicht könnte es helfen eine andere Version der Lib zu benutzen.Nicht wirklich. Wenn du Go() oder Turn() und die anderen Errungenschaften der aktuellen Library nutzen willst, dann ist die aktuelle Version 2.8 die erste Wahl.


bei anderen funktioniert es ja auch, wenn auch nicht immer auf Anhieb. Der große Unterschied ist der Speicherort der Libraries. Bis ca. Version 2.6(?) bestand die Library lediglich aus den Dateien asuro.h und asuro.c die im Verzeichniss des Quellcodes abgelegt und mit "" eingebunden wurden. Die aktuelle Library wird nun im WinAVR-Bereich angelegt und über den Pfad gefunden, weil sie mit <> eingebunden wird. Wenn der Pfad nicht stimmt, wird diese Lib nicht gefunden und deshalb deren Funktionen auch nicht eingebunden. Erschwerend kommt noch dazu, dass die aktuelle Lib schon vorkompiliert ist und nicht der Quellcode sondern nur die Objektdateien eingebunden werden (oder so ähnlich):

https://www.roboternetz.de/community/threads/29833-So-wird-die-Asuro-LIB-installiert-und-in-Betrieb-genommen-3

Gruß

mic

Valen
15.06.2012, 17:18
Hi,


danke erstmal, ich hab das mit <> ausprobiert, doch leider verändert sich nichts. Aber ich denke muss muss eine einfachere Lösung geben, bei anderen funktioniert es ja auch, vielleicht könnte es helfen eine andere Version der Lib zu benutzen.
Für weitere Tipps wäre ich dankbar.

Danke
MfgBist du angefangen mit einer Kopie zu machen von der Beispiel FirstTry Ordner?

\AsuroLib-v280rc1\examples\FirstTry

Dort drin in dem Makefile soll nur die LIBPATH zeile angepasst werden.

In das Kopie der FirstTry ordner, in dem Datei Test.c, kannst du dann deine Code hinnein fügen:


/************************************************** *************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* any later version. *
************************************************** *************************/

#include "asuro.h"

int main(void)
{
Init();

EncoderInit ();
while(1) {
Go (200, 150);
Turn (90, 150);
}

while (1);
return 0;
}

µcFlo
15.06.2012, 21:57
Hallo,
und danke. Es gab leider auch dieses mal wider einen Fehler, aber es diesem mal glaube ich ein Problem mit dem Makefile:


c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/bin/ld.exe: cannot find -lasuro




Danke
Mfg Florian

Valen
15.06.2012, 22:13
Wie genau ist deine LIBPATH eingestellt? Es muss genau das Pfad der lib Ordner wissen. Dazu muss es auch mit / geschrieben werden, sonnst wird es nicht kapieren. Leider gibt Windows die Pfaden mit \ drin. Also muss man das wechseln.

Wie meine LIBPATH:

LIBPATH = D:/KEEPFILES/HOBBY/Asuro_files/Asurolib/v280rc1/lib

µcFlo
15.06.2012, 23:43
OH, ich hab es jetzt einfach nochmal probiert und jetzt funktioniert es tatsächlich.
Endlich nach Tagen funktioniert es!!!!:D Danke an alle die mir geholfen haben.

Mfg Florian