Forum: Mikrocontroller und Digitale Elektronik Problem mit CLKPR im AtmelStudio 7


von P.Z. (Gast)


Lesenswert?

Hallo, ich versuche einen Clockprescaler bei einem ATMEGA48P, mit 
AtmelStudio 7[neuste Version], zu setzten. Leider läuft der Build nicht 
durch.
1
#include <stdint.h>      // Einbinden von stdint.h
2
#include <avr/io.h>      // Einbinden von io.h
3
#include <avr/interrupt.h>  // Einbinden von interrupt.h
4
#define F_CPU 1000000UL    // Frequenz:1 MHz
5
#include <util/delay.h>    // Einbinden von delay.h
6
7
....
8
9
CLKPR = (1<<CLKPCE); // Enable change of CLKPS bits
10
CLKPR = (1<<CLKPS1); // Set prescaler to 4 and system clock to 1 MHz
11
12
.....

Mit auskommentieren der zwei Zeilen läuft der Build sauber durch. 
(WinAVR[neuste Version] reagiert ebenfalls so.)

Beim Verwenden der power.h passiert ebenfalls dasselbe.

Im Build-Prozess bekomme ich folgenden Fehler, den ich leider nicht ganz 
nachvollziehen kann.
1
Build started.
2
Project "Kettenoeler.cproj" (default targets):
3
Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!='').
4
Target "CoreBuild" in file "C:\Program Files (x86)\Atmel\Studio\7.0\Vs\Compiler.targets" from project "...\Atmel Studio\7.0\Kettenoeler\Kettenoeler\Kettenoeler.cproj" (target "Build" depends on it):
5
  Task "RunCompilerTask"
6
    Shell Utils Path C:\Program Files (x86)\Atmel\Studio\7.0\shellUtils
7
    C:\Program Files (x86)\Atmel\Studio\7.0\shellUtils\make.exe all --jobs 8 --output-sync 
8
    Building file: .././main.c
9
    Invoking: AVR/GNU C Compiler : 5.4.0
10
    "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-gcc.exe"  -x c -funsigned-char -funsigned-bitfields -DDEBUG  -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.150\include"  -O1 -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -g2 -Wall -mmcu=atmega48p -B "C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.150\gcc\dev\atmega48p" -c -std=gnu99 -MD -MP -MF "main.d" -MT"main.d" -MT"main.o"   -o "main.o" ".././main.c" 
11
...\Atmel Studio\7.0\Kettenoeler\Kettenoeler\Debug\Makefile(79,1): error: recipe for target 'main.o' failed
12
    In file included from c:\program files (x86)\atmel\studio\7.0\toolchain\avr8\avr8-gnu-toolchain\avr\include\avr\io.h:99:0,
13
                     from .././main.c:14:
14
...\Atmel Studio\7.0\Kettenoeler\Kettenoeler\main.c(22,1): error: expected identifier or '(' before 'volatile'
15
     CLKPR = (1<<CLKPCE); // Enable change of CLKPS bits
16
     ^
17
...\Atmel Studio\7.0\Kettenoeler\Kettenoeler\main.c(22,1): error: expected ')' before '(' token
18
     CLKPR = (1<<CLKPCE); // Enable change of CLKPS bits
19
     ^
20
...\Atmel Studio\7.0\Kettenoeler\Kettenoeler\main.c(23,1): error: expected identifier or '(' before 'volatile'
21
     CLKPR = (1<<CLKPS1); // Set prescaler to 4, and system clock to 1 MHz
22
     ^
23
...\Atmel Studio\7.0\Kettenoeler\Kettenoeler\main.c(23,1): error: expected ')' before '(' token
24
     CLKPR = (1<<CLKPS1); // Set prescaler to 4, and system clock to 1 MHz
25
     ^
26
    make: *** [main.o] Error 1
27
  Done executing task "RunCompilerTask" -- FAILED.
28
Done building target "CoreBuild" in project "Kettenoeler.cproj" -- FAILED.
29
Done building project "Kettenoeler.cproj" -- FAILED.

von M. K. (sylaina)


Lesenswert?

Hast du schon mal versucht den Code so zu reduzieren, dass du nur den 
CLKPR ändern willst und hat das einen Effekt?
Was steht vor und nach dem Code? Ich denke das eigentliche Problem liegt 
im nicht gezeigten Code.

von Beo Bachta (Gast)


Lesenswert?

P.Z. schrieb:
> CLKPR = (1<<CLKPCE); // Enable change of CLKPS bits
> CLKPR = (1<<CLKPS1); // Set prescaler to 4 and system clock to 1 MHz

Ich weiss nicht was du sonst noch alles falsch nachst aber diese
beiden Zeilen tun vermutlich nicht was du willst.

In der ersten Zeile setzt du im Register genau ein Bit, alle
anderen werden gelöscht.
In der zweiten Zeile setzt du im Register genau ein Bit, alle
anderen werden gelöscht.

Das heisst in der zweiten Zeile machst du alles kaputt was du
in der ersten Zeile wolltest.

von P.Z. (Gast)


Lesenswert?

Beo Bachta schrieb:
> Das heisst in der zweiten Zeile machst du alles kaputt was du
> in der ersten Zeile wolltest.

Das stimmt, dass sollte natürlich so aussehen.
1
CLKPR |= (1<<CLKPCE);
2
CLKPR |= (1<<CLKPS1);

Ändert aber leider nichts am Compiler

von M. K. (sylaina)


Lesenswert?

Beo Bachta schrieb:
> Das heisst in der zweiten Zeile machst du alles kaputt was du
> in der ersten Zeile wolltest.

Beschäftige dich mal mit dem Ändern geschützter Register/Bits. Diese 
beiden Zeilen waren schlicht fehlerfrei. Mit der ersten Zeile hat der TE 
den Schreibschutz der CLKPS-Bits aufgehoben, mit dem zweiten hat er 
innerhalb von 4 Zyklen den neuen, gültigen Wert, in die CLKPS-Bits 
geschrieben.
Dieses Vorgehen war völlig korrekt.

von Beo Bachta (Gast)


Lesenswert?

P.Z. schrieb:
> Ändert aber leider nichts am Compiler

Da wirst du wohl doch etwas mehr von deinem wertvollen
Code preisgeben müssen.

von Dieter F. (Gast)


Lesenswert?

Wenn ich es auf den angegebenen Code reduziere ist alles O.K.
Der Fehler resultiert aus "...".

expected identifier or '(' before 'volatile'

von P.Z. (Gast)


Lesenswert?

Beo Bachta schrieb:
> Da wirst du wohl doch etwas mehr von deinem wertvollen
> Code preisgeben müssen.

Das ist quasi der gesammt Code.
1
#include <stdint.h>      // Einbinden von stdint.h
2
#include <avr/io.h>      // Einbinden von io.h
3
#include <avr/interrupt.h>  // Einbinden von interrupt.h
4
#define F_CPU 1000000UL    // Frequenz:1 MHz
5
#include <util/delay.h>    // Einbinden von delay.h
6
7
CLKPR = (1<<CLKPCE); // Enable change of CLKPR bits
8
CLKPR = (1<<CLKPS1); // Set prescaler to 4, and system clock to 1 MHz
9
10
int main(void)
11
{
12
  DDRD |= (1<<DDD4);
13
14
    while (1) 
15
    {
16
          PORTD |= (1 << PD4); 
17
          _delay_ms(100);
18
          PORTD &= ~(1 << PD4);
19
          _delay_ms(100);
20
    }
21
}

von P.Z. (Gast)


Lesenswert?

Dieter F. schrieb:
> Wenn ich es auf den angegebenen Code reduziere ist alles O.K.
> Der Fehler resultiert aus "...".
>
> expected identifier or '(' before 'volatile'
Sorry,
das "..." habe ich da hin gemacht, weil ich den Pfad gekürzt habe. 
Dadurch wurde alles etwas leserlicher.

von Dieter F. (Gast)


Lesenswert?

P.Z. schrieb:
> CLKPR = (1<<CLKPCE); // Enable change of CLKPR bits
> CLKPR = (1<<CLKPS1); // Set prescaler to 4, and system clock to 1 MHz

Dann pack das mal als erstes in Deine Main oder bilde eine Init-Funktion 
(in die Du den Code packst), welche Du aus der Main heraus aufrufst.

von Oliver S. (oliverso)


Lesenswert?

P.Z. schrieb:
> Das ist quasi der gesammt Code.

Quasi oder tatsächlich?

Wenn tatsächlich, such dir ein C-Buch. Dann wird dir der Fehler schnell 
klar. Wenn quasi, dann poste den echten Code.

Oliver

von Dieter F. (Gast)


Lesenswert?

Und vergiss das "|=" nicht :-)

von P.Z. (Gast)


Lesenswert?

Oliver S. schrieb:
>
> Quasi oder tatsächlich?
>
> Wenn tatsächlich, such dir ein C-Buch. Dann wird dir der Fehler schnell
> klar. Wenn quasi, dann poste den echten Code.
>
> Oliver

Es ist der gesammte Code.

Dieter F. schrieb:
> P.Z. schrieb:
>> CLKPR = (1<<CLKPCE); // Enable change of CLKPR bits
>> CLKPR = (1<<CLKPS1); // Set prescaler to 4, and system clock to 1 MHz
>
> Dann pack das mal als erstes in Deine Main oder bilde eine Init-Funktion
> (in die Du den Code packst), welche Du aus der Main heraus aufrufst.

Danke. Nun scheint es zu funktionieren. Macht auch definitiv Sinn, im 
Hinblick auf den Compiler.
1
#include <stdint.h>      // Einbinden von stdint.h
2
#include <avr/io.h>      // Einbinden von io.h
3
#include <avr/interrupt.h>  // Einbinden von interrupt.h
4
#define F_CPU 1000000UL    // Frequenz:1 MHz
5
#include <util/delay.h>    // Einbinden von delay.h
6
7
int setClock(void)
8
{
9
  CLKPR |= (1<<CLKPCE); // Enable change of CLKPR bits
10
  CLKPR |= (1<<CLKPS1); // Set prescaler to 4, and system clock to 1 MHz
11
}
12
13
14
int main(void)
15
{
16
  DDRD |= (1<<DDD4);
17
  setClock();
18
    while (1) 
19
    {
20
          PORTD |= (1 << PD4); 
21
          _delay_ms(100);
22
          PORTD &= ~(1 << PD4);
23
          _delay_ms(100);
24
    }
25
}

von M. K. (sylaina)


Lesenswert?

Das CLKPR muss auch innerhalb einer Funktion stehen, außerhalb wäre es 
nicht zulässig.

von spess53 (Gast)


Lesenswert?

Hi

>Das CLKPR muss auch innerhalb einer Funktion stehen, außerhalb wäre es
>nicht zulässig.

In verschiedenen Funktionen wären die vier Takte wohl kaum einzuhalten.

MfG Spess

von M. K. (sylaina)


Lesenswert?

spess53 schrieb:
> In verschiedenen Funktionen wären die vier Takte wohl kaum einzuhalten.

Und wenns regnet wird man nicht zwangsläufig nass. Man kann's auch jetzt 
kompliziert aufziehen, man kann's aber auch lassen. ;)

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.