Forum: Mikrocontroller und Digitale Elektronik PIC16F876, cc5x-Compiler, Typkonvertierung uns16 nach float 24, MATH24F.H - Einbindung


von Oliver R. (olraho)


Lesenswert?

Arbeite im Rahmen einer Semesterarbeit gerade an einer Schaltung auf 
Basis des PIC 16F876 unter Verwendung von MPLAB 8.33 und des 
cc5x-Compilers in der free bzw. student-version. Ziel der Schaltung ist 
das Aufnehmen eines Messwertes mittels von Sensor geliefertem analogen 
Spannungswert (0 bis 10 Volt) über AN0, Umrechnung des 10-Bit 
AD-Wandlerwertes (TYP uns16) und Ausgabe des Messwertes auf einem 
LCD-Display (2x16, PORTB, E=PIN0, RS=PIN2, RW=PIN3) und über USART. 
Problem: Nur Grundlagenkenntnisse in C und noch nie mit PIC oder cc5x 
(o.ä MCU's bzw. Compilern) gearbeitet (mal mit Motorola 68k 
rum-assemblert aber mehr auch nicht), also bitte nicht gleich mit 
verbalen Tomaten werfen.
Also, das eigentliche Problem: U an ANO wird von einem Drucksensor 
geliefert (Messbereich 10^(-4)mbar - 10^3 mbar) und ist über  Druck = 
mbar*exp(U/V + konst.) mit dem eigentlichen Messwert verknüpft. Die 
Ausgabe auf dem LCD soll in der Form "xxxx.x e^(-y) mbar" erfolgen. Zur 
Verarbeitung des U-Signals wollte ich die MATH24F.H einbinden um die 
int24 -> float24 Umwandlung und die float24 exp10(float24); Funktion zu 
nutzen (cc5x in der free-version nur float24, behauptet der Compiler).
Bei #include <MATH24F.H> erfolgt folgende Fehlermeldung:

CC5X Version 3.4A, Copyright (c) B Knudsen Data, Norway 1992-2009
 --> FREE edition, 8-16 bit int, 24 bit float, 1.5k code, reduced optim.
Test3.c:

    if (expo > sizeof(arg1f24)*8-7)
        goto RETURN;
                   ^------
Error[1] C:\Programme\bknd\CC5X\MATH24F.H 434 : Macro 'RETURN' needs 
arguments
 (Macro identifier needs arguments, for example 'macroX(10)')

        goto RETURN;
    if (!arg2f24.high8)
     ^------
Error[2] C:\Programme\bknd\CC5X\MATH24F.H 435 : Duplicate or illegal 
label
 (The label name must not be defined twice within a function. Also, it
 must be a unique name not used in another context)

        goto RETURN;
    if (!arg2f24.high8)
       ^------
Error[3] C:\Programme\bknd\CC5X\MATH24F.H 435 : No ';' found
 (Each statement (and definition) must be terminated by a semicolon. 
Check
 previous statement)

        goto RETURN;
    if (!arg2f24.high8)
        ^------
Error[4] C:\Programme\bknd\CC5X\MATH24F.H 435 : Syntax error (or 
limitation)
 (CC5X is unable to compile the expression due to syntax error or
 limited C support. Code correction is required. Check also for
 unbalanced block delimiters '{ .. }' in previous statements)

Error options: -ew: no warning details  -ed: no error details  -eL: list 
details
BUILD FAILED: Sun Aug 23 17:08:02 2009

Wie gesagt, arbeite erst seit drei Wochen mit dem cc5x und den PIC's, 
weshalb ich mich noch nicht so besonders gut damit auskenne, deshalb 
folgende Frage: Hat jeman eine Idee welcher Fehler dieses Problem 
verursacht und wie er behoben werden kann ??


Im Voraus schon mal vielen Dank an alle die sich die Zeit nehmen hierauf 
zu Antworten und/oder mit Ihren Beiträgen im www  Anfängern wie mir den 
Einstieg zu erleichtern (bzw. die Realisierung ihre Projekte in 
annehmbaren überhaupt erst ermöglichen)

