PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Welche Bibliotheken sind verfügbar?



HAWK-Matze
21.12.2007, 07:54
Hi!

Plane mir noch dieses Jahr einen Asuro anzuschaffen.
Habe bis her noch keine Erfahrungen mit Robotern, kann aber C-Programmieren (nicht so gut wie einige von euch aber doch ganz gut).
Ich wollte mich mal erkundigen welchen Biblitheken mir auf dem Asuro außer der asuro.h mit den 10 Steuerfunktionen zur verfügung stehen? Und kann ich irgendwo einsehen was für Befehle enthalten sind, welche Parameter sie erwarten und was sie machen?
Kann ich einfach Bibliotheken auf den asuro schieben die ich dann verwenden kann? Speziel gehts mir um conio.h.

Großes lob für das Forum hier sind ja echt nen paar Freaks (positiv gemeint => Fachmänner/frauen) am werk!
Hab vorab schon mal viel Infos sammeln können, danke dafür!

radbruch
21.12.2007, 08:54
Hallo

Die umfassendste Bibliothek für den asuro ist eine hier im RN-Forum weiterentwickelte asuro.h. Link zum Quellcode und zum entsprechenden Thread der aktuellsten Version findest du hier:

https://www.roboternetz.de/phpBB2/viewtopic.php?p=275614#275614

Willkommen im RN-Forum und viel Spaß mit deinem asuro

Gruß

mic

Andun
21.12.2007, 11:37
Auch ein herzliches Willkommen hier von mir!

Generell kannst du auf den Asuro alles drauf schieben, was auf einem AVR-Controller drauf kann. Also ganz normaler Assembler Code! :D Wenn du also deine Bibliothek von normalen C mit WinAVR in Assembler übersetzt kriegst, spricht eigetnlich nichts dagegen.

Aber mal aus Neugier die Frage: Was macht die Bibliothek denn, bzw. wofür willst du sie auf dem Asuro anwenden?

mfg
Andun

HAWK-Matze
22.12.2007, 16:26
Speziel gings mir um textcolor, gotoxy, weis allerdings noch nicht ob das funzt was ich mir da so überlegt habe...

Wollte das der Asuro den zurückgelegten weg am rechner darstellt...
Erstmal kleine Brötschen backen und schauen das er läuft, dann seh ich mal weiter

robo.fr
22.12.2007, 17:59
textcolor

Diese Funktion auf einem ASURO zu verwirklichen, erfordert sicherlich viel Kreativität und Phantasie. Aber wer weiß, man soll niemals nie sagen, vielleicht fällt jemandem was dazu ein. =P~

HAWK-Matze
23.12.2007, 12:10
Ja da hast du wohl recht...
werds erstmal mit der sleep funktion aus der dos.h probieren...
Ob das was wird. Hat der Asuro prozessor eigentlich ne innere Uhr?

damaltor
27.12.2007, 23:14
er hat eine variable, die alle 36000stel sekunde um 1 erhöht wird...und die bei einem zählert von 255, also etwa alle 140stel sekunde überläuft. =)

HAWK-Matze
28.12.2007, 13:03
Ohh das ist aber praktisch.... gibts da auch ne praktikable lösung, wenn man eine schleife nur für eine bestimmte zeit laufen lassen will? nicht msleep!

radbruch
28.12.2007, 14:38
Hallo

Wenn man auch auf die externe Variable timebase zugreift, hat man einen 40-bit-Timer. So macht es z.B. die Funktion GetTime():

volatile unsigned char count36kHz;
volatile unsigned long timebase;
// neue Zeitfunktion
unsigned long Gettime(void)
{
return ((timebase*256)+count36kHz)/36;
}

(long ist ein int32_t! [Quelle (http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Ganzzahlige_.28Integer.29_Datentypen)])

timebase ist der Überlaufzähler von count36kHz in der Timer2-Overflow-ISR in asuro.c:


