-
Uhr mit Tagen
Hallo
Ich bin dabei eine Uhr u proggen.
Hier der Code:
Code:
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600
Declare Sub Plussekunde()
Declare Sub Plusminute()
Declare Sub Plusstunde()
Declare Sub Clockstart()
Declare Sub Showdigitalporta()
Declare Function Tastenabfrage() As Byte
Dim I As Integer
Dim N As Integer
Dim Ton As Integer
Dim Sekunde As Word
Dim Minute As Word
Dim Stunde As Word
Dim Taste As Byte
Config Portc = Output
Portc = 11111111
Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung
Config Pina.7 = Input 'Für Tastenabfrage
Porta.7 = 1 'Pullup Widerstand ein
Do
Taste = Tastenabfrage()
If Taste <> 0 Then
Select Case Taste
Case 1
Call Plussekunde
Case 2
Call Plusminute
Case 3
Call Plusstunde
Case 4
Call Clockstart
End Select
Sound Portd.7 , 400 , 500 'BEEP
End If
Waitms 100
If Sekunde = 60 Then
Sekunde = 0
Minute = Minute + 1
Sound Portd.7 , 400 , 550
Else
End If
If Minute = 60 Then
Minute = 0
Stunde = Stunde + 1
Else
End If
If Stunde = 24 Then
Stunde = 0
Else
End If
If Stunde = 1 Then
Portc.0 = 0
Elseif Stunde > 1 Then
Portc.0 = 0
Else
End If
Loop
End
Function Tastenabfrage() As Byte
Local Ws As Word
Tastenabfrage = 0
Ton = 600
Start Adc
Ws = Getadc(7)
If Ws < 500 Then
Select Case Ws
Case 400 To 450
Tastenabfrage = 1
Ton = 550
Case 330 To 380
Tastenabfrage = 2
Ton = 500
Case 260 To 305
Tastenabfrage = 3
Ton = 450
Case 180 To 220
Tastenabfrage = 4
Ton = 400
Case 90 To 130
Tastenabfrage = 5
Ton = 350
End Select
Sound Portd.7 , 400 , Ton
End If
End Function
Sub Plussekunde()
Sekunde = Sekunde + 1
Print Stunde ; ":" ; Minute ; ":" ; Sekunde
End Sub
Sub Plusminute()
Minute = Minute + 1
Print Stunde ; ":" ; Minute ; ":" ; Sekunde
End Sub
Sub Plusstunde()
Stunde = Stunde + 1
Print Stunde ; ":" ; Minute ; ":" ; Sekunde
End Sub
Sub Clockstart()
Config Timer1 = Timer , Prescale = 256 'Konfiguriere Timer1
Enable Interrupts
Enable Timer1
Sekunde = Sekunde + 1 ' + 2Sekunden für Timerausgleich
On Timer1 Isr_von_timer1 'verzweige bei Timer1 überlauf zu Isr_von_Timer1
Enable Interrupts
Timer1 = 68570 'Timer1 soll schon von 34285 wegzählen
End Sub
Isr_von_timer1: 'ISR von Timer1
Timer1 = 68570
'Sound Portd.7 , 400 , 550
'Print "Stunde" ; Stunde ; " Minute:" ; Minute ; " Sekunde:" ; Sekunde
Print Stunde ; ":" ; Minute ; ":" ; Sekunde
Sekunde = Sekunde + 1
Return
Werde ihn auch in die wiki schreiben, ist für manch anfäger bestimmt hilfreich.Läuft perfekt, aber ich brauche etwas mehr.
Mir ist es wichtig das die Tage (Mo,Di,Mi,Do,Fr,Sa,So) miteingestellt, bzw. gezählt werden.
Quasie If Stunde = 24 then
stunde = o
tag = tag + 1
Dann müsste die werte von 1-7 für Mo-So stehen.
Aber wie bekomme ich das hin, das so zu speichern bzw. auszugeben?
Gruß
Dominik
P.S.: Das ganze soll später mal änlich wie eine zeitschaltuhr laufen.
-
Ich würde das Problem anders angehen und gleich eine Wochentagsberechnung mit einbauen.
Wenn man die Uhr stellt, gibt man nicht nur die Zeit ein, sondern auch das Datum.
Die Wochentagsberechnung kannst Du aus der Seite von Wikipedia http://de.wikipedia.org/wiki/Wochentagsberechnung übernehmen.
Dann kann deine Schaltuhr auch nur an einem Tag im Monat, oder einmal im Jahr Schaltvorgänge auslösen.
Alternativ und einfacher wär es auch beim Stellen der Uhr den Wochentag mit einzugeben. Dann sind allerdings nur Schaltzyklen im Wochenrythmus möglich.
Wenn die Uhr tatsächlich als Schaltuhr betrieben werden soll, brauchst Du entweder eine Gangreserve mittels eines Akku's. Noch eleganter wär ein RTC Baustein mit Gangreserve, der vom Controller abgefragt wird.
Eine weitere Lösung wär einen DCF 77 Empfänger ( siehe Conrad Best.Nr.: 641138 ) als Syncquelle dem Controller vorzuschalten. Das Stellen der Uhr entfällt dann schon mal. Dann ist nur noch eine Pufferung der gewünschten Schaltzeitpunkte vorzusehen, aber die kann man ja mit dem EEPROM des Controllers realisieren.
Den Rest kannst Du nach Deinen Vorstellungen gestalten.
-
Ich würde es vielleicht mit einem Array oder per Switch Anweisung machen, im Array speicherst du von 1-7 deine Namen der Wochentage oder per switch halt im prinzip das gleiche.
oder wiewkrug vorgeschlagen hat über n DCF77, da gibs sogar ne tolle Bib hier im Downloadbereich, da kannste direkt alles Auslesen und du hast "Atomzeit" und du musst nix einstellen.
-
hallo, also erstaml werde ich es mit dem controler machen, also ohne DCF77.
Später werde ich dann den DCF77 einbinden.
Hat der neben der zeit auch das datum (also Montag 06.09.2010)?
Gibt es irgenwo eine anleitung über array oder swich?
habe damit bisher nämlich noch nie geabrbeitet und die anleitung im rn wissen hilft mir wenig
-
hier mal eine fertige Wochentagsberechnung für 2000-2100
Code:
Wochentag:
'http://de.wikipedia.org/wiki/Wochentagsberechnung#Schaltjahreskorrektur
'Days = Makedec(days)
'Months = Makedec(months)
'Years = Makedec(years)
Weekdays = Days Mod 7
J = Months - 1
J = Lookup(j , Monat)
Weekdays = Weekdays + J
J = Years \ 4
J = J + Years
J = J Mod 7
Weekdays = Weekdays + J
Weekdays = Weekdays + 6 'Jahrhunderziffer
I = Years Mod 4 : If I = 0 Then If Years <> 0 Then J = 6 Else J = 0
Weekdays = Weekdays + J
Weekdays = Weekdays Mod 7
'Days = Makebcd(days)
'Months = Makebcd(months)
'Years = Makebcd(years)
Lcd_textbuffer1 = Lookupstr(weekdays , Weekday)
'Locate 3 , 5 : Lcd Lcd_textbuffer1
Lcd_text = Lcd_textbuffer1 : Call Lcd_print(5 , 3 , Lcd_text)
Return
Monat:
Data 0 , 3 , 3 , 6 , 1 , 4 , 6 , 2 , 5 , 0 , 3 , 5
Weekday:
Data "So" , "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa"
-
habe den code mal in bascom geladen.
Code:
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600
'http://de.wikipedia.org/wiki/Wochentagsberechnung#Schaltjahreskorrektur
'Days = Makedec(days)
'Months = Makedec(months)
'Years = Makedec(years)
Weekdays = Days Mod 7
J = Months - 1
J = Lookup(j , Monat)
Weekdays = Weekdays + J
J = Years \ 4
J = J + Years
J = J Mod 7
Weekdays = Weekdays + J
Weekdays = Weekdays + 6 'Jahrhunderziffer
I = Years Mod 4 : If I = 0 Then If Years <> 0 Then J = 6 Else J = 0
Weekdays = Weekdays + J
Weekdays = Weekdays Mod 7
'Days = Makebcd(days)
'Months = Makebcd(months)
'Years = Makebcd(years)
Lcd_textbuffer1 = Lookupstr(weekdays , Weekday)
'Locate 3 , 5 : Lcd Lcd_textbuffer1
Lcd_text = Lcd_textbuffer1 : Call Lcd_print(5 , 3 , Lcd_text)
Return
Monat:
Data 0 , 3 , 3 , 6 , 1 , 4 , 6 , 2 , 5 , 0 , 3 , 5
Weekday:
Data "So" , "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa"
bekomme aber immer error 46 in linie 12 und 13.
-
Hallo Dominik,
der Code ist auch lediglich ein Auszug aus einem Programm, und stellt lediglich die Wochentagsberechnung dar.
Zur Ausführung fehlen dir Variablendeklarationen und Zuweisungen.
Du brauchst Werte für Days, Months, Years, welche das Datum beinhalten, zu welchem du den Wochentag haben willst und als Ergebis erhälst du die Variable Weekdays, welche den Wochentag wiederspiegelt.
Unbenutzte Zeilen wie die mit makedec und makebcd kannst du entfernen, und die Ausgabe (in den letzten 2 Zeilen vor dem return) musst du ebenfalls deinen Bedürfnissen anpassen.
Gruß BoGe-Ro
-
Achso, bin heute irgendwie was durch den wind ;)
also alles deklahiert:
Code:
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600
Dim Days As Word
Dim Months As Word
Dim Years As Word
Dim Weekdays As Word
Days = Days + 6
Months = Months + 9
Years = Years + 2010
Weekdays = Days Mod 7
J = Months - 1
J = Lookup(j , Monat)
Weekdays = Weekdays + J
J = Years \ 4
J = J + Years
J = J Mod 7
Weekdays = Weekdays + J
Weekdays = Weekdays + 6 'Jahrhunderziffer
I = Years Mod 4 : If I = 0 Then If Years <> 0 Then J = 6 Else J = 0
Weekdays = Weekdays + J
Weekdays = Weekdays Mod 7
Lcd_textbuffer1 = Lookupstr(weekdays , Weekday)
Lcd_text = Lcd_textbuffer1 : Call Lcd_print(5 , 3 , Lcd_text)
Return
Monat:
Data 0 , 3 , 3 , 6 , 1 , 4 , 6 , 2 , 5 , 0 , 3 , 5
Weekday:
Data "So" , "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa"
aber er hatt noch mit
Code:
J = Months - 1
J = Lookup(j , Monat)
probleme.
error 31 und 46.
-
habe ausversehen noch ein paar sachen vergessen ;)
hier der code, ohne fehler.
muss ihn nurnoch testen
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600
Dim Days As Word
Dim Months As Word
Dim Years As Word
Dim Weekdays As Word
Dim J As Word
Dim I As Word
Days = Days + 6
Months = Months + 9
Years = Years + 2010
Weekdays = Days Mod 7
J = Months - 1
J = Lookup(j , Monat)
Weekdays = Weekdays + J
J = Years \ 4
J = J + Years
J = J Mod 7
Weekdays = Weekdays + J
Weekdays = Weekdays + 6 'Jahrhunderziffer
I = Years Mod 4 : If I = 0 Then If Years <> 0 Then J = 6 Else J = 0
Weekdays = Weekdays + J
Weekdays = Weekdays Mod 7
Print
Print "Days:" ; Days
Print "Months:" ; Months
Print "Years:" ; Years
Print "Weekdays:" ; Weekdays
Print "J:" ; J
Print "I:" ; I
Print
Wait 5
Return
Monat:
Data 0 , 3 , 3 , 6 , 1 , 4 , 6 , 2 , 5 , 0 , 3 , 5
Weekday:
Data "So" , "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa"
rauskommt im terminal:
Days:6
Months:9
Years:2010
Weekdays:3
J:0
I:2
Days, Months, Years korrekt, aber Weekdays (wochentag) müsste doch 1 sein (Montag) oder nicht
-
ist es eigentlich auch möglich etwas in der art zu machen:
If Stunde = 24 then
Stundee = 0
Tag = Tag + 1
else
endif
if tag = 7 then
tag =0
else
end if
und dan irgendwie tag 1 Montag zuweisen?