PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Uhr mit Tagen



Dominik009
05.09.2010, 20:53
Hallo
Ich bin dabei eine Uhr u proggen.
Hier der 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.

wkrug
05.09.2010, 21:36
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.

hunni
05.09.2010, 21:55
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.

Dominik009
06.09.2010, 07:12
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

BoGe-Ro
06.09.2010, 08:37
hier mal eine fertige Wochentagsberechnung für 2000-2100





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"

Dominik009
06.09.2010, 08:58
habe den code mal in bascom geladen.


$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.

BoGe-Ro
06.09.2010, 09:09
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

Dominik009
06.09.2010, 09:15
Achso, bin heute irgendwie was durch den wind ;)
also alles deklahiert:



$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


J = Months - 1
J = Lookup(j , Monat)




probleme.

error 31 und 46.

Dominik009
06.09.2010, 09:29
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

Dominik009
06.09.2010, 11:43
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?

BoGe-Ro
06.09.2010, 12:28
versuch mal das Jahr nur zweistellig - also anstelle 2010 nur 10.
J und I sind nur Variablen die Temporär belegt sind - also deren Ergebnis am Ende keine Rolle spielt.

Was du mit deinem Code im letzten Post vorhast verstehe ich leider nicht.
klar, alle 24 Stunden muss man den Tag einmal inkrementieren. damit würdest du eine fortlaufende Zahl erreichen, die jeden Tag um 1 anwächst.
Diese ließe sich auch wieder bei 8 umbrechen (if Tag>=8 then Tag=1) und du könntest mit Lookup oder Case nach dem dazugehörigen Wochentag schauen.

Dann musst du aber jedes mal die Uhr vor- und zurückstellen um rauszukriegen was morgen für ein Wochentag ist, oder Heiligabend.

Gruß BoGe-Ro

Dominik009
06.09.2010, 12:54
hi
also mit lookup und case kenne ich mich nicht aus sorry.
Kanst mir vieleicht ein beispiel aufzeien?
Also sin der ganzen sache ist es das ich 1. im display die akutelle zeit steht unbd 2tens zum bestimten zeiten an bestimmten tagen aktionen ausgeführt werden z.b. Led's dimmen und co.

gruß Dominik

hunni
06.09.2010, 12:56
also das geht alles, wie gesagt, am einfachsten ist es warscheinlich mit einer switch case anweisung oder gleich mehreren verschachtelten. Musst du einfach mal die Bascomhilfe aufschlagen und nach SWITCH-CASE suchen. Dort ist das erklärt, oder bei Wiki Switch anweisung eingeben.

