Forum: Mikrocontroller und Digitale Elektronik IAR Workbench


von Ralf (Gast)


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

von Michael (Gast)


Lesenswert?

zu Frage 1:

#define bit_0 0x01
#define bit_1 0x02
...
#define bit_7 0x80

// bit setzen
PORTX = PORTX | bit_0

//bit löschen
PORTX = PORTX &~ bit_0

zu 2:
indem du die ganze C-Datei einbindest, und zwar unter Projekt  Files
add

Michael

von Sebastian (Gast)


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.

von Ralf (Gast)


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

von Markus (Gast)


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

von OldBug (Gast)


Lesenswert?

Bitmanipulationen sind doch schon in der C-Bibel beschrieben :-)

Bit setzen:

regvar |= (1 << bit)

Löschen:

regvar &= ~(1 << bit)

Exklusiv-Oder:

regvar ^= (1 << bit)

...usw...

von Ralf (Gast)


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

von Sebastian (Gast)


Lesenswert?

@Markus: Oh, stimmt. Es musste natürlich

P1OUT|=4;

heissen.

von Michael (Gast)


Lesenswert?

@ Ralf:

eine XXX.C Datei ist meines Wissens nicht zu includen. Mach es doch im
Projekt unter add file. Evtl funzt das.
Michael

von Sebastian (Gast)


Lesenswert?

Doch, C-Files kann man auch includen. Der include-Befehl macht nix
anderes als den Inhalt der Datei 1:1 reinzukopieren. Ob das eine H-
oder C-Datei ist, ist dem Präprozessor egal.

von Christof Krüger (Gast)


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.

von Sebastian (Gast)


Lesenswert?

Joo, so macht man es eigentlich. Aber ich wollte irgendwann mal meinen
Code etwas übersichtlicher machen und habe aus Faulheit ein paar
LCD-Routinen in eine externe lcd.c geschoben und in der main.c dann

#include "lcd.c";

gemacht. Das geht schon einwandfrei ... Ob es schön ist, ist die andere
Frage. ;-)

von Christof Krüger (Gast)


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 ;)

von Guillermo B. (benites)


Lesenswert?

Hallo,
Ich arbeitet mit dem C-Compiler von IAR, um einen AVR ATmega88
Mikrokontroller zu programmieren.

Ich wollte fragen, ob jemand mir die Datei "iom88.h" schicken kann,
weil diese versehentlich gelöscht wurde.
Danke im Voraus

Benites

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.