Forum: Mikrocontroller und Digitale Elektronik ATmega64: Zugriff DDR_ PORT_ in header files


von Franz (Gast)


Lesenswert?

Hallo,

ich versuche ein Programm für einen ATMega64 zu schreiben. Dazu habe ich 
ein Testprogramm für eine LED programmiert welches einwandfrei 
funktioniert:
1
int main(void)
2
{
3
  DDRC |= (1<<PC0);
4
  PORTC |= (1<<PC0);
5
6
    while (1) 
7
    {
8
    _delay_ms(1000);
9
    PORTC ^=(1<<PC0);
10
    }
11
}

Versuche ich dieses Programm nun aufzuteilen in:
1
#include "IncFile1.h"
2
3
int main(void)
4
{
5
  void init()
6
7
    while (1) 
8
    {
9
    _delay_ms(1000);
10
    PORTC ^=(1<<PC0);
11
    }
12
}

und
1
#ifndef INCFILE1_H_
2
#define INCFILE1_H_
3
4
#include <avr/io.h>
5
#include <util/delay.h>
6
7
void init()
8
{
9
  DDRC |= (1<<PC0);
10
  PORTC |= (1<<PC0);
11
}
12
13
14
#endif /* INCFILE1_H_ */

funktioniert die init() Routine, jedoch kann ich anschließend den 
IO-Port nicht mehr toggeln.

Weiß jemand wo hier der Fehler liegt? Ich würde mein Programm gerne in 
mehrere .h und .c/.cpp files aufteilen, vielleicht gibt es hierzu eine 
andere Methode.


Danke für die Hilfe im Voraus.

von Jim M. (turboj)


Lesenswert?

Franz schrieb:
> int main(void)
> {
>   void init()
>
>     while (1)
>     {
>     _delay_ms(1000);
>     PORTC ^=(1<<PC0);
>     }
> }


Das gibt keine Warning oder Error im Compiler..?
Hmm hier gibt das:
1
error: expected declaration specifiers before ‘while’
2
     
3
error: expected declaration specifiers before ‘}’ token


Hint: init() wird innerhalb von main() deklariert. Das ist mit 
ziemlicher Sicherheit falsch.
Vermutlich wolltest Du schreiben:
1
int main(void)
2
{
3
    init();
4
5
    while (1) 
6
    {
7
    _delay_ms(1000);
8
    PORTC ^=(1<<PC0);
9
    }
10
  return 0;
11
}

Das ist für den Compiler was ganz anderes!

Note: Anfänger detected.
Besorge Dir mal ein gutes C Buch und lies es. C ist nicht 
selbsterklärend.

: Bearbeitet durch User
von Franz (Gast)


Lesenswert?

Sorry war ein Tippfehler in meinem Post natürlich habe ich
1
init();
 geschrieben :D

Der Code funktioniert leider trotzdem nicht.

von Dieter F. (Gast)


Lesenswert?

Jim M. schrieb:
> Hint: init() wird innerhalb von main() deklariert. Das ist mit
> ziemlicher Sicherheit falsch.

Warum? Außer das er das Semikolon vergessen hat sehe ich da kein 
Problem. Er braucht keinen Funktionsprototypen - im Include hat er die 
Funktion bekanntgegeben.

Ich vermisse F_CPU ... irgendwie (neben dem Semikolon) ... was sagt denn 
der Compiler (und womit arbeitest Du)?

von Nebelstocherer (Gast)


Lesenswert?

Jim M. schrieb:
> Note: Anfänger detected.

Yes.

Und in *.h Files tut man keinen Code hineintun. Das
ist eine böse Unsitte die nur Schwierigkeiten und
Unklarheiten erzeugt.

In *.h Files gehören nur die Funktions-Prototypen,
Konstanten und Defines.

Die höheren Künste beinhalten dann noch Inline Code.

von Franz (Gast)


Lesenswert?

F_CPU ist mit 100000000 per default definiert. Bringt aber eine warning 
welche aber kein Problem darstellen sollte.

Ich wollte eine kurzes Testprogramm schreiben. Die Endversion ist 
natürlich in *.c und *.h files geteilt.


Ich arbeite aktuell mit AtmelStudio 7.0 (Windows 10) und habe auf einem 
2. PC mit AtmelStudio 6.2 den selben Code getestet. (beide Male das 
selbe Ergebnis)

Zum programmieren des Atmega64 verwende ich einen ISP-Programer.
Der Compiler hat nur die Warning mit F_CPU. (welche ich jetzt auch 
beseitigt habe.)
Das Programm lässt sich auch ohne Probleme hochladen, jedoch 
funktioniert es bei der Ausführung am µC nicht mehr.

von Dieter F. (Gast)


Lesenswert?

Franz schrieb:
> 100000000

