Forum: Mikrocontroller und Digitale Elektronik Problem Atmel Studio und ATMega324P - SPI


von Stefan D. (mackie05)


Lesenswert?

Hallo, ich habe heute ein Programm zur Ansteuerung eines Displays über 
SPI getestet. Der Zielprozessor ist ein ATMega324P. Beim Compilieren im 
AtmelStudio(6.1.2730 SP2) bekomme ich folgende Fehlermeldungen:

'SPCR' was not declared in this scope
'SPE' was not declared in this scope

so geht es weiter für alle SPI spezifischen Ausdrücke (MSTR, SPR1, SPR0 
etc.)

Das Eigenartige: Wenn ich die Zielhardware unter "Device" auf einen 
ATMega644P (also gleiche Familie nur mehr Speicher) ändere läuft das 
Compilieren fehlerfrei. Woran kann das liegen?

Danke

Hier noch die Fehlermeldungen:

------ Build started: Project: Display_Test, Configuration: Debug AVR 
------
Build started.
Project "Display_Test.cppproj" (default targets):
Target "PreBuildEvent" skipped, due to false condition; 
('$(PreBuildEvent)'!='') was evaluated as (''!='').
Target "CoreBuild" in file "C:\Program Files (x86)\Atmel\Atmel Studio 
6.1\Vs\Compiler.targets" from project 
"C:\Users\Mackie-2011\Dropbox\Messtechnik\GPS_Counter\Display_Test\Displ 
ay_Test\Display_Test.cppproj"  (target "Build" depends on it):
  Task "RunCompilerTask"
    C:\Program Files (x86)\Atmel\Atmel Studio 6.1\shellUtils\make.exe 
all
    Building file: .././Display_Test.cpp
    Invoking: AVR8/GNU C Compiler : 3.4.2
    "C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 
GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-g++.exe" 
-funsigned-char -funsigned-bitfields -DDEBUG  -O1 -ffunction-sections 
-fdata-sections -fpack-struct -fshort-enums -g2 -Wall -mmcu=atmega324p 
-c -MD -MP -MF "Display_Test.d" -MT"Display_Test.d" -MT"Display_Test.o" 
-o "Display_Test.o" ".././Display_Test.cpp"
    .././Display_Test.cpp: In function 'void InitSPI()':
C:\Users\Mackie-2011\Dropbox\Messtechnik\GPS_Counter\Display_Test\Displa 
y_Test\Display_Test.cpp(97,1):  'SPCR' was not declared in this scope
C:\Users\Mackie-2011\Dropbox\Messtechnik\GPS_Counter\Display_Test\Displa 
y_Test\Display_Test.cpp(97,13):  'SPE' was not declared in this scope

von holger (Gast)


Lesenswert?

>Woran kann das liegen?

Versuchs mal mit

SPCR0
SPE0

von Stefan D. (mackie05)


Lesenswert?

Hallo Holger, die Fehlermeldungen kommen ja für alle SPI bezogenen 
Ausdrücke.Hab nur nicht die komplette Liste angehängt. Ausserdem 
besitzen der 324p und der 644p den gleichen Befehlssatz und beim 644p 
geht es problemlos.
Evtl. kann die Makefile nicht mit dem 324p umgehen?

von holger (Gast)


Lesenswert?

>Evtl. kann die Makefile nicht mit dem 324p umgehen?

Doch, kann es. Die Bezeichnungen für SPI sind beim 324p auch
bei meinem Compiler in den Headerdateien anders.
Eben mit der '0' am Ende. Warum das so ist?

von spess53 (Gast)


Lesenswert?

Hi

>Doch, kann es. Die Bezeichnungen für SPI sind beim 324p auch
>bei meinem Compiler in den Headerdateien anders.
>Eben mit der '0' am Ende. Warum das so ist?

Der ATMega324P und der ATMega644P haben/hatten das gleich Datenblatt. 
Und da gab/gibt es nichts mit einer Null in den Registerbezeichnungen.

MfG Spess

von Stefan D. (mackie05)


Lesenswert?

Holger, Du hast Recht, mit der Null geht's problemlos. Da soll mal einer 
drauf kommen, wenn das Datenblatt abweicht.

Wo finde ich denn die Headerdateien?

von Thomas E. (thomase)


Lesenswert?

Das Ganze klingt natürlich völlig hirnrissig. Ist aber tatsächlich so.

Normalerweise wird die typspezifische iom.h eingebunden und von dieser 
die allgemeingültige iomxx4.h.

Das ist aber nicht immer so. Bei mir wird von der iom324pa.h die 
iomxx4.h nicht eingebunden, sondern alles ist in der iom324pa.h 
definiert. Und zwar so, wie es vom TO beschrieben wird.
Beim 644PA wird die iomxx4.h ebenfalls nicht eingebunden, dafür sind 
aber die Definitionen in der iom644pa.h richtig.
Kompiliere ich für 324A oder 324P wird wieder die iomxx4.h eingebunden 
und alles ist gut.

Da ist irgendwie der Wurm drin. Aber richtig.

Um nicht ständig hin und her probieren zu müssen, könnte man eine 
Headerdatei als Würgaround mit einbinden:
1
#ifndef SPCR
2
  #define SPCR SPCR0
3
#endif
4
5
#ifndef SPDR
6
  #define SPDR SPDR0
7
#endif

sowas geht mit Copy & Paste recht fix.

mfg.

von Stefan D. (mackie05)


Lesenswert?

Das müsste man dann aber für alles machen, also auch MSTR, SPE etc. 
Eventuell ist das ja in einer neueren AtmelStudio Version behoben...

von Thomas E. (thomase)


Lesenswert?

Stefan D. schrieb:
> Das müsste man dann aber für alles machen, also auch MSTR, SPE
> etc.
Daran wirst du nicht sterben.

> Eventuell ist das ja in einer neueren AtmelStudio Version behoben...
Das machen dann andere Leute in ihrer Freizeit für dich.

Das hat allerdings mit der Atmel Studio Version nichts zu tun. Die 
Headerdateien gehören zur Toolchain.

mfg.

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.