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):
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.
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.
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.
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.
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.
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.
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
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
intsetClock(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
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
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. ;)