IAR Workbench

Gast #98940
Lesenswert?

Hallo!

Ich habe zwei kleine Fragen zur Entwicklungsumgebung IAR Embedded
Workbench für AVR...

1. Ich brauche eine Funktion, die nur ein Bit eines Ports setzt. Ich
übergebe ihr also bsp. PORTD und 3 und die Funktion soll dann PD3
setzen. Gibt es da fertige Funktionen oder muss man das selbst coden?

2. Wie kann man Funktionen aus einer anderen C Datei einbinden? Mit
"extern" hab ich es nicht hingekriegt ...

Die Dokumentation zu diesem Programm sowie die Hilfe und die Tutorials
lassen sehr zu wünschen übrig ...

Danke!
Grüße Ralf
Gast #98942
Lesenswert?

Hi Ralf,

ich benutze die IAR Workbench in meinen Projekten. Vielleicht hilft dir
also schon ein Blick in den ein oder anderen meiner Sourcecodes weiter
... (www.mathar.com)

Zu deinen Fragen: Ein einzelnes Bit (z.B. Nummer 3) setzt man über

P1OUT|=3;

Deine Funktion wäre also einfach

void SetBit(char* portname, char bit)
{
  switch (portname)
  // hier jetzt alle deine Ports rein ...
  // z.B. bei PORTD:

  PORTD|=bit;

  // und weiter mit allen anderen Ports ...
}

Einbinden von externen Sourcen geht normalerweise einfach über
#include. Oder was möchtest du? Du kannst (musst aber nicht, je nach
Compilereinstellungen) den Prototypen über "extern" deklarieren. Das
eigentliche Einbinden geht aber über #include.
Gast #98943
Lesenswert?

Ok, ich habe jetzt eine weitere Datei angelegt und ein paar C Funktionen
inkludiert ...

Wenn ich jetzt in die Hauptdatei schreibe
#include <access.c>


dann erscheint beim kompilieren Fehlermeldungen, dass PORTB etc. nicht
deklariert ist.

Wenn ich dann in der acccess.c auch die iom8515.h inkludiere, dann
erscheinen warnings (redefinitions).

Was mach ich da falsch?

Grüße Ralf
Gast #98944
Lesenswert?

@ Ralf

wenn du die neueste Version 3.20 verwendest, dann probier mal unter
Project-> Options-> General -> Library Configurations ein Häkchen zu
setzen bei "Enable bit definitions in IO-Include files". Dann sollte
das klappen mit dem Erkennen von PORTB usw.
Bei einer anderen Version muß das auch irgendwo da einstellbar sein.

@Sebastian

"Zu deinen Fragen: Ein einzelnes Bit (z.B. Nummer 3) setzt man über

P1OUT|=3;"

das setzt doch Bit0 und Bit1 und nicht das dritte Bit, oder? Ich denke
so wie es Michael beschrieben hat ist es richtig.

Gruß
Markus
Gast #98946
Lesenswert?

Ich hab die neue Version und habe das Häkchen gesetzt. Leider ändert es
gar nichts an den Fehlermeldungen ...

in der Maindatei hab ich so die Headerfiles inkludiert:

#define ENABLE_BIT_DEFINITIONS 1

#include <iom8515.h>
#include <inavr.h>
#include <stdbool.h>

#include "access.c"

Und in der access.c dann nichts mehr deklariert. So kommen die Fehler
"Error: Identifier PORTB is undefined"

Grüße
Ralf
Gast #98950
Lesenswert?

Seit wann included man c-files?
Ich kann auch rückwärts auf der Autobahn fahren, das geht auch, deshalb
mache ich es aber noch lange nicht ;)

Kenne mich jetzt zwar nicht mit IAR aus, aber generell included man
header-files und die c-files werden einzeln kompiliert und dann erst
durch den Linker "gelinkt".

Das steht in den erste paar Kapiteln jedes halbwegs brauchbaren
c-buches.
Gast #98952
Lesenswert?

Naja, "übersichtlicher" wäre es folgendermaßen:

Du lagerst bestimmte Routinen in eine lcd.c aus, evtl. hast du dann
auch Hilfsprozeduren drin, die von aussen gar nicht benutzt werden, die
machst du dann static. Wenn du die lcd.c dann fertig hast, hast du ja
paar Funktionen als Interface. Die schreibst du in eine lcd.h, am
besten mit paar Kommentaren, wie die Funktionen zu benutzen sind. Dann
schreibst du in der .c-Datei, die deine lcd-Routinen benutzen soll
#include "lcd.h"
und fügst die lcd.c in dein Projekt ein, so dass der Compiler die lcd.c
kompiliert und der Linker das Object-File mitlinkt.

DAS ist übersichtlich ;)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren