Problem mit RTCAlarm

  • 1
  • 2
  • 3
  • Page 1 of 3
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Problem mit RTCAlarm

 · 
Posted: 06.03.2021 - 13:10  ·  #1
Hallo Zusammen,

ich bau mir grad eine Uhr mit VFD und DCF77. Es funktioniert soweit alles, bis auf den Alarm.
Hab ich einen Denkfehler oder wird die CallBack-Procedure RTCAlarm tatsächlich nicht aufgerufen?
Proz ist ein XMega256A3 (ohne U) .... der lag noch rum :D

Code

Import SysTick, DCFclock, RTClock, SerPortE1, SwitchPort_G;

From System Import Tasks, LongWord;
From RTClock Import RTCAlarm;

Define
  RTClock        = iData, Time;             { Time, DateTime                   }
  RTCSource      = SysTick;

Var
  WakeHour           : Array[1..4] of Byte;  // 4 mögliche Weckzeiten
  WakeMinute         : Array[1..4] of Byte;

Procedure RTCAlarm;
  Begin
    AlertActive:=true;
    Set4:=1;          // Segment ein zur Kontrolle
  End RTCAlarm;


// Setzen und aktivieren der Weckzeit
  RTCAlarm_Time(WakeHour[WakeType],WakeMinute[WakeType],00);
  RTCAlarm_Start(1);

// Alarm aktiv
    If AlertActive=true
      then
        If MP3Busy=false  // MP3-Modul spielt grad nicht ab
          then
            SetMP3Command(11);  // MP3 Track 1 starten
          EndIf;
        If Inp_Raise_G(T4)  // Taste gedrückt
          then
            SwitchPort_G_Clear;
            AlertActive:=false;  // Alarm aus
            SetMP3Command(6);  // MP3 aus
          EndIf;
      EndIf;


Gruss
Harry
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Re: Problem mit RTCAlarm

 · 
Posted: 07.03.2021 - 09:55  ·  #2
Eine weitere Überlegung, weil es nicht funktioniert ..... ich verwende die CallBack-Funktion RTCtickSecond um die Punkte zwischen Stunden und Minuten blinken zu lassen. Das funktioniert auch. Da ich keine Sekunden anzeige, dachte ich mir ich verwende RTCtickMinute um die Uhrzeit zu aktualisieren. Das funktioniert aber nicht.

Quote
Procedure RTCtickSecond; {CallBack procedure} Wird bei jedem Sekunden Übertrag aufgerufen.
Procedure RTCtickMinute; {CallBack procedure} Wird bei jedem Minuten Übertrag aufgerufen.
Procedure RTCtickHour; {CallBack procedure} Wird bei jedem Stunden Übertrag aufgerufen.


Da ja bei jedem Stundenwechsel alle 3 Funktionen aktiv werden müßten, wer bekommt den Zuschlag? Oder ist nur eine gleichzeitig verwendbar? Das geht leider aus dem Handbuch nicht hervor.

Harry
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: Problem mit RTCAlarm

 · 
Posted: 09.03.2021 - 16:08  ·  #3
Hallo Harry,

wir haben das Problem bei ATMEGA256, dass der Minuten-callback manchmal nicht aufgerufen wird, wenn die Uhr vom Mikrocontroller nacheilt.
Der Treiber muss die Uhrzeit gelegentlich um eine Sekunde vorstellen und vergisst dann, den RTCTickMinute aufzurufen.

Daher würde ich mich nicht darauf verlassen.

Gruß,
Thomas
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Re: Problem mit RTCAlarm

 · 
Posted: 09.03.2021 - 17:14  ·  #4
Hallo Thomas,

ok mit dem RTCTickMinute-Problem kann ich leben, aber der Alarm geht überhaupt nicht. Die Funktion wird nicht angesprungen.
Ich hab auch momentan keinen Plan, wie ich das mit dem Debugger oder Simulator testen soll, da hier nicht die Möglichkeit besteht, die Weckzeit einzustellen und DCF77 gibts auch nicht. Selber was schreiben wäre eine Idee, aber jede Sekunde testen, wo es doch heißt, daß die Uhrzeit nur bei gesperrtem Interrupt gelesen werden soll.

Harry
rage
Benutzer
Avatar
Gender: n/a
Age: 65
Homepage: processanalytik.de
Posts: 237
Registered: 02 / 2007
Subject:

Re: Problem mit RTCAlarm

 · 
Posted: 09.03.2021 - 21:58  ·  #5
Hey Harry,
zwar verwende ich eine Hardwareuhr, zum einen weil die Genauigkeit der RTC-Software-Uhr nicht wirklich besonders genau war und zum anderen verwende ich Teile des ganzen in Geräten die Strom sparen müssen. Aber immer wenn der Sekundeninterupt zu schlägt, setze ich ein Flag. Dieses Flag veranlasst das Haupt-Programm die Uhrzeit zu lesen, dabei vergleiche ich ob die Minuten=0 sind und wenn ja dann teste ich meine 8 möglichen Alarme. Da ich keinen Sekunden-genauen Alarm brauche, sondern mir ein Minuten-genauer reicht kann ich damit gut leben.

Code