SIGNAL (SIG_OVERFLOW2)
{
TCNT2 += 0x25;
count36kHz ++;
if (!count36kHz) timebase ++;

Sleep() verwendet auch count36kHz, und Msleep() verwendet Sleep():


/* uses 36kHz timer => Sleep(x) = x/36kHz [sec] */
void Sleep(unsigned char time36kHz)
{ unsigned char ziel=(time36kHz+count36kHz) & 0x00FF;
while (count36kHz != ziel);
}

void Msleep(int dauer)
{
int z;
for(z=0;z<dauer;z++) Sleep(36);
}

Gruß

mic

damaltor
28.12.2007, 15:03
oder du schreibst die eine funktion wie msleep selbst.

Ubuntuxer
01.02.2008, 12:14
Ich habe jetzt seit kurzem auch einen Asuro und ich bin total begeistert.

Ich habe aber bis jetzt nur mit Visual Basic und C++ programmiert und habe noch kaum Ehrfahrung mit C. 8-[
Ich interressiere mich für den Timer von radbruch, denn ich würde gerne von der Anfangsschleife while(1) wegkommen. Damit ich nicht immer dem Asuro hinterlaufen muss, um ihn auszumachen.

Ansonstens funktioniert alles prima und ich konnte schon viele Probleme mithilfe des Wikis lösen. (leider gerade down)

radbruch
01.02.2008, 14:10
Lange Verzögerungen ohne Sleep() mit direktem Zugriff auf timebase:

#include "asuro.h"

extern unsigned long timebase;

int main (void)
{
Init();
StatusLED(RED);
cli();
timebase=0;
sei();
while(timebase < 1406) // 10 Sekunden, weil 36000/256=140,6...
{
BackLED(timebase & 16, timebase & 8);
}
BackLED(0,0);
StatusLED(GREEN);
while(1);
return(0);
}

Einfacher gehts natürlich mit Gettime():

while (sekunden*1000 < Gettime())

Ubuntuxer
02.02.2008, 10:49
vielen dank für die schnelle Antwort,
Ich bekomme aber folgende Fehlermeldung, wenn ich dein Code ausführe.
undefined reference to `timebase'
Ich habe eigentlich auch nichts anderes erwartet, denn ich wüsste nicht das ich die Variable timebase irgendwo anders initialisiert hätte.

Kannst du mir vielleicht erklären was cli(); und sei(); heißt.
Ich würde für den Anfang einfach eine LED 10sek leuchten lassen.

oberallgeier
02.02.2008, 12:29
Hallo U-xer,

die beiden cli und sei sind eigentich Machinenbefehle für Interrupt dis- und enable (sei - set enable interrupt). Schau mal ins doc vom ATMega8, ab S 283 ist die ganze Instruction Set Summary, dort findest Du auch die beiden Befehle. In der Schreibweise von Dir sind sie für C modifiziert - In-line-Assembler. Aktuell bekommst Du das Datenblatt (über 300 Seiten) bei Atmel (http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf).

Viel Erfolg.

radbruch
02.02.2008, 15:58
Hallo

Da ist mir ein kleiner "Fehler" unterlaufen, timebase und gettime() gibt es nicht in der orginalen Library:


volatile unsigned char count72kHz;

/* uses timer2 (36kHz for IR communication */
/* counts falling and rising edge => 36kHz*2 = 72kHz */
SIGNAL (SIG_OUTPUT_COMPARE2)
{
count72kHz ++;
}aus asoro.c v2.1

Spätere Versionen mit dem 36kHz-Timer verwenden timebase so:


volatile unsigned char count36kHz;
volatile unsigned long timebase;
volatile int autoencode=FALSE;

/* uses timer2 (36kHz for IR communication */
SIGNAL (SIG_OVERFLOW2)
{
TCNT2 += 0x25;
count36kHz ++;
if (!count36kHz) timebase ++;
}

cli() und sei() verwende ich vorsichtshalber, denn einen long-Wert auf null zu setzen benötigt mehr als einen Befehl und könnte deshalb vom Timerinterrupt unterbrochen werden.

Gruß

mic

Ubuntuxer
17.02.2008, 15:58
@oberallgeier
Ich bin noch ziemlicher Anfänger und habe ehrlich gesagt überhaut nichts aus deinem Link verstanden.
@radbruch
Ich habe es nun doch anders gelöst.
hier ein Beispiel von mir Status LED wechselt alle paar Sekunden die Farbe.

#include "asuro.h"


int main(void)

{

int i;

int j;

Init();

while(1)

{

for (j=0; j<500 ; j++)

{

StatusLED(GREEN);

Sleep(255);

}

for(i=0; i<500; i++ )

{

StatusLED(RED);

Sleep(255);

}

}

return 0;

}


trotzdem vielen dank