Problem mit CLKPR im AtmelStudio 7

Gast #5528617
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.
Gast #5528643
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.
#5528654
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.
Gast #5528684
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
}
Gast #5528696
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.
Gast #5528717
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
}

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