Forum: Mikrocontroller und Digitale Elektronik Unterschiede CodevisionAVR und AVR-GCC


von Steffen O. (derelektroniker) Benutzerseite


Lesenswert?

Hallo,
ich hab hier eine lib für einen ATMega8, die in CodevisionAVR 
geschrieben wurde. Nun würde ich gerne diese lib auch mit AVR-GCC 
verwenden.

Was muss ich bei der Portierung der lib nach AVR-GCC beachten?
Gibts da irgendwelche Stolperfallen, oder so?

Ich hab schon gelesen, dass es bei CodevisionAVR eben einige 
Codegeneratoren gibt, die z.B. die Timer, UART, ADC usw. alles schon 
vorkonfigurieren.

Aber ist der Code selber auch anders? Oder ist eben CodevisionAVR nur 
ein Compiler, der dem Entwickler ein wenig Arbeit abnimmt, der Code ist 
jedoch gleich wie bei AVR-GCC?

Vielen Dank schon einmal im Voraus!
Gruß, Steffen

von prog0 (Gast)


Lesenswert?

Hallo,

ja es gibt einige Unterschiede, insbesondere das I/O pin handling (CV 
erlaubt z.B. PORTD.0=1) außerdem ist die Behandlung von Interrupts 
anders als bei GCC.

Bei der Library kommt es natürlich drauf an, was drin ist.

Lass sie halt mal durch den GCC laufen und dann eine Fehlermeldung nach 
der anderen abstellen. Wenn Du Dich mit GCC auskennst, wird das 
lediglich eine mehr oder weniger mühsame Fleißarbeit.

Probieren geht über studieren...

von Steffen O. (derelektroniker) Benutzerseite


Lesenswert?

OK, ich habs jetzt mal durch Winavr rennen lassen. 44 Fehler, und 3 
Warnings^^. Aber so wie ich das sehe, sind das eigentlich nur Fehler auf 
Grung der anderen Portansprache.
Ach ja, geht sowas in gcc:
1
#define SPI_PORT        PORTB  
2
#define SPI_PORT_DIR    DDRB
3
#define MISO            4
4
#define MOSI            3
5
#define SCK             5
6
#define CS              2   
7
#define BLANK           0
8
#define MODE            1

Ich mein eben wegen den Zahlen hinter #define MISO, usw. Muss man da 
nicht jedesmal neu schreiben PORTB, und dann die jeweilige Zahl?

Gruß, Steffen

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Steffen O. wrote:

> Ach ja, geht sowas in gcc:
>
1
> #define SPI_PORT        PORTB
2
> ...
3
>
>
> Gruß, Steffen

Mit #define kann man fast alles auf die rechte Seite schreiben, es führt 
ja nur zu textuellem Ersatz. Es kommt also auf die Verwendung an.

von Steffen O. (derelektroniker) Benutzerseite


Lesenswert?

Ja, ok. Dann werd ich das also so lassen.
Ok sonst wäre dann alles geklärt, den Rest kann ich eigentlich alleine.
Vielen Dank an alle, die mir geholfen haben!
Gruß, Steffen

von Steffen O. (derelektroniker) Benutzerseite


Lesenswert?

So, von den 44 Fehlern bin ich jetzt noch bei 2 und 4 Warnings. Und zwar 
treten jeweils ein Fehler und zwei Warnings in den folgenden Zeilen auf:
1
 interrupt [TIM1_COMPA]; void timer1_compa_isr(void)
und
1
 interrupt [TIM1_COMPB]; void timer1_compb_isr(void)

Der Fehler jeweils lautet:
../RGBlib.c:245: error: 'TIM1_COMPA' undeclared here (not in a function)
bzw.
../RGBlib.c:313: error: 'TIM1_COMPB' undeclared here (not in a function)

Und die Warnings:
../RGBlib.c:245: warning: data definition has no type or storage class
../RGBlib.c:245: warning: type defaults to 'int' in declaration of 
'interrupt'
bzw.
../RGBlib.c:313: warning: data definition has no type or storage class
../RGBlib.c:313: warning: type defaults to 'int' in declaration of 
'interrupt'


