Forum: Mikrocontroller und Digitale Elektronik Xmega Clocksystem und delay


von Alexej W. (gluon)


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.

von Karl H. (kbuchegg)


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.

von Hunt W. (hunt_work_er)


Lesenswert?

aber ein warnung müsste er dennoch anzeigen!

von Karl H. (kbuchegg)


Lesenswert?

Hunt Worker schrieb:
> aber ein warnung müsste er dennoch anzeigen!

Es gibt 2 Möglichkeiten
* die Warnung wurde ignoriert
* in den Projektoptionen ist tatsächlich erst mal 1Mhz eingetragen

Die erste ist die wahrscheinlichere :-)

von Alexej W. (gluon)


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]

von Alexej W. (gluon)


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

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.