Dominik009
06.09.2010, 13:09
also bei der wiki finde ich nichts unter switch anweisung.
bei bascom unter hilfe kommt wenn ich nach switch suche kein treffer :(
Irgendwie stehe ich auf dem schlauch

hunni
06.09.2010, 13:19
ok also das Ding heißt unter Bascom:

SELECT-CASE-END SELECT

Sorry hier heißt das etwas anders als in C, naja und i wie habe ich mir angewöhnt dazu switch anweisung zu sagen.
Eine Switch anweisung ist im prinzip eine mehrfache if anweisung: Select Case [Variable]
Wo Variable steht schreibste das rein, was er überprüfen soll,
hinter CASE schreibste rein, was die Variable für ein Wert haben soll, z.B. 3, also wenn die in der Variable eine 3 steht, führt er alles aus, was im Case steht.

Dominik009
06.09.2010, 13:25
Danke dir,

also z.b. select case 8 [Tag]
tag = tag - 7
dann würde gefrüft ob die variable tag den wert 8 hatt, und fals ja würde der wert auf zurückgesetzt. soweit sogut. Ist ja fast das slebe wie mit if then...

aber wie verknüpfe ich das mit den wochentagen wie montag oder mittwoch?
lookup und case wurde oben geschireben, aber da habe ich keine ahnung von :(

hunni
06.09.2010, 13:41
ohh man mach doch einfach n kleinen zähler der da sagt:

If stunde = 24 then
stunde= 0
tag = tag +1
end if

select case tag
case 1 : Print "Montag"
case 2 : Print "Dienstag"
.
.
.
dann noch ne kleine if anweisung:

if tag >7 then
tag = 0
woche = woche +1
end if
dann haste sogar n Kalenderwochenzähler noch mit drin
kannst natürlich auch weglassen und so einfach tag auf 0 setzen.
Kannst das auch so machen, das du mit Case Else arbeitest , da würdest du dir die eine if anweisung sparen und einfach sagen:

case select : tag = 0

gruß Hunni

Dominik009
06.09.2010, 13:52
hey danke Hunni, hat mir SEHR geholfen.
Aber ein kleines problem habe ich noch.
ich habe in meinem timer die anweisung:
Print Stunde ; ":" ; Minute ; ":" ; Sekunde
also werden jede sekunden die akutellen daten ausgegeben.
Ist es möglich das ich da auch den Wochtenag reinbekomme?
Weil die select case tag anweisung stände dann ja extra, und es whre besser wens alles hinernander in einer reihe geschhrieben würde.

gruß Dominik

hunni
06.09.2010, 13:58
nah kla, die einfachste möglickeit wäre einfach noch eine word variable zu erzeugen und anstatt dem case 1: Print "BLA" einfach nur:

DIM Wochentag as Word
.
.
.den ganzen anderen kram ;)
.
case 1 : Wochentag = "Montag"

und das bindest du einfach dann in deine Printanweisung ein:
Print Stunde ; ":" ; Minute ; ":" ; Sekunde;":";Wochentag

Dominik009
06.09.2010, 14:18
Danke
habe jetzt die printanweisung :
Print Stunde ; ":" ; Minute ; ":" ; Sekunde ; ":" ; Wochentag

und oben in meiner do loop schleife:
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
Else
End If

If Minute = 60 Then
Minute = 0
Stunde = Stunde + 1
Else
End If

If Stunde = 24 Then
Stunde = 0
Tag = Tag + 1
End If

select case tag
Case 1 : Wochentag = "Montag"
Case 2 : Wochentag = "Dienstag"
Case 3 : Wochentag = "Mittwoch"
Case 4 : Wochentag = "Donnerstag"
Case 5 : Wochentag = "Freitag"
Case 6 : Wochentag = "Samstag"
Case 7 : Wochentag = "Sonntag"
End Select

jetzt habe ich aber errors: 2x error 242 in den folgenden eilen:

Case 1 : Wochentag = "Montag"
Case 2 : Wochentag = "Dienstag"

und nochmal error 7 und 269 in der Case 2 : Wochentag = "Dienstag" eile.

K.a. wie ich die beseitiegen kann.

hunni
06.09.2010, 14:37
Mhhh.... Das n bisschen merkwürdig. Musst noch mal ein wenig rumprobieren, aber schon schön zu sehen, das du anscheinend die switch anweisung verstanden hast, haste ja auch gleich oben reingepackt ;) cool. Für solche sachen is die gedacht.
ahh mom, ich glaube du brauchst immer ein Else Case, schreib einfach nix dahinter, einige Proggersprachen brauchen das.
Probier einfach mal

Dominik009
06.09.2010, 14:42
hallo
jo, habe die oben reingepackt, für die tastenabfrage, läuft gut ;)

habe es jetzt so (mit else case)
Select Case Tag
Case 1 : Wochentag = "Montag"
Case 2 : Wochentag = "Dienstag"
Case 3 : Wochentag = "Mittwoch"
Case 4 : Wochentag = "Donnerstag"
Case 5 : Wochentag = "Freitag"
Case 6 : Wochentag = "Samstag"
Case 7 : Wochentag = "Sonntag"
Else Case
End Select

geht nicht. Auch wenn ich end select rausmache, geht nicht.
immer die selben fehler :(

Dominik009
06.09.2010, 14:44
wenn ich die doppelpunkte zwischen case 1 und wochentag weglasse kommt bei den errors: 2x error 35 in der case 1 & 2 Zeile
und einmal 269 in der case 2 zeile.

hier nochmal der komplette 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 Wochentag As Word
Dim Tag 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
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
Else
End If

If Minute = 60 Then
Minute = 0
Stunde = Stunde + 1
Else
End If

If Stunde = 24 Then
Stunde = 0
Tag = Tag + 1
End If

Select Case Tag
Case 1 Wochentag = "Montag"
Case 2 Wochentag = "Dienstag"
Case 3 Wochentag = "Mittwoch"
Case 4 Wochentag = "Donnerstag"
Case 5 Wochentag = "Freitag"
Case 6 Wochentag = "Samstag"
Case 7 Wochentag = "Sonntag"
Else Case
End Select








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 ' + 1Sekunden 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 ; ":" ; Wochentag
Sekunde = Sekunde + 1
Toggle Portc.0
Return

Dominik009
06.09.2010, 15:32
Wenn ich anstat Der Namen zahlen hinschreibe geht es, aber es geht doch gerade um die namen :(

Kann es sein das man bei vairablen nur zahlen machen kann?
weil das mit den wörtern ist eigentlich genau das ,was ich wollte.


Edit: So, habe herausgefunden das word variablen keine wörter speichern können, also den type oben auf byte gesetzt, da die dan buchstaben speichern können.
Nun kommen keine error meldungen meer aber im terminal steht:
0:2:25:68
0:2:26:68
0:2:27:68
0:2:28:68
0:2:29:68

Warum 68? da müsster doch ein Tag stehen!

Der gesammte 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 Plustag()
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 Wochentag As Byte
Dim Tag 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
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
Case 5
Call Plustag
End Select
Sound Portd.7 , 400 , 500 'BEEP
End If
Waitms 100

If Sekunde = 60 Then
Sekunde = 0
Minute = Minute + 1
Else
End If

If Minute = 60 Then
Minute = 0
Stunde = Stunde + 1
Else
End If

If Stunde = 24 Then
Stunde = 0
Tag = Tag + 1
End If

If Tag > 7 Then
Tag = 1
End If

'Select Case Tag
'Case 1 Wochentag = "Montag"
'Case 2 Wochentag = "Dienstag"
'Case 3 Wochentag = "Mittwoch"
'Case 4 Wochentag = "Donnerstag"
'Case 5 Wochentag = "Freitag"
'Case 6 Wochentag = "Samstag"
'Case 7 Wochentag = "Sonntag"
'Else Case
'End Select

Select Case Tag
Case 1
Wochentag = "Montag"
Case 2
Wochentag = "Dienstag"
Case 3
Wochentag = "Mittwoch"
Case 4
Wochentag = "Dönnerstag"
Case 5
Wochentag = "Freitag"
Case 6
Wochentag = "Samstag"
Case 7
Wochentag = "Sonntag"
End Select




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 ; ":" ; Wochentag
End Sub

Sub Plusminute()
Minute = Minute + 1
Print Stunde ; ":" ; Minute ; ":" ; Sekunde ; ":" ; Wochentag
End Sub

Sub Plusstunde()
Stunde = Stunde + 1
Print Stunde ; ":" ; Minute ; ":" ; Sekunde ; ":" ; Wochentag
End Sub
Sub Plustag()
Tag = Tag + 1
Print Stunde ; ":" ; Minute ; ":" ; Sekunde ; ":" ; Wochentag
End Sub




Sub Clockstart()
Config Timer1 = Timer , Prescale = 256 'Konfiguriere Timer1
Enable Interrupts
Enable Timer1
Sekunde = Sekunde + 1 ' + 1Sekunden 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 ; ":" ; Wochentag
Sekunde = Sekunde + 1
Toggle Portc.0
Return









Isr_von_timer1: 'ISR von Timer1
Timer1 = 68570
'Sound Portd.7 , 400 , 550
'Print "Stunde" ; Stunde ; " Minute:" ; Minute ; " Sekunde:" ; Sekunde
Print Stunde ; ":" ; Minute ; ":" ; Sekunde ; ":" ; Wochentag
Sekunde = Sekunde + 1
Toggle Portc.0
Return

peterfido
06.09.2010, 18:08
Verstehe nicht, wieso eine Hochsprache genutzt wird, wenn eh alles zu Fuss gemacht wird..
Wenn die Uhr im synchron Modus laufen soll, dann einfach statt config clock ein config dcf

oben die bascom Uhr Routinen aktivieren

Dim Wochentag As String * 12
dim wtag as byte
config clock = modus

weiter unten den Wochentag ausgeben:

Wtag = Dayofweek()
If Wtag = 0 Then Wochentag = " Montag "
If Wtag = 1 Then Wochentag = " Dienstag "
If Wtag = 2 Then Wochentag = " Mittwoch "
If Wtag = 3 Then Wochentag = " Donnerstag "
If Wtag = 4 Then Wochentag = " Freitag "
If Wtag = 5 Then Wochentag = " Samstag "
If Wtag = 6 Then Wochentag = " Sonntag "

Dominik009
06.09.2010, 20:13
also bei deinem code kommen nur immer weiter errors :(
kansst du vieleicht einen code reinstellen der besserfunktioniert, als zu fuss?

bei diesem test code kommt auch immer nur 77 im terminal raus :(


$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600



Dim Wochentag As Byte


Do
Wochentag = "Montag"

Print Wochentag
Wait 2
Loop

wenn ich da abc eingwbe kommt im terminal 97.

for_ro
06.09.2010, 20:21
77 ist der ASCII des ersten Zeichens von "Montag", also des M.
Du musst Wochentag schon als String definieren, wenn du der Variablen einen String zuweisen willst.
So, wie das bei Peterfido auch steht.

peterfido
06.09.2010, 20:26
Ich habe nur die Wochentags"geschichte" gepostet. Natürlich muss die Uhr und vor Allem das Datum gestellt werden, damit es richtig läuft. Doch dafür verweise ich lieber auf die Bascom-Hilfe. >config clock; >config dcf77

hunni
06.09.2010, 20:59
Mhh gib ma deinen kompletten Code her, dann hau ich das mal bei mir rein, kann soetwas doch besser, wenn ich es live sehe.

Dominik009
06.09.2010, 21:07
Danke habe es geschaft ! Vielen dank :D
habe oben Dim Wochentag As String * 12 reingeschrieben und das wars.

dim wtag as byte
config clock = modus
hatt fehler verursacht, jetzt da's raus ist läufts super.

Den code poste ich morgen, nach getaner arbeit lege ich mich jetzt erstmal schlafen ;)

hunni
06.09.2010, 21:19
Tu das, schlaf dich erstmal aus, ich muss noch ein C# Programm für die Schule/Ausbildung schreiben, kann mich also noch net hinlegen ;)

Gruß Hunni

Dominik009
07.09.2010, 12:34
Hallo
Also vielen dank nochmal für die Hilfe.
Hier der 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 Plustag()
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 Wochentag As String * 12


Dim Tag 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

Tag = 1
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
Case 5
Call Plustag
End Select
Sound Portd.7 , 400 , 500 'BEEP
End If
Waitms 100

If Sekunde = 60 Then
Sekunde = 0
Minute = Minute + 1
Else
End If

If Minute = 60 Then
Minute = 0
Stunde = Stunde + 1
Else
End If

If Stunde = 24 Then
Stunde = 0
Tag = Tag + 1
End If

If Tag > 7 Then
Tag = 1
End If

'Select Case Tag
'Case 1 Wochentag = "Montag"
'Case 2 Wochentag = "Dienstag"
'Case 3 Wochentag = "Mittwoch"
'Case 4 Wochentag = "Donnerstag"
'Case 5 Wochentag = "Freitag"
'Case 6 Wochentag = "Samstag"
'Case 7 Wochentag = "Sonntag"
'Else Case
'End Select

Select Case Tag
Case 1
Wochentag = "Montag"
Case 2
Wochentag = "Dienstag"
Case 3
Wochentag = "Mittwoch"
Case 4
Wochentag = "Donnerstag"
Case 5
Wochentag = "Freitag"
Case 6
Wochentag = "Samstag"
Case 7
Wochentag = "Sonntag"
End Select




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 Wochentag ; ", " ; Stunde ; ":" ; Minute ; ":" ; Sekunde
End Sub

Sub Plusminute()
Minute = Minute + 1
Print Wochentag ; ", " ; Stunde ; ":" ; Minute ; ":" ; Sekunde
End Sub

Sub Plusstunde()
Stunde = Stunde + 1
Print Wochentag ; ", " ; Stunde ; ":" ; Minute ; ":" ; Sekunde
End Sub
Sub Plustag()
Tag = Tag + 1
Print Wochentag ; ", " ; Stunde ; ":" ; Minute ; ":" ; Sekunde
End Sub




Sub Clockstart()
Config Timer1 = Timer , Prescale = 256 'Konfiguriere Timer1
Enable Interrupts
Enable Timer1
Sekunde = Sekunde + 1 ' + 1Sekunden 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 Wochentag ; ", " ; Stunde ; ":" ; Minute ; ":" ; Sekunde
Sekunde = Sekunde + 1
Toggle Portc.0
Return



Ich werde mal sehen ob ich das noch besser hinbkomme.
Gibt es ausser der bascom hilfe noch was wo das beschrieben wird?
Weil ich verstehe es immre besser wen's auf deutsch istt ;)

Gruß Dominik

Dominik009
07.09.2010, 15:36
Halo
habe noch ein kleines problem.
Habe den code etwas benutzerfreundlicher gemacht.
Nur springt die Uhr jetzt nach dem einstellen am anfang immer auf den n#chsten tag (also ich stelle mittwoch 11:11:11 ein und sie springt auf donnerstag 11:11:12) :(

Vieleicht könnt ihr mir nochmal helfe?

Hier der Cide


$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 Plustag()
Declare Function Tastenabfrage() As Byte
Dim I As Integer
Dim N As Integer
Dim Ton As Integer
Dim Tag As Word
Dim Taste As Byte
Dim Wochentag As String * 12
Dim Stunde As Word
Dim Minute As Word
Dim Sekunde As Word

Tag = 2


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




Sound Portd.7 , 400 , 450 'BEEP
Sound Portd.7 , 400 , 250 'BEEP
Sound Portd.7 , 400 , 450 'BEEP
Wait 1
Print
Print "Zeitschaltuhr -Test"
Print
Wait 1
Print
Print "Bitte Uhrzeit und Wochentag einstellen!"
Print
Wait 1
Print
Print "Bitte Wochentag eingeben"
Print
Wait 1
Print "Anleitung:"
Print "Wochentag einstellen: Taste-1"
Print "OK: Taste-5"
Wait 1
Print
Print "Aktueller Tag:"
Print "Montag"
Do



Select Case Tag
Case 1
Wochentag = "Montag"
Case 2
Wochentag = "Dienstag"
Case 3
Wochentag = "Mittwoch"
Case 4
Wochentag = "Donnerstag"
Case 5
Wochentag = "Freitag"
Case 6
Wochentag = "Samstag"
Case 7
Wochentag = "Sonntag"
Case 8
Wochentag = "Montag"
End Select

If Tag > 7 Then
Tag = 1
End If
Taste = Tastenabfrage()
If Taste <> 0 Then

Select Case Taste
Case 1
Tag = Tag + 1
Waitms 200
Print Wochentag
Case 5
Exit Do
End Select
Sound Portd.7 , 400 , 500 'BEEP
End If

Loop



Sound Portd.7 , 400 , 500 'BEEP
Print
Print "Bitte Uhrzeit einstellen"
Wait 1
Print
Print "Anleitung:"
Print "Stunden einstellen : Taste-1"
Print "Minuten einstellen : Taste-2"
Print "Sekunden einstellen: Taste-3"
Print "OK : Tase-5"
Wait 1
Print
Print "Akutelle Zeit:"
Print "0:0:0"

Do



Taste = Tastenabfrage()
If Taste <> 0 Then

Select Case Taste
Case 1
Stunde = Stunde + 1
Waitms 50
Print Stunde ; ":" ; Minute ; ":" ; Sekunde:
Case 2
Minute = Minute + 1
Waitms 50
Print Stunde ; ":" ; Minute ; ":" ; Sekunde
Case 3
Sekunde = Sekunde + 1
Waitms 50
Print Stunde ; ":" ; Minute ; ":" ; Sekunde
Case 5
Exit Do
End Select
Sound Portd.7 , 400 , 500 'BEEP
End If

If Sekunde = 60 Then
Sekunde = 0
End If

If Minute = 60 Then
Minute = 0
End If

If Stunde = 24 Then
Stunde = 0
End If

Loop

Sound Portd.7 , 400 , 500 'BEEP
Config Timer1 = Timer , Prescale = 256 'Konfiguriere Timer1
Enable Interrupts
Enable Timer1
Sekunde = Sekunde + 1 ' + 1Sekunden 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

Do


If Sekunde = 60 Then
Sekunde = 0
Minute = Minute + 1
Else
End If

If Minute = 60 Then
Minute = 0
Stunde = Stunde + 1
Else
End If

If Stunde = 24 Then
Stunde = 0
Tag = Tag + 1
End If

If Tag > 7 Then
Tag = 1
End If



Select Case Tag
Case 1
Wochentag = "Montag"
Case 2
Wochentag = "Dienstag"
Case 3
Wochentag = "Mittwoch"
Case 4
Wochentag = "Donnerstag"
Case 5
Wochentag = "Freitag"
Case 6
Wochentag = "Samstag"
Case 7
Wochentag = "Sonntag"
End Select




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







Isr_von_timer1: 'ISR von Timer1
Timer1 = 68570
'Sound Portd.7 , 400 , 550
Print Wochentag ; ", " ; Stunde ; ":" ; Minute ; ":" ; Sekunde
Sekunde = Sekunde + 1
Toggle Portc.0
Return

hunni
07.09.2010, 17:35
also ich bin mir nicht ganz sicher, aber du machst zuerst:



Select Case Tag
Case 1
Wochentag = "Montag"
Case 2
Wochentag = "Dienstag"
Case 3
Wochentag = "Mittwoch"
Case 4
Wochentag = "Donnerstag"
Case 5
Wochentag = "Freitag"
Case 6
Wochentag = "Samstag"
Case 7
Wochentag = "Sonntag"
Case 8
Wochentag = "Montag"
End Select

und dann erst fragste die taster ab.


Taste = Tastenabfrage()
If Taste <> 0 Then

Select Case Taste
Case 1
Tag = Tag + 1
Waitms 200
Print Wochentag
Case 5
Exit Do
End Select


So drückst du im prinzip einmal zu viel drauf. Vielleicht solltest du zuerst die Taster abfragen und dann schreiben, welcher Tag das is.
Gruß Hunni

Dominik009
07.09.2010, 19:10
hi
also ich habe doch erst den oberen teil und dann den unteren. mit dem unteren muss ich sehen wie ich das löse, weiss noch nicht wie ich das machen soll

Dominik009
07.09.2010, 19:23
So, habe jetzt einfach etwas vertauscht:
Select Case Tag
Case 1
Wochentag = "Dienstag"
Case 2
Wochentag = "Mittwoch"
Case 3
Wochentag = "Donnerstag"
Case 4
Wochentag = "Freitag"
Case 5
Wochentag = "Samstag"
Case 6
Wochentag = "Sonntag"
Case 7
Wochentag = "Montag"
Case 8
Wochentag = "Dienstag"
End Select

was besseres fällt mir momentan nicht ein, bei stunde, minute und sekunde läuftsja supper, nur bei tag nicht :(

aber jetzt gehts ja

hunni
07.09.2010, 19:35
mhh, ansonsten probier mal das:


Case 1
Wochentag = "Montag"
Case 2
Wochentag = "Dienstag"
Case 3
Wochentag = "Mittwoch"
Case 4
Wochentag = "Donnerstag"
Case 5
Wochentag = "Freitag"
Case 6
Wochentag = "Samstag"
Case 7
Wochentag = "Sonntag"
Case Else : tag= 1
End Select

Dominik009
07.09.2010, 19:46
bringt nichts :(
immer noch ein tag zuviel, das andere ist halt gefuscht :(

hunni
08.09.2010, 09:42
mhh..... komisch..... leider kann ich dir jetzt auch net den code ganz neu schreiben, da ich im augenblick gerade etwas viel mit der schule zu tun hab.
Versuch einfach nochmal den Code neuzuschreiben, ohne den alten anzugucken, so mach ich das auch manchmal, wenns net hilft.
Ansonsten müsstest du gucken, ob du deinen Taster entprellt hast, aber daran kann das eig net liegen.
Gruß Hunni