mikrocontroller.net

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


Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: prog0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
#define SPI_PORT        PORTB  
#define SPI_PORT_DIR    DDRB
#define MISO            4
#define MOSI            3
#define SCK             5
#define CS              2   
#define BLANK           0
#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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steffen O. wrote:

> Ach ja, geht sowas in gcc:
>
> #define SPI_PORT        PORTB
> ...
> 
>
> 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.

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
 interrupt [TIM1_COMPA]; void timer1_compa_isr(void) 
und
 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
 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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:
>
 interrupt [TIM1_COMPA]; void timer1_compa_isr(void) 
> und
>
 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
 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.

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
>>
 interrupt [TIM1_COMPA]; void timer1_compa_isr(void) 
>> und
>>
 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

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
 #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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
 
c=5;
#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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steffen O. wrote:
>
> c=5;
> #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.
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.

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.