www.mikrocontroller.net

Forum: GCC Libs mit delay Funktionen

Autor: Fried Vissel (tich)
Datum: 06.05.2008 18:31

Hallo an Alle,
ich benötige mal wieder 'ne Erleuchtung:
Habe mir eine LCD Lib gebastelt die delay Funktionen (die neuen) nutzt
und auch problemlos funktioniert. Nur werden die delays bei der
Copilierung auf 16 Mhz bezogen. Nutze ich die Lib später in einem
anderen Proggie für 10 Mhz, werden die delays entsprechend länger, da
die lib ja nicht angepasst wird. Wie muss ich die Programmstrukur
ändern, damit das funktioniert? Die delays im Modul der Libfunktionen
als extern zu deklarieren und das #include <util/delay.h> im (neuen)
Hauptprogramm zu machen, wird vom Compiler angemeckert. Ideen?
Danke, Fried
Autor: Andreas Kaiser (a-k)
Datum: 06.05.2008 18:40

Fried Vissel wrote:

> Nutze ich die Lib später in einem
> anderen Proggie für 10 Mhz, werden die delays entsprechend länger,

Welche Delay-Funktionen meinst du? Wenn das die aus der avr-libc sind,
die werden bei niedrigerer Taktfrequenz nicht länger.
Autor: Simon K. (simon) Benutzerseite
Datum: 06.05.2008 18:44

Andreas Kaiser wrote:
> Welche Delay-Funktionen meinst du? Wenn das die aus der avr-libc sind,
> die werden bei niedrigerer Taktfrequenz nicht länger.

Natürlich werden die Delays länger, wenn er F_CPU nicht anpasst (und das
schrieb er ja auch).
Autor: Oliver (Gast)
Datum: 06.05.2008 18:44

Eigentlich ist ja kein Mikrocontrollerprojekt so riesig, daß nicht alles
immer aus den sourcen compiliert werden kann. Die paar Sekunden länger
stören nicht.

Ansonsten bleibt dir z.B. nur übrig, nur hardwareunabhängige Funktionen
in die lib zu packen, alle hardwareabhängigen Funktionen in eine
Sourcedatei auszulagern, und die mit jedem Projekt neu zu kompilieren.
Neben dem Prozessortakt kann sich ja auch die Pinbelegung ändern, oder
ein ähnliches Display benötigt andere delay-Zeiten, usw.

Spätestens, wenn dann ein anderer Prozessor zum Einsatz kommt, muß eh
alles neu kompiliert werden.

Oliver
Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
Datum: 06.05.2008 19:00

Du kannst deiner Lib (vorausgesetzt es ist wirklich eine
Library und nicht einfach nur ein *.c + *.h File Konglomerat)
zb. eine Funktion spendieren, in der du der Lib die verwendete
Taktfrequenz mitteilst.

Innerhalb deiner Library, führst du alle delays zb auf 16Mhz
zurück (so lässt du das Compilieren) und eine Basiszeiteinheit,
zb 0.1 ms zurück und verlängerst dann die Wartezeiten mit Schleifen
um auf die abweichende Taktfrequenz zu reagieren.
uint8_t TaktMhz;

void SetTakt( uint8_t Mhz )
{
  TaktMhz = Mhz;
}

void myDelay_ms( uint8_t ms )
{
  ms = 10 * ms * TaktMhz / 16;

  while( ms > 0 )
    _delay_ms( 0.1 );
}

Derjenige, der die Lib verwendet, muss am Programmanfang deine
Lib von der verwendeten Taktfrequenz informieren und deine Lib
leitet dann daraus die notwendigen Korrekturfaktoren ab.

PS: Ich hab jetzt nicht kontrolliert, ob die Zahlenwerte da oben
sinnvoll sind oder nicht. Auch könnte man bei den delays für die
Berechnung noch einen konstanten Zeitanteil abziehen. Mir ging
es ums Prinzip, wie man eine Lib für veränderte Rahmenbedingungen
anpassbar machen kann, ohne alles ständig neu kompilieren zu müssen.
Autor: Andreas Kaiser (a-k)
Datum: 06.05.2008 20:08

Simon K. wrote:

> Natürlich werden die Delays länger, wenn er F_CPU nicht anpasst (und das
> schrieb er ja auch).

Ok, wenn er ein Kompilat für alle verwenden will. Aber wozu das? Binäre
Libs ergeben bei Microcontrollern nur Sinn, wenn nichts
hardwarebezogenes enthalten ist. Das hat sich auch bei der avr-libc
gezeigt, wo beispielsweise das EEPROM-Handling anfangs auf allen AVRs
gleich war, mittlerweile aber nicht mehr, und umgekrempelt werden
musste.
Autor: Fried Vissel (tich)
Datum: 06.05.2008 22:15

Ja, ihr habt recht dass eine Lib keine hardwareabhängigen Funktionen
enthalten sollte. Damit werden aber fast alle zeitabhängigen Routinen
nicht mehr "libfähig", es sei denn längere delays stören nicht (LCD,
I2C) aber wenn es auf genaues Einhalten von delays ankommt (one wire
z.B.), muss man halt für jede CPU neu kompilieren. Ist ja auch nicht
weiter schlimm, dazu kommt auch noch dass die delay Funktionen ja Makros
sind und keine echten Funktionen.
Danke für alle Eure Beiträge
Fried

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net