Zeitumstellung berechnen
Dienstag, 22. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  Programmiersprache Assembler  |  Timer (Assembler)  |  Zeitumstellung berechnen « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Zeitumstellung berechnen  (Gelesen 2852 mal)
 
Mr. B A
Full Member
***
Offline Offline

Beiträge: 150



Profil anzeigen
« am: Oktober 23, 2006, 18:20:47 »

Ein Schaltjahr zu berechnen ist ja leicht. Aber wie kann ich die Zeitumstellung berechnen, oder Wochentage in Assembler? Hat jemand schon soetwas gemmacht? Wollte einen PIC nehmen mit einem Uhrenquarz und einen Kalender programmieren. Mir fehlt nur noch Schaltjahr und Name des Wochentages.
Gespeichert
Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #1 am: Oktober 23, 2006, 19:58:24 »

Zitat
Aber wie kann ich die Zeitumstellung berechnen, oder Wochentage in Assembler?

Den Wochentag kannst Du mit Zellers Kongruenz berechnen. Hier eine mögliche Lösung für die 16-Bit PICs.

Code:
;......................................................................................
; Subroutine: wochentag_sub
; Funktion: Berechnung des Wochentags nach Zellers Kongruenz,
; das Jahr wird in der Form 20yy vorrausgesetzt
; --> nur gültig für 1. März 2000 bis 31. Dezember 2099
;
; Parameter:
; w2: Tag,    dd
; w3: Monat,  mm
;    w4: Jahr,   yy
;
; verwendet: w0, w1, w2, w3, w4
;
; verändert: w0, w1
;
; Rückgabewert:
; w0: 0: Samstag, 1: Sonntag, 2: Montag, ... 6: Freitag
;......................................................................................

wochentag_sub:
push.d w2 ; w2 - w4 sichern
push w4        

cp w3, #3 ; Monat > 2 ?
bra NN, 1f ; ja
add #12, w3 ; nein, Monat = Monat + 12
dec w4, w4 ; Jahr = Jahr - 1

    1:
inc w3, w3 ; monat + 1

mul.uu w3, #26, w0 ; w0 = 26 * (monat+1)
; monat (w3) wird nicht mehr benötigt
mov #10, w3
repeat #17
    div.u   w0, w3 ; w0 = (26 * (monat+1)) / 10

add w2, w0, w0 ; w0 = Tag + ((26 * (monat+1)) / 10)
add w4, w0, w0 ; w0 = Tag + ((26 * (monat+1)) / 10) + Jahr

lsr w4, #2, w4 ; w4 = Jahr / 4

add w4, w0, w0 ; w0 = Tag + ((26 * (monat+1)) / 10) + Jahr + (Jahr/4)

add #5, w0 ; w0 = Tag + ((26 * (monat+1)) / 10) + Jahr + (Jahr/4) + (Jh/4)
sub #40, w0 ; w0 = Tag + ((26 * (monat+1)) / 10) + Jahr + (Jahr/4) + (Jh/4) - 2*Jh
; diese zwei Zeilen können natürlich zusammengefaßt werden

mov #7, w3
repeat #17
    div.s    w0, w3 ; w0 = (Tag + ((26 * (monat+1)) / 10) + Jahr + (Jahr/4) + (Jh/4) - 2*Jh) / 7
                        ; w1 = (Tag + ((26 * (monat+1)) / 10) + Jahr + (Jahr/4) + (Jh/4) - 2*Jh) % 7
                           
mov w1, w0 ; Rückgabewert, nur der Divisionsrest ist von Interesse

btsc w0, #15 ; Divisionsrest negativ?
    add     #7, w0 ; ja, also 7 addieren

pop w4 ; w2 - w4 wiederherstellen
pop.d w2

return

Die Berechnung des Wochentages kann man dann für die Sommer-/Winterzeit Umstellung verwenden, indem damit der letzte Sonntag im März/Oktober berechnet wird. Ausgehend von den obigen Werten (0=Samstag, 1=Sonntag, ...) ist das Datum des letzen Sonntags im Monat März/Oktober

    31 - (Wochentag vom Monatsletzen - 1)

wenn man für den Fall Samstag ("0") den Wochentagswert auf "7" setzt. Dann muß man nur noch mit dem aktuellen Datum vergleichen.


Viele Grüße

Bernd
« Letzte Änderung: Oktober 23, 2006, 20:05:55 von Bernd » Gespeichert

Mr. B A
Full Member
***
Offline Offline

Beiträge: 150



Profil anzeigen
« Antworten #2 am: Oktober 24, 2006, 06:29:26 »

Okay, geschnallt. Danke für den Tipp.
Ich habe mir nur überlegt, dass ich einen Zähler von 0-6 für den Wochentagsnamen mitlaufen lasse und dann mit einer Substraktion feststelle ob es der letzte Sonntag im Oktober oder März ist. Um 3 Uhr dann die Zeit umstellen und dann durch ein Bit anzeigen, dass die Zeit schon umgestellt wurde.
Ich wollte das erstmal mit einem PIC 16F648 machen.

Dirk
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.062 Sekunden mit 19 Zugriffen.
 
Top! Top!