PS: Dies ist mein erster Beitrag in einem Internet Forum, deshalb bitte 
Gnade, war der Beitrag zu lang??

von Peter D. (peda)


Lesenswert?

Oliver R. schrieb:
>     if (expo > sizeof(arg1f24)*8-7)
>         goto RETURN;
>                    ^------
> Error[1] C:\Programme\bknd\CC5X\MATH24F.H 434 : Macro 'RETURN' needs
> arguments
>  (Macro identifier needs arguments, for example 'macroX(10)')

Das ist ja auch ne grottenschlechte Idee, für den Compiler reservierte 
Wörter zu vergewaltigen.

Die anderen Fehler werden Folgefehler sein.


Peter

von Oliver R. (olraho)


Lesenswert?

Das steht so in der MATH24F.H. Frag mich nicht wieso.
Aber Danke für die rasche Antwort.

von Oliver R. (olraho)


Lesenswert?

Bingo, alle "RETURN" geändert und es funzt. Danke auch.

von Peter D. (peda)


Lesenswert?

Oliver R. schrieb:
> Arbeite im Rahmen einer Semesterarbeit gerade an einer Schaltung auf
> Basis des PIC 16F876 unter Verwendung von MPLAB 8.33 und des
> cc5x-Compilers in der free bzw. student-version.

Welchen Grund gibt es, gerade diesen PIC mit einem gestutzten Compiler 
zu verwenden?
Macht man sich das Leben damit nicht nur unnötig schwer?


Bei den AVRs gibt es mit dem AVR-GCC einen voll ANSI kompatiblen, 
etablierten und gut optimierenden Compiler mit einer großen 
internationalen Nutzergemeinde, d.h. viel Support.


Aber auch für die PIC18xx soll es einen GCC geben.
Wie gut der ist, weiß ich allerdings nicht.


Peter

von Oliver R. (olraho)


Lesenswert?

Die PIC Familie war Vorgabe. Die Wahl auf den 16F... und den cc5x fiel 
eher in Laufe der ersten Recherchen auf Seiten wie sprut.de o.ä. und der 
vorhandene Programmierbeispiele.

Gruß
Oliver

von Meister E. (edson)


Lesenswert?

Wieso willst du ein Header-File eines 16-Bit PIC24 für einen 8-Bit PIC16 
verwenden? Wenn du mal hier schauen möchtest:

http://www.sprut.de/electronic/pic/math/math.htm#bibo

von Oliver R. (olraho)


Lesenswert?

Weil der compiler behauptet "Error[1] C:\Test\Test3.c 273 : This 
compiler edition supports 24 bit floating point only", und die "24 bit 
floating point"-Funktionen in der MATH24F.H definiert werden.
Auf die von dir angegebene Seite bin ich bereits gestoßen, da die 
angegebenen AN-Bibliotheken in Assembler geschrieben sind ist mir 
derzeit noch nicht ganz klar wie ich sie korrekt anwenden und in das 
C-Programm einbinden kann, da die ersten Versuche dazu mehr Fehler 
produzierten als die Einbindung der H-Datei.

Oliver

von Meister E. (edson)


Lesenswert?

Entschuldige, da ist mir ein Fehler unterlaufen. Die MATH24F.H hat ja 
gar nichts mit PIC24 zu tun.

>da die angegebenen AN-Bibliotheken in Assembler geschrieben sind ist mir
>derzeit noch nicht ganz klar wie ich sie korrekt anwenden und in das
>C-Programm einbinden kann

Gar nicht, sorry (außer mit Inline-Assembler, sofern der cc5x das kann). 
Wie gesagt, ich meinte etwas völlig Anderes.
Zum cc5x selbst kann ich leider nichts sagen, da ich den nicht benutze.

Grüße,
Edson

von Oliver R. (olraho)


Lesenswert?

Das mit dem inline-Assembler geht prinzipiell, jedoch die richtige 
Routine richtig mittels inline-asm als C-Fkt. einzufügen (richtiger 
Datentyp, Übergabevariable usw. finden) ist eine Sache für sich. Aber 
Versuch macht ja bekanntlich klug.

Gruß

Oliver

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.