type
  AlarmRegister = Record
    ThisDay  :  Byte;    //Bit 0 Monday...Bit 6 Sonday Bit 7 Wiederholung
    Year     :  Byte;
    Month    :  Byte;
    Day      :  Byte;
    Hour     :  Byte;
    Minute   :  Byte;
    Handler  :  Byte;
  end;
{--------------------------------------------------------------}
{ Var Declarations }
var
  USEAlarmWithDate : Byte;  //Bit 0..7 für einen Alarm per Wochentag
  AlarmActive      : Byte;  //Bit 0..7 für einen Alarm = Active
  Alarm            : Array[0..7] of AlarmRegister;

Procedure ResetAlarm;
Begin
  FillBlock(@Alarm,SizeOf(AlarmRegister)*8,$FF);
end;
Function CheckAlarm(AlarmData:AlarmTime):Byte;
var uCount,Result,T:Byte;
Begin
  //ClockArray[0]:= ClockArray[0] and %01111111;   //Sekunden
  //ClockArray[1]:= ClockArray[1] and %01111111;   //Minuten
  //ClockArray[2]:= ClockArray[2] and %01111111;   //Stunden
  //ClockArray[3]:= ClockArray[3] and %00000111;   //Wochentag
  //ClockArray[4]:= ClockArray[4] and %00111111;   //Tage
  //ClockArray[5]:= ClockArray[5] and %00011111;   //Monate
  For uCount:=0 to 7 do
    if Bit(AlarmActive,uCount) then
      if Bit(USEAlarmWithDate,uCount) then
        if (Alarm[uCount].Year=AlarmData[6]) or (Alarm[uCount].Year=$FF) then
          if (Alarm[uCount].Month=AlarmData[5]) or (Alarm[uCount].Month=$FF) then
            if (Alarm[uCount].Day=AlarmData[4]) or (Alarm[uCount].Day=$FF) then
              if (Alarm[uCount].Hour=AlarmData[2]) or (Alarm[uCount].Hour=$FF) then
                if (Alarm[uCount].Minute=AlarmData[1]) or (Alarm[uCount].Minute=$FF) then
                  SetBit(Result,uCount,True);
                  t:=Alarm[uCount].ThisDay;
                  if not T.7 then
                    SetBit(AlarmActive,uCount,False);
                  endif;
                endif;
              endif;
            endif;
          endif;
        endif;
      else
        if Bit(Alarm[uCount].ThisDay,AlarmData[3]) then
          if (Alarm[uCount].Hour=AlarmData[2]) or (Alarm[uCount].Hour=$FF) then
            if (Alarm[uCount].Minute=AlarmData[1]) or (Alarm[uCount].Minute=$FF) then
              SetBit(Result,uCount,True);
              t:=Alarm[uCount].ThisDay;
              if not T.7 then
                SetBit(AlarmActive,uCount,False);
              endif;
            endif;
          endif;
        endif;
      endif;
    endif;
  endfor;
  Return(Result);
end;

Man könnte USEAlarmWithDate und AlarmActive als Boolean ins Record legen, das koste dann aber ein paar Byte mehr.
Andere Frage, in Deinem Source lese ich das Du eine MP3-Ausgabe realisierst. Wie machst Du das, das würde mich auch interessieren.

cu Ralf
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: Problem mit RTCAlarm

 · 
Posted: 09.03.2021 - 23:03  ·  #6
Wie Ralf würde ich prinzipiell die Uhrzeit pollen und selber vergleichen.
Alternativ zum Sekunden Callback, wäre es auch über RTCgetMinute möglich.

if RTCgetMinute <> oldMinute then
oldMinute := RTCGetMinute;
// Interrupt sperren
// Uhrzeit lesen und als Kopie speichern
// Interrupt wieder freigeben
// Alarme testen
endif;

Gruß Thomas
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Re: Problem mit RTCAlarm

 · 
Posted: 10.03.2021 - 06:13  ·  #7
Hallo ihr beiden,

und danke. Dann werde ich es mal so probieren. Ich finde es halt immer seltsam selber etwas zu schreiben, wenn es doch eine Funktion dafür gibt.

@Ralf: Ich verwende hier ein Modul vom Typ BY8301 und dieses wird via USART gesteuert. Ich hab mir jetzt noch BY8001 bestellt, die etwas günstiger sind und einen uSD-Sockel besitzen (bis 32GByte), meines hat nur 2 MByte OnBoard-Flash .... reicht aber für meine Zwecke.
Auch interessant: Beide Module haben Line-Out R/L und einen direkten Lautsprecherausgang mono 3W an 8Ohm. Ich habe hier 2 8Ohm-Notebooklautsprecher (24x15mm) in Reihe angeschlossen und das reicht locker für einen Wecker :D

Harry
Attachments
 
Filename: BY8301-16P.pdf
Filesize: 1.09 MB
Title:
Download counter: 2048
rage
Benutzer
Avatar
Gender: n/a
Age: 65
Homepage: processanalytik.de
Posts: 237
Registered: 02 / 2007
Subject:

Re: Problem mit RTCAlarm

 · 
Posted: 10.03.2021 - 08:14  ·  #8
Hey Harry,
danke Dir, sowas hab ich gesucht. Ja ehrlich nicht wirklich danach gesucht, nur gedacht, das wäre die Lösung.
cu Ralf
  • 1
  • 2
  • 3
  • Page 1 of 3
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 16 · Cache Hits: 15   138   153 · Page-Gen-Time: 0.054s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI