-         

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 39

Thema: Uhr mit Tagen

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.12.2008
    Ort
    Köln
    Beiträge
    459

    Uhr mit Tagen

    Anzeige

    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.

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    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.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.03.2008
    Ort
    Huntlosen
    Alter
    25
    Beiträge
    391
    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.

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.12.2008
    Ort
    Köln
    Beiträge
    459
    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

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    19.02.2010
    Beiträge
    67
    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"

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.12.2008
    Ort
    Köln
    Beiträge
    459
    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.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    19.02.2010
    Beiträge
    67
    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

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.12.2008
    Ort
    Köln
    Beiträge
    459
    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.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.12.2008
    Ort
    Köln
    Beiträge
    459
    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

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.12.2008
    Ort
    Köln
    Beiträge
    459
    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?

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •