C XMEGA256A3BU RTC32

Janiiix3

Aktives Mitglied
28. Sep. 2013
1.333
10
38
Hannover
Sprachen
  1. ANSI C
  2. C#
Hallo @ all,

Jemand von euch schon mal mit der XMEGA Serie beschäftigt?
Wie genau funktioniert die Pufferung mit der externen Batterie? Wo werden die Variablen hoch gezählt für die Zeit? In der ISR? Also wenn die Hauptversorgung aus ist.

Die Initialisierung, scheitert auch mal wieder...
Habe ich was vergessen zu konfigurieren? Benutzen wollte ich den externen 32kHz Quarz.



CodeBox C
cli();

OSC.XOSCCTRL = OSC_X32KLPM_bm | OSC_XOSCSEL_32KHz_gc;

OSC.CTRL = OSC_XOSCEN_bm;

while (OSC.STATUS & (OSC_XOSCRDY_bm));

CLK.RTCCTRL = (CLK_RTCSRC_TOSC_gc | CLK_RTCEN_bm);

RTC32.PER = 1023;

RTC32.CTRL = RTC_PRESCALER_DIV1_gc;

while(OSC.STATUS & RTC_SYNCBUSY_bm);

RTC32.INTCTRL = RTC_OVFINTLVL_HI_gc;

sei();
 
Du hast die Priorität High-level des RTC Overflow-Interrupts gewählt.

Diese Interruptpriorität musst du im Control Register des PMIC Controllers noch freigeben ...



CodeBox C
/* Enable interrupts. */
  PMIC.CTRL |= PMIC_HILVLEN_bm ;
  sei();


Wegen dem Thementitel, wichtig wäre eher Typ des Xmega (A1, A3, A4) nicht die Speichergröße.
 
Da muss noch irgendwas fehlen. Habe ich hinzugefügt.

Läuft aber noch nicht in die ISR rein.
Was mich wundert, dass er einige #defines nicht findet.
z.B


CodeBox C
#define RTC_PRESCALER_DIV1024_gc ((1<<0) | (1<<1) | (1<<2))
#define RTC_PRESCALER_DIV1_gc (1<<0)
#define RTC_SYNCBUSY_bm (1<<0)
#define RTC_OVFINTLVL_HI_gc ((1<<0) | (1<<1))

#ifndef CLK_RTCEN_bm

#define CLK_RTCEN_bm (1<<0)
#endif


Diese #defines kannte die IDE nicht, habe ich selbst hinzugefügt. Woran kann das liegen? Habe ich eine .h vergessen?

Das ist meine ISR



CodeBox C
ISR(RTC32_OVF_vect)

{
#define RED_STATE_LED_PORT PORTD.OUT

#define RED_STATE_LED_PIN (1<<4)

RED_STATE_LED_PORT |= RED_STATE_LED_PIN;
}
 
Ich habe nun nicht so die Zeit. Kurz was mir aufgefallen ist ...

In der GroupConfiguration für die High-level Interrupts, ist da nicht deine Bit-Einstellung falsch (High Level müsste doch eigentlich 11 sein?!)
Deine Definition: #define RTC_OVFINTLVL_HI_gc ((1<<0) | (1<<1))

Du konfiguriertst RTC und verwendest RTC32?
RTC_OVF_vect wäre da richtig.



CodeBox C
ISR(RTC_OVF_vect)
{

   PORTQ.OUTTGL = 1<<PIN3;
 
}
 
Wo ist denn da der Unterschied?
RTC. erkennt er bei mir irgendwie nicht? Muss ich da noch extra was für einbinden?
 
Wo ist denn da der Unterschied?
RTC. erkennt er bei mir irgendwie nicht? Muss ich da noch extra was für einbinden?

Einige Xmegas haben einen RTC32 (32bit) anstelle eines RTC (16bit) Timers.

Anscheinend verwendest du einen Xmega (wir wissen immer noch nicht welchen, XmegaA3BU aus dem Thema mit LCD Controller?) mit RTC32.
Deshalb sind auch alle RTC defines unbekannt.
RTC32_OVF_vect stimmt dann in dem Fall.

Schau mal im Solution Explorer unter Dependencies iox????.h an, dort sind die ganzen Defines enthalten.

EDIT:
Dies hilft vielleicht weiter ...
RTC32 on Xmega-A3BU Xplained without framework (avrfreaks.net)
 
Zuletzt bearbeitet:
Ja genau, ich verwende den XmegaA3BU.
Der scheint so was nicht zu besitzen.
 
Es funktioniert jetzt mit dem RTC32. Wie genau funktioniert das jetzt mit der Pufferung der Zeiten? In welchen Registern müssen die geschrieben werden?
 
Hallo,

Bin inzwischen schon deutlich weiter gekommen. Der RTC32 läuft jetzt und tut was er soll.
Nun ist eine neue Frage aufgetaucht.

Ist es möglich mit einer Funktion aus der "time.h" Sekunden in die aktuelle Zeit um zu rechnen?
Sprich ich habe z.B 3600 Sek. und möchte diese jetzt in Std:Min:Sec haben?!
 
Man kann die vorliegende zahl durch 3600 teilen. Der ganzzahlige anteil ergibt die stunden.
Zb 3661÷3600 = 1h rest 61 sec. 61sec ÷60 =1 min rest 1 sec.
Ergibt 1h 1min 1sec
Habe die entspr. Dimension nicht immer mitgeschleppt.