Wenn ich das
1
 interrupt [TIM1_COMPA];
 weglasse, dann gibt es keine Compilerfehler mehr. Aber funktioniert das 
dann auch richtig?
Wenn nicht, wie muss ich das dann schreiben, damit das mein AVR Studio 
ordentlich compiliert?

Vielen Dank schon einmal im Voraus.
Gruß, Steffen

von Johannes M. (johnny-m)


Lesenswert?

Steffen O. wrote:
> So, von den 44 Fehlern bin ich jetzt noch bei 2 und 4 Warnings. Und zwar
> treten jeweils ein Fehler und zwei Warnings in den folgenden Zeilen auf:
>
1
 interrupt [TIM1_COMPA]; void timer1_compa_isr(void)
> und
>
1
 interrupt [TIM1_COMPB]; void timer1_compb_isr(void)
Schau Dir einfach im AVR-GCC-Tutorial an, wie Interrupt Handler 
korrekt implementiert werden und welche Header dafür eingebunden werden 
müssen. Da steht alles vorgekaut (und es wundert mich, dass Du nach drei 
Wochen immer noch nicht bis dahin gekommen bist). Ansonsten kann ich 
auch dringendst die Dokumentation der AVR-libc empfehlen.

> Wenn ich das
1
 interrupt [TIM1_COMPA];
 weglasse, dann gibt es
> keine Compilerfehler mehr. Aber funktioniert das dann auch richtig?
Nein.

> Wenn nicht, wie muss ich das dann schreiben, damit das mein AVR Studio
> ordentlich compiliert?
Und AVRStudio compiliert gar nichts! Das tut der Compiler, und der 
gehört nicht zum AVRStudio sondern muss als Plugin zusätzlich 
installiert werden. AVRStudio ist in diesem Fall nur die 
Entwicklungsumgebung.

von Steffen O. (derelektroniker) Benutzerseite


Lesenswert?

Hallo,
Johannes M. wrote:
> Steffen O. wrote:
>> So, von den 44 Fehlern bin ich jetzt noch bei 2 und 4 Warnings. Und zwar
>> treten jeweils ein Fehler und zwei Warnings in den folgenden Zeilen auf:
>>
1
 interrupt [TIM1_COMPA]; void timer1_compa_isr(void)
>> und
>>
1
 interrupt [TIM1_COMPB]; void timer1_compb_isr(void)
> Schau Dir einfach im AVR-GCC-Tutorial an, wie Interrupt Handler
> korrekt implementiert werden und welche Header dafür eingebunden werden
> müssen.
Ok, werd ich dann mal machen.

Da steht alles vorgekaut (und es wundert mich, dass Du nach drei
> Wochen immer noch nicht bis dahin gekommen bist).
Ich war zwei Wochen im Urlaub, und hab mich so also erst ca. 1-2 Tage 
mit dem Thema befasst.

>Ansonsten kann ich
> auch dringendst die Dokumentation der AVR-libc empfehlen.
Gut, werde ich mir auch mal anschauen.

>> Wenn nicht, wie muss ich das dann schreiben, damit das mein AVR Studio
>> ordentlich compiliert?
> Und AVRStudio compiliert gar nichts! Das tut der Compiler, und der
> gehört nicht zum AVRStudio sondern muss als Plugin zusätzlich
> installiert werden. AVRStudio ist in diesem Fall nur die
> Entwicklungsumgebung.
Ja, dann eben das WinAVR Plugin in der Entwicklungsumgebung AVR Studio.

Gruß, Steffen

von Steffen O. (derelektroniker) Benutzerseite


Lesenswert?

OK, vielen Dank nochmal für den Tip, hab jetzt die zwei Fehler und vier 
Warnings auch noch beseitigt. Jetzt kam ein neuer Fehler, und zwar in 
der Zeile:
1
 #define SPI_PORT        PORTB

