ATmega64: Zugriff DDR_ PORT_ in header files

Gast #4781674
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.
#4781683
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.
Gast #4781701
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)?
Gast #4781705
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.
Gast #4781735
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.
Gast #4781742
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 ...
Gast #4781795
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.
Gast #4781816
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 ...
Gast #4781827
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?
Angehängte Dateien:
Gast #4781884
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?
Gast #4782038
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.
Gast #4790370
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

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