Xmega Clocksystem und delay

OP #2858295
Lesenswert?

Hallo,

Bin ein frischling im Forum und habe momentan paar kleine 
Schwierigkeiten bei meinem XMega Testprojekt. Momentan möchte ich 
einfach nur ein LCD-Modul an das XMega anschließen, da werden jedoch 
delays benötigt...
Nun habe ich einfach ein Port als Ausgang definiert und messe an diesem 
Spannung. Dabei wird der Zustand des Ports periodisch zwischen High und 
Low geschaltet. Nun zum Code:
1
#include <avr/io.h>
2
#include <util/delay.h>
3

4
#define F_CPU 32000000UL             // Bin mir nicht sicher ob diese Zeile notwendig ist...
5

6
void Clock_init(void)                // Das ist eine Funktion zur Einstellung des internen 32 MHz Schwingers (aus Kampis Tutorial)
7
{
8
  OSC.CTRL |= OSC_RC32MEN_bm;
9
  while(!(OSC.STATUS & OSC_RC32MRDY_bm));
10
  CCP = CCP_IOREG_gc;
11
  CLK.CTRL = 0x01;
12
}
13

14
int main(void)
15
{  
16
  Clock_init();
17
  PORTA.DIR |= (1<<PIN0);            // Hiermit wird die Datenrichtung des Ports eingestellt, hier also Port A Pin 0 als ein Ausgang
18
  PORTA.OUT |=(1<<PIN0);             // Hier wird Pin 0 im Port A auf High geschaltet, dabei sind alle anderen Low
19
    while(1)              // Das Hauptprogramm
20
    {
21
        _delay_ms(100000);           // Hier gibt es eine Pause
22
        PORTA.OUTTGL |=(1<<PIN0);    // Mit diesem Befehl wird der Zustand des Pins 0 in Port A umgeschltet auf Low bzw. High, "getoggelt" also
23
    }
24
}

Mittels AVR Studio 6 zusammen mit STK600 über PDI übetrage ich den Code 
an den Mikrocontroller (ATXmega16A4-AU) und es gibt dabei keine 
Warnungen oder Fehlermeldungen.

Das Problem ist jedoch wenn ich mit dem Multimeter die Spannung messe 
und dabei die Zeit zwischen zustand Low und High messe ich etwa 3 
Sekunden und keine 100 Sekunden also eine Abweichung um etwa Faktor 30. 
Mir ist nicht ersichtlich woran das liegt und wo der Fehler sitzt. Ich 
vermute jedoch dass etwas mit den Clock-Einstellungen nicht stimmt 
eventuell läuft der Mikrocontroller statt auf
 auf
 Aber das ist doch Schmahn.....

Wenn ich im Code statt:
1
_delay_ms(100000);
folgendes einfüge:
1
for (int i = 0; i<10000; i++)  // Hier gibt es eine Pause
2
    {
3
      _delay_ms(10);
4
    }
bleibt es bei den 3 Sekunden.

Verzweifelt bitte um Hilfe.
#2858333
Lesenswert?

Reihenfolge!

Wie soll denn der Compiler bei

#include <util/delay.h>

deine 32 Mhz berücksichtigen, wenn du den entsprechenden #define auf 
F_CPU erst danach machst?


Der Compiler hat die entsprechenden Warteschleifen auf 1Mhz Taktfrequenz 
ausgelegt. Da dein µC aber rund 30 mal schneller läuft, sind die daher 
auch rund 30 mal schneller abgearbeitet.
OP #2858350
Lesenswert?

Habe mir die Ausgabe genauer angeschaut es gibt folgende Meldungen:

c:\program files (x86)\atmel\atmel studio 
6.0\extensions\atmel\avrgcc\3.4.0.65\avrtoolchain\bin\../lib/gcc/avr/4.6 
.2/../../../../avr/include/util/delay.h(90,3):  #warning "F_CPU not 
defined for <util/delay.h>" [-Wcpp]

C:\XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\ATXmega16A4-AU\ATXmega16A4-AU\AT 
Xmega16A4-AU.c(12,0):  "F_CPU" redefined [enabled by default]

c:\program files (x86)\atmel\atmel studio 
6.0\extensions\atmel\avrgcc\3.4.0.65\avrtoolchain\bin\../lib/gcc/avr/4.6 
.2/../../../../avr/include/util/delay.h(91,0):  this is the location of 
the previous definition

Und bei Zeile 91,0 Steht:
1
# define F_CPU 1000000UL

Hmmmmmmm
Wenn ich nun in meinem Code die Zeile
1
#define F_CPU 32000000UL             // Bin mir nicht sicher ob diese Zeile notwendig ist...

auskommentiere dann kommt folgende Meltung/Warnung:

c:\program files (x86)\atmel\atmel studio 
6.0\extensions\atmel\avrgcc\3.4.0.65\avrtoolchain\bin\../lib/gcc/avr/4.6 
.2/../../../../avr/include/util/delay.h(90,3):  #warning "F_CPU not 
defined for <util/delay.h>" [-Wcpp]
OP #2858357
Lesenswert?

Karl Heinz Buchegger schrieb:
> Reihenfolge!
>
> Wie soll denn der Compiler bei
>
> #include <util/delay.h>
>
> deine 32 Mhz berücksichtigen, wenn du den entsprechenden #define auf
> F_CPU erst danach machst?
>
>
> Der Compiler hat die entsprechenden Warteschleifen auf 1Mhz Taktfrequenz
> ausgelegt. Da dein µC aber rund 30 mal schneller läuft, sind die daher
> auch rund 30 mal schneller abgearbeitet.

Ohhhh, das ist mir jetzt peinlich......

Habe nun die
1
#define F_CPU 32000000UL

Zeile nach Oben verschon und es funktioniert, wie es sein sollte.....

Vielen Dank für die Hilfe und sorry

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