Kann ich den bitte haben? Meine AVR's sind lange nicht so schnell. Ist 
das ein neuer Prototyp?

Franz schrieb:
> Bringt aber eine warning
> welche aber kein Problem darstellen sollte.

Zeig die doch bitte mal.

Franz schrieb:
> Ich wollte eine kurzes Testprogramm schreiben. Die Endversion ist
> natürlich in *.c und *.h files geteilt.

Kannst Du die bitte hier einstellen?

Franz schrieb:
> Der Compiler hat

Welcher - womit arbeitest Du? AVRStudio - welche Version? ...

Mit der korrekten F_CPU-Angabe und dem Semikolon läuft es zumindest im 
Simulator ... also zeige bitte ALLE Meldungen des Compilers etc ...

von Franz (Gast)


Lesenswert?

Ok nochmal meine Programme:

Das funktionierende Programm: (bestehend aus main.c und miscellaneous.h)
========================================================================

miscellaneous.h
1
#ifndef MISCELLANEOUS_H_
2
#define MISCELLANEOUS_H_
3
4
#define SET_BIT(PORT,PIN)      PORT |= (1<<PIN)
5
#define CLEAR_BIT(PORT,PIN)      PORT &= ~(1<<PIN)
6
#define GET_BIT(PORT,PIN)      ((PORT>>PIN) & 0x01)
7
#define TOGGLE_BIT(PORT,PIN)    PORT ^= (1<<PIN)
8
9
10
#endif /* MISCELLANEOUS_H_ */

main.c
1
#define F_CPU 1000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include "miscellaneous.h"
6
7
int main(void)
8
{
9
  SET_BIT(DDRC,PC0);
10
  SET_BIT(PORTC,PC0);
11
    while (1) 
12
    {
13
    _delay_ms(1000);
14
    TOGGLE_BIT(PORTC,PC0);
15
    }
16
}


Das nicht funktionierende Programm: (bestehend aus main.c, 
miscellaneous.h, TestFile.h und TestFile.c)
========================================================================

miscellaneous.h
1
#ifndef MISCELLANEOUS_H_
2
#define MISCELLANEOUS_H_
3
4
#define SET_BIT(PORT,PIN)      PORT |= (1<<PIN)
5
#define CLEAR_BIT(PORT,PIN)      PORT &= ~(1<<PIN)
6
#define GET_BIT(PORT,PIN)      ((PORT>>PIN) & 0x01)
7
#define TOGGLE_BIT(PORT,PIN)    PORT ^= (1<<PIN)
8
9
10
#endif /* MISCELLANEOUS_H_ */

main.c
1
#define F_CPU 1000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include "TestFile.h"
6
7
int main(void)
8
{
9
  InitIO();
10
    while (1) 
11
    {
12
    _delay_ms(1000);
13
    ToggleIO();
14
    }
15
}

TestFile.h
1
#ifndef TESTFILE_H_
2
#define TESTFILE_H_
3
4
#include "miscellaneous.h"
5
#include <avr/io.h>
6
#include <util/delay.h>
7
8
void InitIO();
9
void ToggleIO();
10
11
12
#endif /* TESTFILE_H_ */


TestFile.c
1
 #include "TestFile.h"
2
3
 void InitIO()
4
 {
5
   SET_BIT(DDRC,PC0);
6
   SET_BIT(PORTC,PC0);
7
 }
8
9
 void ToggleIO()
10
 {
11
   TOGGLE_BIT(PORTC,PC0);
12
 }


=====================================
Atmel Studio Version 7.0.1006
Keine Warnings und Errors
Das Programm lässt sich auf den ATMega64 hochladen, funktioniert jedoch 
bei meiner 2. Version leider nicht.

von Franz (Gast)


Lesenswert?

Ach ja der Simulator bringt das selbe Ergebnis

von Dieter F. (Gast)


Lesenswert?

Pack

#include "miscellaneous.h

mal in Dein TestFile.c

Warum willst Du Header-Dateien mehrfach schachteln?

von Franz (Gast)


Lesenswert?

Ok Danke,
ändert aber nichts am Ergebnis.

von Dieter F. (Gast)


Lesenswert?

Franz schrieb:
> Ok Danke,
> ändert aber nichts am Ergebnis.

Wo ist denn Dein Testfile.c ?

Es wäre wirklich praktisch, wenn Du etwas mehr Informationen zu 
Compiler, Entwicklungsumgebung etc. schreiben würdest. Auch die 
Verzeichnisstruktur incl. Dateien wäre interessant. Wenn ich Hilfe will, 
poste ich alles, was ich habe ... incl. der Dateien im "downloadbaren" 
Format. Nicht jeder macht sich die Mühe mit Copy and Paste ...

von Franz (Gast)


Angehängte Dateien:

Lesenswert?

