Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[AVR] AVRlib + AVR Studio 4 > Wat doe ik fout

Pagina: 1
Acties:
  • 335 views sinds 30-01-2008
  • Reageer

  • Nijn
  • Registratie: Januari 2005
  • Laatst online: 21-11 09:22
-- Noob warning: Ik ben zo'n echte Windows freak, dit is dus mijn eerste aanvaring met GCC en consorten. Ervaring met (hogere) programeertalen heb ik wel, dus de structuur begrijp ik, maar... --

Ik probeer een grafisch LCD aan de praat te krijgen op een Atmel ATmega32. Inmiddels heb ik het al geprobeerd in Programmers Notepad en AVR Studio 4, maar ik loop steeds tegen hetzelfde probleem aan (is ook wel logisch, want ze gebruiken dezelfde compiler |:( ). Ben al een aantal avonden aan het speculeren en googelen geweest, maar ik kop er niet uit. Kan iemand mij misschien een duwtje in de juiste richting geven?

De code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
// test1.c
#include <avr/io.h> 
#include <glcd.h> //de basis-avrlib-lib voor lcd's
#include <ks0108.h> // de avrlib-lib voor mijn lcd

int main (void) 
{  
    // Teken een lijntje
    glcdLine(1,1,50,80);

    return 1;
}


Het resultaat:
code:
1
2
3
4
5
6
7
8
rm -rf TS2.o  TS2.elf dep/* TS2.hex TS2.eep
Build succeeded with 0 Warnings...
avr-gcc.exe -I"C:\AVR\avrlib" -I"C:\AVR\avrlib\conf" -I"C:\AVR\avrlib\rsl"  -mmcu=atmega32 -Wall -gdwarf-2  -O0 -fsigned-char -MD -MP -MT TS2.o -MF dep/TS2.o.d  -c  ../TS2.c
avr-gcc.exe -mmcu=atmega32  TS2.o   -L"C:\AVR\avrlib"   -o TS2.elf
TS2.o: In function `main':
../TS2.c:9: undefined reference to `glcdLine'
make: *** [TS2.elf] Error 1
Build failed with 1 errors and 0 warnings...


Wat heb ik bedacht?
1. Hij kan de bestanden niet vinden
>>> bestanden naar projectmap kopieren. Maar dat geeft hetzelfde effect. Bovendien, als ik voor de functie glcdLine te weinig argumenten opgeef begint ie daarover te klagen. Hij kan dus wel bij de bestanden. (Ik heb alle AVRlib mappen al geinclude in de projectconfig). Op internet wordt deze fout dan ook omschreven alszijnde een linkfout naar objecten? :S
2. Alle bestanden invoegen in het project
>>> Geen verandering
3. LIBavr 10x opnieuw installeren
>>> Kwaaie installer, verder niks ;)

Inmiddels denk ik dat ik dichter bij het probleem kom. De bestanden van de library (allemaal .c en .h bestanden) kunnen wel gevonden worden, maar op de een of andere manier zijn ze toch niet goed gelinkt. In AVR Studio include ik de AVRlib bestanden alszijnde externe componenten van m'n code, niet specifiek als library.


Wat doe ik fout?
- Is de library niet goed geinstalleerd? GCC zou toch moeten weten waar de library is, ik hoef hem dan toch helemaal niet te includen? (Als ik 'm niet specifiek include, geeft ie wel aan dat ie de bestanden gewoon niet kan vinden)
- Moet ik de library compileren? (Dus een .a bestand van maken???) Maar hoe dan?
- Moet ik de library anders includen? Er is wel een library sectie in de projectconfig, maar wat ik daar ook invul, er veranderd niks
- Moet ik iets met de makefile die bij AVRlib zit? Maar daar kan ik nergens de gegevens van m'n avr invullen enzo, hij lijkt wel incompleet. Moet ik die misschien includen in m'n huidige makefile? (en hoe)

Of moet ik gewoon overstappen op een andere compiler? GCC wordt in dit verband nogal onderuitgehaald op diverse sites. Maar welke compiler/IDE dan?

  • Sprite_tm
  • Registratie: September 2002
  • Laatst online: 29-10 06:07

Sprite_tm

Semi-Chinees

Het lijkt erop dat je niet tegen de avrlib-library zelf aanlinkt: in
avr-gcc.exe -mmcu=atmega32 TS2.o -L"C:\AVR\avrlib" -o TS2.elf
mist een -lavrlib oid. Je hebt de headers wel vrolijk geincluded, maar dat is alleen boeiend voor de syntax: de library, waar de eigenlijke code instaat, mis je dus nog.

Edit: IIRC heb je idd dus een libavr.a nodig. Zit er niet gewoon een Makefile bij de library? Zoja, run die, dan rolt er als 't goed is automagisch een libavr.a oid uit.

[ Voor 21% gewijzigd door Sprite_tm op 26-05-2007 15:41 ]

Relaxen und watchen das blinkenlichten. | Laatste project: Ikea Frekvens oog


  • StapelPanda
  • Registratie: Februari 2005
  • Laatst online: 19-11 11:29

StapelPanda

PB0MV

Hoi, ik heb weinig/geen kaas gegeten van AVR's, maar moet je je scherm niet initialiseren voordat je er iets op kan zetten, bijvoorbeeld poorten aan datalijnen toekennen enz??

op google vond ik dit:
glcdDisplayInit();


let op: code voor KLEUREN lcd
bron: http://www.mikrocontroller.net/topic/31403
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <inttypes.h>
#include "../glcd/glcd.h"
#include "../glcd/lfsr.h"
#include "../font/nums.h"
#include "../font/f9x14.h"
#include "../font/f15x22.h"
#include "../font/f8x11.h"
#include "../font/f8x8.h"

void demoScreen(void){
glcdSetOrientation(0);

    glcdFrame(0,0,130,175);
   glcdCircle( 80,80,10);
   glcdLine(90,80,100,100);
/// hier stond veel meer code ( dingen met kleur weggehaald)

 }


   int main(void) {
#define cnt  1

#ifndef USE_AUTOINIT
    glcdDisplayInit();
#endif

    glcdClearScreen(1);
//    glcdDisplayOn();

    uint8_t o = 0;

    demoScreen();

    while (1) {




    }
}

  • Sprite_tm
  • Registratie: September 2002
  • Laatst online: 29-10 06:07

Sprite_tm

Semi-Chinees

Blijkbaar heeft de lib ook een manier om het display automagisch te initten, kijk maar naar die #ifndef. Verder krijg je daar geen link-fout van; als het probleem daar zat zou je gewoon niets of complete crap op je display krijgen.

Relaxen und watchen das blinkenlichten. | Laatste project: Ikea Frekvens oog


  • Nijn
  • Registratie: Januari 2005
  • Laatst online: 21-11 09:22
Allereerst bedankt voor jullie reacties!

@sprite: Bedoel je misschien ook de ks0108.c en glcd.c includen? Dat heb ik nl. ook geprobeerd, maar dan krijg ik alleen nog maar meer van die fouten. (Voor iedere functie die in die 2 bestanden wordt aangeroepen om precies te zijn). De headers includen de .c bestanden toch?

@Gieltje: Die ben ik idd ook tegengekomen, maar het lijkt op een andere glcd te slaan. Mijn versie wordt volledig geconfigureerd in een config bestand.

  • Ethnocentrix
  • Registratie: Augustus 2002
  • Laatst online: 22:03

Ethnocentrix

Rijkserkend prutser

De .c files moet je idd niet includen. Het is niet zo dat de header files de .c fiules includen. Een header file bevat prototypes. Tijdens het compileren worden eerst alle .c files gecompileerd, en vervolgens worden door je linker alle bestanden aan elkaar geplakt.
[/theorie]

glcd.h en ks0108.h moeten in dezelfde directory staan als je code, en vervolgens moet je de headerfiles zo includen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
// test1.c
#include <avr/io.h> 
#include "glcd.h" //de basis-avrlib-lib voor lcd's
#include "ks0108.h" // de avrlib-lib voor mijn lcd

int main (void) 
{  
    // Teken een lijntje
    glcdLine(1,1,50,80);

        for (;;) asm("nop"); // wait forever
    return 0;
}

je gebruikt <> als je systeem headerfiles gebruikt, bijv. io/avr.h
Als je zelfgemaakte (of gedownloade) headerfiles gebuikt gebruik je aanhalingstekens.

Bovendien moet je return 0 gebruiken (1 betekent dat er een fout is opgetreden), en is het netjes om te zorgen dat de avr niet bij de return komt, door bijvoorbeeld een oneindige loop met NOP'jes te laten uitvoeren.

[ Voor 15% gewijzigd door Ethnocentrix op 26-05-2007 19:21 ]

You know you're an engineer if you have no life & can prove it mathematically.


  • Sprite_tm
  • Registratie: September 2002
  • Laatst online: 29-10 06:07

Sprite_tm

Semi-Chinees

En om het verhaal van Ethnocentrix even af te maken: Die .h-bestanden beschrijven alleen welke functies de compiler tegen kan komen die niet gedeclareerd zijn in het .c-bestand die het include't: functies als glcdLine() moeten dus ergens anders vandaan komen. Dat kan een .o-bestand zijn (een object-file, zeg maar een in dezelfde run gecompileerde, maar verschillend .c-bestand) of een library (extensie .a; meestal als een apart project bijgeleverd). In jouw geval is het waarschijnlijk het tweede. Je moet dus: 1. Het .a-bestand zien te vinden of maken. Zoals ik al zei: waarschijnlijk kom je met het runnen van 'make' terwijl je in de library-directory staat al een heel eind. Zoniet: rtfm, 't staat vast wel ergens beschreven. Het tweede is om die library mee te laten linken; die optie staat vast wel ergens in je gui maar uiteindelijk moet het tot gevolg hebben dat je link-slag er zo uit komt te zien, ongeveer:
avr-gcc.exe -mmcu=atmega32 TS2.o -L"C:\AVR\avrlib" -lavrlib -o TS2.elf
waarbij -lavrlib aangeeft dat het bestand libavrlib.a meegelinkt dient te worden. Zo duidelijk?

Relaxen und watchen das blinkenlichten. | Laatste project: Ikea Frekvens oog


  • Nijn
  • Registratie: Januari 2005
  • Laatst online: 21-11 09:22
Edit: Had even moeten refreshen... Sprite, helemaal duidelijk (denk ik). Ik ga weer puzzelen. Er is helemaal geen .a bestand, maar ik ga wel ff googelen om uit te zoeken hoe dat te maken valt. (make in de directory had ik al geprobeerd, dat is 'm niet). Helaas is de manual van libavr niets meer dan een opsomming van de functies en een zeer beknopte uitleg van instalatie, dus daar heb ik weinig aan :( Ik denk dat ik in de GUI trouwens gevonden heb waar ik die .a kan opgeven, dus er is weer hoop ^^

Ok, mijn "opstelling" nu:

C:\AVR\TS3
TS3.c
ks0108.h
glcd.h

C:\AVR\avrlib & C:\AVR\avrlib\conf (daar staat het config bestandje)
ks0108.c
glcd.c
[en alle overige header files die door ks0108.h en glcd.h ge-include worden]

TS3.c:
[code]
// TS3.c
#include <avr/io.h>
#include "glcd.h" //de basis-avrlib-lib voor lcd's
#include "ks0108.h" // de avrlib-lib voor mijn lcd

int main (void)
{
// Teken een lijntje
glcdLine(1,1,50,80);

for (;;) asm("nop"); // wait forever
return 0;
}
[/code]

Result:
[code]
rm -rf TS3.o TS3.elf dep/* TS3.hex TS3.eep
Build succeeded with 0 Warnings...
avr-gcc.exe -I"C:\AVR\avrlib" -I"C:\AVR\avrlib\conf" -mmcu=atmega128 -Wall -gdwarf-2 -O0 -MD -MP -MT TS3.o -MF dep/TS3.o.d -c ../TS3.c
avr-gcc.exe -mmcu=atmega128 TS3.o -o TS3.elf
TS3.o: In function `main':
../TS3.c:9: undefined reference to `glcdLine'
make: *** [TS3.elf] Error 1
Build failed with 1 errors and 0 warnings...
[/code]

Moet ik echt niet ergens die .c bestanden includen? Wat ik denk dat er namelijk gebeurt is het volgende:
glcd.h include aaa.h, bbb.h, ccc.h. ccc.h include vervolgens weer ddd.h en eee.h.
Zelfde recursieve gedoe voor ks0108.h.
Aan het einde worden er dus een stuk of 10 .h bestanden geinclude. (Die worden door AVR Studio 4 dan ook automagisch weergegeven als external dependency's). Dus worden er bergen met functies gedefineerd in die header files, waaronder glcdLine. Maar die functies krijgen geen inhoud omdat nergens de .c bestanden erbij worden gehaald. Correct me if I'm wrong, maar anders zouden die toch ook wel verschijnen als external dependency's?

[ Voor 12% gewijzigd door Nijn op 26-05-2007 20:14 ]


  • Nijn
  • Registratie: Januari 2005
  • Laatst online: 21-11 09:22
Ik ben er eindelijk uit!!!

|:( Te simpel voor woorden. :|

De nieuwste WinAVR doet blijkbaar iets anders op een bepaald punt. 1 versie eerder werkt perfect! (Zonder duidelijke versiejump :()

Stom dat ik dat niet eerder heb nagekeken

Verwijderd

hebben ze dat nu nog niet gefixt?
ik geloof dat ze van avrstudio wel met het probleem bezig zijn. (avrstudio is nog niet aan de nieuwe winavr aangepast)

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Er waren wel problemen met de nieuwe WinAVR (ondertussen de op een na laatste, want vorige week is een nieuwe uitgekomen) in combinatie met AVR Studio 4.12, maar de 4.13 beta is al tijden uit en ook al een tijdje officieel (niet-beta). Die heeft geen problemen met de nieuwere WinAVR (20070122 en 20070525). Maar de problemen die daar met 4.12 waren lijken niet op de problemen uit dit topic.

www.madwizard.org


Verwijderd

*checkt versie...
... :$ ...
*druipt weer af :P
Pagina: 1