Da kommt folgender Fehler:
../../../../crt1/gcrt1.S:52: undefined reference to `main'

Die define ist doch richtig geschrieben, und es gibt im Mainteil auch 
SPI_PORT, das durch PORTB ersetzt werden kann, also daran liegts nicht.
Was könnte dann den Compiler stören?
Vielen Dank schon mal im Voraus.
Gruß, Steffen

von Johannes M. (johnny-m)


Lesenswert?

Da es in der Zeile gar keine "reference to main" gibt, dürfte der 
eigentliche Fehler in einer anderen Zeile als der gezeigten liegen bzw. 
sich aus dem hier nicht ersichtlichen Kontext ergeben.

von Steffen O. (derelektroniker) Benutzerseite


Lesenswert?

Ich portiere ja gerade eine lib, da gibts doch gar keine main. Also der 
Compiler kennt die main ja noch gar nicht, woher will er dann sagen dass 
der Zusammenhang zur main undefiniert ist? Weil ich hab auch noch andere 
defines in der lib, und die werden auch ordentlich compiliert.

Ach ja, noch ne andere Frage: Wie kann ich mit einer define machen, dass 
der Präprozessor einen Namen durch eine Zahl ersetzt, dieser aber in 
einer Variable steht. Also jetzt mal ein Beispiel wie ich es meine:
1
 
2
c=5;
3
#define Test "c"
Jetzt weiß ich eben nicht, wie ich da das c schreiben muss, dass es als 
Variable angesehen wird. Weil wenn ich ja einfach c schreibe, dann 
ersetzt er mir ja nur Test durch c. Aber Test soll ja durch 5 ersetzt 
werden.

Vielen Dank schon einmal im Voraus.
Gruß, Steffen

von Johannes M. (johnny-m)


Lesenswert?

Steffen O. wrote:
>
1
> c=5;
2
> #define Test "c"
3
>
> Jetzt weiß ich eben nicht, wie ich da das c schreiben muss, dass es als
> Variable angesehen wird. Weil wenn ich ja einfach c schreibe, dann
> ersetzt er mir ja nur Test durch c. Aber Test soll ja durch 5 ersetzt
> werden.
Der Präprozessor kennt den Wert der Variable gar nicht (bzw. er 
interessiert ihn nicht). Du bist Dir offensichtlich nicht im Klaren über 
die Funktionsweise und die Aufgaben des Präprozessors. Den Präprozessor 
interessieren ausschließlich Programmzeilen, die mit "#" anfangen. Alles 
andere ignoriert er und gibt es 1:1 dem Compiler weiter. Deshalb kann 
der Präprozessor den Wert der Variablen gar nicht einsetzen. Die 
Zuweisung eines Wertes macht erst der Compiler, und der fängt erst an zu 
arbeiten, wenn der Präprozessor mit seinem Part fertig ist.

von Steffen O. (derelektroniker) Benutzerseite


Lesenswert?

Stimmt, du hast Recht! Hab ich gar nicht drübernachgedacht. Was der 
Präprozessor macht, weiß ich eigentlich schon, das hab ich einfach nicht 
beachtet!
Vielen Dank für deine Hilfe schonmal!!!
Jetzt muss ich nur noch den einen Fehler hinbekommen, und ich denke das 
werde ich schon irgendwie schaffen.
Gruß, Steffen

von gast (Gast)


Lesenswert?

Ich tippe mal, dass du in den AVRStudio projekt einstellungen auswählen 
musst, dass du eine lib erstellen willst, denn woher soll das AVRStudio 
wissen? ;-)

Außerdem verweißt die Fehlermeldung auf ein (temporäres??)assembler File 
und nicht auf deinen C-Code

von Steffen O. (derelektroniker) Benutzerseite


Lesenswert?

gast wrote:
> Ich tippe mal, dass du in den AVRStudio projekt einstellungen auswählen
> musst, dass du eine lib erstellen willst, denn woher soll das AVRStudio
> wissen? ;-)

Wie stelle ich in den Projekt options ein, dass ich eine lib mache?
Hab ich bis jetzt da noch nicht entdeckt.....

> Außerdem verweißt die Fehlermeldung auf ein (temporäres??)assembler File
> und nicht auf deinen C-Code

Wie könnte ich das assembler File finden, um es zu untersuchen, bzw. wie 
wird es überhaupt erstellt? Ich habe nirgends wissentlich ein assembler 
File mit in das Projekt genommen, oder so.

Vielen Dank schon einmal im Voraus.
Gruß, Steffen

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.