Falls die entspr. Stundenzahl noch in jahr, monat, tag umgerechnet werden soll...die Verfahrensweise ist dann aehnlich
 
Man kann die vorliegende zahl durch 3600 teilen. Der ganzzahlige anteil ergibt die stunden.
Zb 3661÷3600 = 1h rest 61 sec. 61sec ÷60 =1 min rest 1 sec.
Ergibt 1h 1min 1sec
Ja genau.

Dieser Code-Schnipsel hilft vielleicht weiter ...


CodeBox C
/*
 * GccApplication1.c
 *
 * Created: 13.10.2016 21:40:14
 * Author : Dirk
 */

#include <avr/io.h>


#define SECS_PER_MIN  (60UL)
#define SECS_PER_HOUR (3600UL)
#define SECS_PER_DAY  (SECS_PER_HOUR * 24L)

#define numberOfSeconds(_time_) (_time_ % SECS_PER_MIN)
#define numberOfMinutes(_time_) ((_time_ / SECS_PER_MIN) % SECS_PER_MIN)
#define numberOfHours(_time_) (( _time_% SECS_PER_DAY) / SECS_PER_HOUR)

int main(void)
{
 
 
   uint16_t Seconds, Minutes, Hours;
   uint32_t time;
 
   time = 3661;
 
   Seconds = numberOfSeconds(time); // 1
   Minutes = numberOfMinutes(time); // 1
   Hours = numberOfHours(time); // 1

 
 
    /* Replace with your application code */
    while (1)
    {
    }
}
 
Ist quasi dasselbe, wie das Zerpflücken einer Dezimalzahl in ihre Dezimalstellen (nur eben nicht mit 10, sondern mit 60, 24, 365...).
Zu "C" kann ich diesbezüglich nicht mehr sagen, der BASCOMer würde bei sowas (auch) üblicherweise jedesmal per Division den ganzzahligen Anteil ermitteln, und mit Modulo den Rest zum weitermachen. Der ASSEMBLERer weiß natürlich, daß die Operationen identisch sind, der Rest ein Abfallprodukt der Division ist, und diesen einfach verwerten.
BASCOM rechnet natürlich genauso, dividiert man Bytes, verbleibt der Rest in R24 (und kann dort ohne weitere Rechnung "abgeholt" werden;))

CodeBox BascomAVR
$regfile = "m8def.dat"

Dim X As Byte
Dim Y As Byte
Dim Z As Byte
Dim T As Byte

X = 199
Y = 100
Z = X / Y
sts {t}, r24
nop

Bei words steht der Rest in R25 und R16.
 
Hey Freunde,

Das habe ich doch schon längst, mir geht es darum das ich die Sekunden von der RTC32 bekomme.
Also 24 Std sind halt 84399 (so ungefähr glaube ich) was ist jetzt aber wenn der Zähler (also CNT) 120.000 ist?
Dann sind es ja mehr als 24 Std. Wie rechne ich das wieder um... in mein 24 Std Format?
Hoffentlich wisst ihr wie ich das meine :)
 
Hoffentlich wisst ihr wie ich das meine :)

Ich bin mir nicht sicher, ob du das meinst:

1 Tag = 60s*60*24 = 86400s

Du schaust wie oft 86400 in deinen Timerwert reinpasst, das sind dann die Tage. Den Rest zerlegst du dann in Stunden, Minuten und Sekunden.



CodeBox C
#define SECS_PER_DAY ((time_t)(SECS_PER_HOUR * 24UL))

#define elapsedDays(_time_) ( _time_ / SECS_PER_DAY) 
#define elapsedSecsToday(_time_) (_time_ % SECS_PER_DAY) 
 
Moin Dirk,

Wenn ich jetzt 172800 Sekunden habe... Wären das ja in Stunden eigentlich 48... So ganz grob. Das meine ich damit...
 
Ja und du möchtest rausbekommen wieviele Tage, Stunden, Minuten und Sekunden es sind?
 
Genau. Tage Monat und Jahr brauche ich jetzt nicht unbedingt, wäre aber ein cooles Feature ;)
 
Schau mal meine letzten Beiträge ...


elapsedDays
ermittelt die Tage

elapsedSecsToday
ermittelt die Sekunden (von den max. letzten 24h, den Wert verwendest du, um Stunden Minuten und Sekunden zu berechnen, Macros siehe meinen Beitrag)
 
Aber die Stunden hast du mit den oben geposteten Macros noch nicht berücksichtigt oder verstehe ich sie falsch?
 
Ich bin mir nicht sicher, ob du das meinst:

1 Tag = 60s*60*24 = 86400s

Du schaust wie oft 86400 in deinen Timerwert reinpasst, das sind dann die Tage. Den Rest zerlegst du dann in Stunden, Minuten und Sekunden.



CodeBox C
#define SECS_PER_DAY ((time_t)(SECS_PER_HOUR * 24UL))
 

Was hat da der Parameter "time_t" zu suchen?

Ich habe es aktuell so gelöst ->



CodeBox C
RTC->Stunden = Seconds / 3600;
Seconds = Seconds % 3600;
RTC->Minuten = Seconds / 60;
Seconds = Seconds % 60;
RTC->Sekunden = Seconds;
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)