Ok
anbei mein gesamtes Testprojekt.
Wie bereits erwähnt verwende ich AtmelStudio 7.0.1006.
Leider weiß ich nicht genau wie ich unter Windows die Compilerversion 
herrausfinde (ich vermute AtmelStudio verwendet gcc oder?)

Zum Programmieren verwende ich
http://www.diamex.de/dxshop/Diamex-ALL-AVR-ISP-Programmer

Falls es Hilft die gesetzten Fuses
CompMode = [X]
WDTON = [ ]
OCDEN = [ ]
JTAGEN = [X]
SPIEN = [X]
EESAVE = [X]
BOOTSZ = 4096W_7000
BOOTRST = [ ]
CKOPT = [ ]
BODLEVEL = 2V7
BODEN = [ ]
SUT_CKSEL = INTRCOSC_1MHZ_6CK_64MS

EXTENDED = 0xFD (valid)
HIGH = 0x91 (valid)
LOW = 0xE1 (valid)


LB = NO_LOCK
BLB0 = NO_LOCK
BLB1 = NO_LOCK

LOCKBIT = 0xFF (valid)




Welche Informationen wären sonst noch Interessant?

von Franz (Gast)


Lesenswert?

Mich würde auch interessieren, ob dieses Programm bei irgendjemandem 
funktioniert.

von FlashDr (Gast)


Lesenswert?

Falsche Frage :-)

Das Programm ist in beiden Versionen ja völlig richtig. Die nicht 
optimal platzierten Includes sollten keinen Fehler verursachen.

Also wäre die Frage zu stellen: Bei wem funktioniert es auch nicht?

von Roland F. (rhf)


Lesenswert?

Hallo,

Füge mal hinter der Zeile

    #include <avr/io.h>

die Zeile

    #include <avr/iom64.h>

ein.

rhf

von holger (Gast)


Lesenswert?

Vieleicht flasht da jemand schon die ganze Zeit
die falsche HEX-Datei;)

von Georg G. (df2au)


Lesenswert?

Roland F. schrieb:
> Füge mal hinter der Zeile
>
>     #include <avr/io.h>
>
> die Zeile
>
>     #include <avr/iom64.h>

io.h bringt automatisch die zum CPU-Typ passende Header Datei.

von Dieter F. (Gast)


Lesenswert?

Ähm ... Du musst TestFile.c (in TestFile.h) auch includieren - das ist 
keine Library ...

Aber das sollten Deine Meldungen (welche Du nicht gezeigt hast) auch 
anmeckern ...

von Nebelstocherer (Gast)


Lesenswert?

Dieter F. schrieb:
> Ähm ... Du musst TestFile.c (in TestFile.h) auch includieren - das ist
> keine Library ...

Nix *.c inkludieren. Käse.

Eine C-Datei trägt man in das Projekt als zu compilierendes
Modul ein welches dann üblicherweise vom Compiler separat
übersetzt und vom Linker mit eingebunden wird.

von Dieter F. (Gast)


Lesenswert?

Nebelstocherer schrieb:
> Eine C-Datei trägt man in das Projekt als zu compilierendes
> Modul ein welches dann üblicherweise vom Compiler separat
> übersetzt und vom Linker mit eingebunden wird.

Zeig mal (Atmel Studio) - oder stocher weiter ...

von FlashDR (Gast)


Lesenswert?

Habe ich das oben richtig gesehen und der ATMega 46 läuft im 
Compatibility Mode?

von Dieter F. (Gast)


Lesenswert?

FlashDR schrieb:
> der ATMega 46

Du bist im falschen Thread - hier geht es um den ATMega64

von FlashDr (Gast)


Lesenswert?

tja, Tippfuhler.

Trotzdem vielleicht mal den CompMode ausschalten :-)

von Roland F. (rhf)


Lesenswert?

Hallo Georg,

> io.h bringt automatisch die zum CPU-Typ passende Header Datei.

Da hast du natürlich recht, aber dann müsste doch auch irgendwo im 
Quelltext angegeben sein welcher Prozessor verwendet wird. Oder habe ich 
da was falsch verstanden?

rhf

von Dieter F. (Gast)


Lesenswert?

Roland F. schrieb:
> Da hast du natürlich recht, aber dann müsste doch auch irgendwo im
> Quelltext angegeben sein welcher Prozessor verwendet wird. Oder habe ich
> da was falsch verstanden?

Im Atmel Studio gibt man das bei den Properties an dann wird die 
passende io.h gezogen.

von Franz (Gast)


Lesenswert?

Danke für die Hilfe (am Ende :D) ich hatte erst wieder heute Zeit zum 
testen.

Danke an FlashDR ich habe den CompatibilityMode deaktiviert und nun 
funktioniert er.
Jedoch wäre für mich noch interessant warum dieses Problem bei diesem 
Mode auftritt. Weiß da jemand warum das so ist?

Mit freundlichen Grüßen

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.