Forum: Mikrocontroller und Digitale Elektronik XMega 32Bit RTC


von Kampi (Gast)


Lesenswert?

Hallo,

ich stehe gerade ein wenig auf dem Schlauch...
Ich will meine Headerfiles für meinen XMega erweitern und die 32-Bit RTC 
hinzufügen.
Ich habe nun folgendes File:
1
/*
2
 * Chip.h
3
 *
4
 * Created: 12.10.2014 12:52:28
5
 *  Author: Daniel
6
 */ 
7
8
9
#ifndef CHIP_H_
10
#define CHIP_H_
11
12
// RTC Konfiguration
13
#define RTC_Interrupt_Level  RTC32_OVFINTLVL_gm
14
#define RTC_Clock_Source  CLK_RTCSRC_TOSC_gc
15
#define RTC_Prescaler    1
16
17
#include <avr/interrupt.h>
18
19
void Enable_Interrupt(void);
20
void Enable_2MHz_Clock(void);
21
void Enable_32MHz_Clock(void);
22
void Enable_PLL(void);
23
void Enable_Ext_Clock(void);
24
void Set_Output(PORT_t *Port, int Pin);
25
void Set_Input(PORT_t *Port, int Pin);
26
void Set_IO(PORT_t *Port, int Pin, int Status);
27
void RTC_Init(void);
28
void RTC_Config(int Periode);
29
30
31
void Enable_Interrupt(void)
32
 {
33
   sei();
34
   PMIC.CTRL |= PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm;
35
 }
36
37
void Enable_2MHz_Clock(void)
38
{
39
  OSC.CTRL |= OSC_RC2MEN_bm;
40
  while(!(OSC.STATUS & OSC_RC2MRDY_bm));
41
  CCP = CCP_IOREG_gc;
42
  CLK.CTRL = CLK_SCLKSEL_RC2M_gc;
43
}
44
45
void Enable_32MHz_Clock(void)
46
{
47
  OSC.CTRL |= OSC_RC32MEN_bm;
48
  while(!(OSC.STATUS & OSC_RC32MRDY_bm));
49
  CCP = CCP_IOREG_gc;
50
  CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
51
}
52
53
void Enable_Ext_Clock(void)
54
{
55
  
56
}
57
58
void Set_Output(PORT_t *Port, int Pin)
59
{
60
  Port->DIR |= (1 << Pin);
61
  
62
  return;
63
}
64
65
void Set_Input(PORT_t *Port, int Pin)
66
{
67
  Port->DIR &= ~(1 << Pin);
68
  
69
  return;
70
}
71
72
void Set_IO(PORT_t *Port, int Pin, int Status)
73
{
74
  if(Status == 1)
75
  {
76
    Port->OUT |= (1 << Pin);
77
  }
78
  else if(Status == 0)
79
  {
80
    Port->OUT &= ~(1 << Pin);
81
  }
82
  
83
  return;
84
}
85
86
87
void RTC_Init()
88
{
89
  // Oszillator aktivieren
90
  OSC.CTRL |= OSC_XOSCEN_bm;
91
  while (OSC.STATUS & (OSC_XOSCRDY_bm));  
92
93
  // 32kHz Quarz am TOSC Pin im Low-Power Mode aktivieren
94
  OSC.XOSCCTRL |= OSC_X32KLPM_bm | OSC_XOSCSEL_32KHz_gc;
95
96
  // RTC akvieren
97
  CLK.RTCCTRL = RTC_Clock_Source | CLK_RTCEN_bm;
98
}
99
100
void RTC_Config(int Periode)
101
{
102
  RTC32.PER = Periode;
103
  RTC32.CTRL = RTC32_ENABLE_bm;
104
  while(OSC.STATUS & RTC32_SYNCBUSY_bm);
105
  
106
  // RTC Interrupt konfigurieren
107
  RTC32.INTCTRL = RTC_Interrupt_Level;
108
}
109
110
111
#endif /* CHIP_H_ */

Wenn ich die RTC jetzt nutzen will, bleibt das Programm immer bei

while(OSC.STATUS & RTC32_SYNCBUSY_bm);

stehen, aber ich komme einfach nicht drauf warum das so ist... :(
Z.Z. nutze ich das XPlained XMega256A3BU Board von Atmel.
Kann mir jemand einen kurzen Tipp geben :)

Danke vielmals!
Gruß
Daniel

von Peter Simon (Gast)


Lesenswert?

ich kriege von C immer Kopfschmerzen und programmiere deshalb in 
Assembler.
Kann daher keinen C Kot liefern.
In keinen Datenblättern , Applikationshinweisen oder im ASF von Atmel 
sind irgendwelche Hinweise über die Einstellung auf 1024Hz zu finden.
Die Dokumentation ( auch in Bezug auf EEPROM ) sind allgemein stark 
revisionsbedüftig.

Das RTC32 Modul wird über VBAT initialisiert.

a) ACCEN bit in VBAT CTRL setzen , dies setzt auch die RTC32 Freigabe 0
b) Reset VBAT ( via CCP ! )
c) oscillator failure detection freigeben ( und Optional high ESR mode 
); d) Wait 200µs
e) Quarzoszillator freigeben und 1Hz oder 1024Hz setzen
f) warte bis XOSCRDY Flag gesetzt ist
-------------------------------------------
g) Setze Periodndauer (PER) im RTC32 Modul , ! > 0 , sowie
- compare match value (COMP) optional
- count value         (CNT)  optional
h)   Optional interrupt level for compare match & overflow interrupt
i) Freigabe der 32-bit RTC , ENABLE bit in CTRL

wichtig bei c) und e) die entsprechenden Bits gemeinsam setzen

Punkt a) bis f) kann nur einmal nach dem Reset ausgeführt werden.

Späteres Setzen von PER ist nur nach dem Rücksetzen der RTC32 Enable bit 
möglich (dann g) bis i) ausführen), es ist keine Syncronisierung 
notwendig.

Vor dem Schreiben von COMP oder CNT muß SYNCBUSY abgefragt werden.
Vor dem Lesen von CNT SYNCCNT und SYNCBUSY

von Stefan (Gast)


Lesenswert?

Hallo  Kampi,

wenn Du noch Probleme mit der Umsetzung von Peters Infos benötigst:
Beitrag "RTC32 mit XMEGA"

Ich hatte mich damals auch durch alle Register quer durch das Datenblatt 
gelesen, bis ich endlich alle erwischt hatte die dafür notwendig sind! 
:-)

von Timmo H. (masterfx)


Lesenswert?

RTC32.SYNCCTRL & RTC32_SYNCBUSY_bm ??
Siehe AVR1321

: Bearbeitet durch User
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.