Hallo,
ich habe hier das PIC32 Ethernet Starter kit (bestückt mit PIC32MX795)
und möchte gerne den internen RTC nutzen.
Ich habe noch nie mit einer RTC gearbeitet und mir fehlt auch ein wenig
das Hintergrundwissen dazu. Trotzdem wäre es schön erst einmal Datum,
Zeit etc. auf einem Display darstellen zu können.
Hierfür habe ich mir das RTCC_Code Example von Microchip angeguckt,
welches sich zwar compilieren lässt, aber beim debuggen immer in einer
Schleife hängen bleibt. Diese Schleife scheint zu überprüfen, ob die
Clock des RTC überhaupt läuft.
Irgendetwas scheint also noch faul zu sein. Es gibt noch einen RTCC Pin
am PIC. Wofür genau ist dieser da und wie muss dieser beschaltet werden,
um den internen RTC zu nutzen?
Ich habe einmal das Blockdiagramm des RTCs angehangen.
Danke für jeglichen Input
H. D. schrieb:> Einen Quarz hast du?
Kann man da nicht einfach den primären Oszillator für nutzen.
Wenn ich das richtig sehe fehlt auf dem Starterkit ein externer
Sekundäroszillator (32.768 kHz). Dieser scheint standardmäßig nicht auf
dem Board verbaut zu sein. Ist dieser unabdingbar für den internen RTC?
Ich kenn den PIC32 nicht wirklich, aber laut deinem angehängten Diagramm
gibt es beim PIC32 auch einen internen 32kHz Oszillator.
Hast du bei deinem Beispiel mal nachgesehen ob hier der interne
Oszillator auch ausgewählt wird?
Gruß
Rainer
Die externe lohnt nur, wenn du den µC irgendwann abschalten willst, und
das Batteriegepuffert weiterlaufen muss, oder wenn du keinen Clock hast.
Sonst würde ich die interne nehmen. Das hat den Vorteil, dass das
Auslesen der Uhrzeit nur aus ein paar Registerzugriffen besteht, bei der
externen braucht man I2C und wasweisich noch dazu.
Dazu kommen die Alarminterrupts, die sehr praktisch sind.
Kommst du an SOSCI heran? In dem Fall könntest du dir die 32768 Hz
mittels Timer erzeugen und auf den SOSCI-Eingang draufgeben. Wenn man an
beide drankommt (SOSCI + SOSCO), kann man auch einfach eine Uhrenquarz
dranhängen - von einem kaputten Mainboard oder ähnlichem.
Falls gewünscht, kann ich dir heute Abend ein Beispiel für einen
PIC32MX470 zukommen lassen, das sollte sich leicht portieren lassen. Ich
habe es selber geschrieben, weil ich das Beispiel von Microchip nicht
verstanden habe ;-)
Sonst kannst du ja eine DS1337 über I2C oder ähnliches nehmen.
Hallo Rainer,
Hallo WehOhWeh.
Vielen Dank für Eure Hilfe. Ein Beispiel für den PIC32MX470 wäre sehr
nett. Danke dafür.
Ich poste hier mal das Microchip Beispiel. Wie gesagt lässt es sich
compilieren, aber ich bleibe stets an der markierten Stelle hängen:
Ich habe jetzt keinen externen Quarz an das Board angehangen!
Es ist auf dem Starterkit aber ein (Connector Y3) Footprint vorgesehen,
um einen externen sekundären Oszillator anzuhängen. Dies müßten SOSC1
und SOSCO sein. Dieser ist aber nicht bestückt.
Meine Frage ist jetzt, ob ich zunächst einen ähnlichen Oszillator
anlöten muss um das RTC Modul auslesen zu können?
Danke nochmal an Alle für die Hilfe!
Sven der Schreckliche schrieb:> Ich habe jetzt keinen externen Quarz an das Board angehangen!
Das muss du dem Pic auch sagen (über ein config register).
Main clock läuft mit 20 Mhz, also gibt es vermutlich einen internen 32
kHz Oszillator. Interne sind aber per se ungenau (sonst würde niemand
externe Quarze nutzen). Ein Prozent sind da schon sehr gut, was auf 36
Sekunden pro Stunde hinaus läuft.
Frank schrieb:> Debug mal und schau wasrtccRes res=RtccInit();> zurück gibt.
es wird
RTCC_SOSC_NRDY, // SOSC not running
zurückgegeben.
Er scheint also den sekundären Quarz zu erwarten, welcher bei mir ja
nicht bestückt ist.
Habe jetzt einfach mal einen bestellt.
anbei das Beispiel für den MX470.
Das ist halt nicht konfigurierbar wie die Microchip Libs, sondern deckt
nur meinen Bedarf ab (Alarm, RTCC, Zeit setztn / lesen). Ich hab das vor
langer, langer Zeit für einen PIC24 geschrieben und dann portiert. Es
erhebt keinen Anspruch auf Eleganz :-)
Relevant sind die RTCC.* files, in "GlobalDefinitions.h" sind nur 2
defines und ein paar typedefs relevant.
Ich verwende immer ein Struct namens TIME für die Zeiten, die Funktionen
bekommen einen Pointer da drauf.
initrtcc();
Das macht die RTCC an. Clock ist SOSC, ich hab einen Uhrenquarz dran.
GetTimeDate(Time *Output);
liest Zeit und Datum aus und schreibt sie in Output
SetTimeDate(Time *IN);
stellt die Zeit
Warnung:
Da ist ein while ohne Timeout drin. Das will man vielleicht nachrüsten.
Ich brauch es nicht, weil ohne funktionerende RTCC geht bei mir nichts,
nicht mal das Display.
SetAlarm(Time *IN, uint8_t interval, uint8_t ena);
Sinnvoll für den Interrupt, man kann einen Alarm setzen. Getestet habe
ich (mangels Geduld) nur 1s, 10s, 1min.
Das interval ist das Setting für AMASK (siehe Datenblatt PIC).
mit g_enable schaltet man den Interrupt ein, mit g_disable aus.
Auch hier, ein Timeout fehlt.
void __ISR(_RTCC_VECTOR,ipl6) _RTCCInterrupt(void)
Die ISR. Die setzt nur ein Jobflag. Alles weitere passiert in einem
Eventhandler.
Für die Funktion kann ich nicht garantieren, es läuft aber seit >1Jahr
in meiner Wetterstation.
Hallo WehOhWeh,
recht herzlichen Dank. Ich werde am WE versuchen direkt versuchen das
auf meinen PIC zu implementieren. Sehr nett und nicht
selbstverständlich, dass Du mir hier deinen Code zur Verfügung stellst!
Ich benutze als RTC einfach einen 1s Timerinterrupt, der eine 32Bit
Variable hochzählt.
Damit lassen sich sehr einfach Zeiten vergleichen, z.B. für Steuerungen.
Und nur zur Anzeige für den Menschen gibt es eine Routine zur
Umwandlung.
Bei einem 32Bitter muß man den Zugriff auf die Zeit-Variable nichtmal
mehr atomar kapseln.
Ich habe doie RTC Clock (intern) jetzt implementiert. Ich bräuchte jetzt
natürlich noch eine Pufferbatterie etc. weiß Jemand welche man dafür am
besten beim PIC Starterkit nutzt, an welche Pins etc.?