Hallo, ich versuche gerade selbiges mit datum und Wochentaganzeige, will aber die ausgabe vorerst über RS232 machen, später über ein LCD anzeigen und auch über I2C/TWI an einen anderen Microcontroller senden.

Habe mir dazu auch schon häftig was geschrieben, es wird mir auch über RS232 ausgegeben, aber das einstellen mit drei tastern (wofür etwa 3/4 des Codes zuständig ist) geht überhaupt nicht (keine reaktion) und nach einiger Zeit (6 Stunden, 52Minuten und nochmalwas sekunden) fängt er an, sich dauernd zu resetten.



EDIT: Ich habe nochmal neu angefangen, und mich Abschnittsweise an mein Ziel rangetastet. Jetzt geht es, ich muss nur noch die Passende Wartezeit finden, damit ich auch nach nem Jahr nicht um mehrere Minuten daneben lieg... (supergenau musses nicht sein/brauch ich es nicht)

Code:
$regfile = "m8515.dat"
  $framesize = 50
  $swstack = 50
  $hwstack = 50
  $crystal = 8000000

  $baud = 9600


  'config LCD

                                           'LCD konfiguriert (optional)


  Config Pina.0 = Input
  Porta.0 = 1
  Setztaster Alias Pina.0

  Config Pina.1 = Input
  Porta.1 = 1
  Auftaster Alias Pina.1

  Config Porta.2 = Input
  Porta.2 = 1
  Abtaster Alias Pina.2
                                          'eingänge für die Taster zum stellen konfiguriert




  Declare Sub Einstellen(tag As Byte , Monat As Byte , Jahr As Word , Monatstage As Byte , Hjahr As Byte , Htagname As Integer )
  Declare Sub Uhrzeiteinstellen(sekunde As Integer , Minute As Integer , Stunde As Integer )



  Dim Sekunde As Integer
  Dim Minute As Integer
  Dim Stunde As Integer
  Dim Tag As Byte
  Dim Monat As Byte
  Dim Jahr As Word
  Dim Tagname As String * 2                                 'Hauptvariablen deklariert

  Dim Monatstage As Byte                                    'zur ermittlung der Tage des Monats (30.2.2008 wäre schlecht)
  Dim Hjahr As Byte                                         'zum zählen der Jahre um schaltjahre zu erkennen (das 2400 das Schaltjahr ausfällt, interessiert mich herzlich wenig)
  Dim Htagname As Integer                                   'zum durchzaehlen der Wochentage

                                                          'Hilfsvariablen deklariert





  Sekunde = 0
  Minute = 0
  Stunde = 0
  Tag = 1
  Monat = 1
  Jahr = 2007                                               '1.1.2007

  Hjahr = 3                                                 '2008 kommt wieder ein Schaltjahr
  Htagname = 1                                              'der 1.1.2007 war ein montag
                                                            'damit die Variablen schon zu anfang Werte haben

  Wait 1                                                    'wegen entprellter Taster mittels Kondensator zu GND

  Do

     Incr Sekunde                                           'Damit wird eine Sekunde weiter gezaehlt

     If Sekunde = 60 Then
        Sekunde = 0                                         '...nach 60 Sekunden ist ne minute rum..
        Incr Minute
     End If

     If Minute = 60 Then                                    '...nach 60 Minuten ne Stunde...
        Minute = 0
        Incr Stunde
     End If


     If Stunde = 24 Then                                    '...und nach 24 Stunden ein Tag...
        Stunde = 0
        Incr Tag
        Incr Htagname                                       '...der natuerlich dann nicht mehr dersselbe Wochentag ist
     End If


     Select Case Monat                                      ' erstmal muss ich wissen, wieviele Tage der Monat hat..

       Case 1 :
          Monatstage = 31
       Case 2 :
          If Hjahr = 4 Then
             Monatstage = 29                                ' (beim Schaltjahr)
          Else
             Monatstage = 28                                ' (sonst)
          End If
       Case 3 :
          Monatstage = 31
       Case 4 :
          Monatstage = 30
       Case 5 :
          Monatstage = 31
       Case 6 :
          Monatstage = 30
       Case 7 :
          Monatstage = 31
       Case 8 :
          Monatstage = 31
       Case 9 :
          Monatstage = 30
       Case 10 :
          Monatstage = 31
       Case 11 :
          Monatstage = 30
       Case 12 :
          Monatstage = 31

    End Select



    If Tag > Monatstage Then                                '...dann kann ich auch sagen, wann der Monat vorbei ist
       Incr Monat
       Tag = 1
    End If

    If Monat = 13 Then                                      'und nach 12 Monaten ist ein Jahr rum
       Monat = 1
       Incr Jahr
    End If


    Select Case Htagname                                    'dann guck ich noch, was fuern Wochentag ich hab...

       Case 1 : Tagname = "Mo"
       Case 2 : Tagname = "Di"
       Case 3 : Tagname = "Mi"
       Case 4 : Tagname = "Do"
       Case 5 : Tagname = "Fr"
       Case 6 : Tagname = "Sa"
       Case 7 : Tagname = "So"
    End Select

    If Htagname = 8 Then                                    'mehr als 7 verschiedene Wochentage gib es aber nicht
       Htagname = 1
    End If






    If Setztaster = 0 Then                                  'und wenn der Taster gedrueckt ist, will ich was einstellen
       Call Einstellen(tag , Monat , Jahr , Monatstage , Hjahr , Htagname )       'darum gehts jetzt in die Subs

       Call Uhrzeiteinstellen(sekunde , Minute , Stunde )   'ich hab zwei Subs weil ich sonst nen Rueffel vom Compiler bekomm, und ich besser Fehler finden kann
    End If





    Waitms 983                                              'n grober Schätzwert, dass ich die Loop-Schleife in einer Sekunde durchlaufe (dann kommt ja wieder "Incr Sekunde". Da kommt noch was genaueres hin. Irgendwann, vielleicht, unter Umstaenden


    Print Tagname ; " " ; Tag ; ". " ; Monat ; ". " ; Jahr ; "   " ; Stunde ; ":" ; Minute ; ":" ; Sekunde       'Und hier geb ich dann Wochentag, Datum und Uhrzeit aus


  Loop                                                      'der Loop zur ganzen Geschichte








  Sub Einstellen(tag As Byte , Monat As Byte , Jahr As Word , Tagname As String * 2 , Monatstage As Byte , Hjahr As Byte , Htagname As Integer )       'die Sub zum Einstellen des Datums (da noch Sekunde, Minute und Stunde dazu = Horror fuer den Compiler)

    Wait 1

    While Setztaster = 1                                    'soll laufen bis der Setztaster erneut betaetigt wird (ginge auch mit Do - Loop until)

    If Auftaster = 0 Then                                   'wenn man incrementieren will, dann..
       Incr Jahr                                            '...ein Jahr weiterzaehlen...
       Incr Hjahr                                           '...den Zaehler fuer Schaltjahre mit weiterzaehlen
       If Hjahr > 4 Then
          Hjahr = 0                                         ' (n Schaltjahr kommt eben alle 4 Jahre vor)
       End If
       If Hjahr = 4 Then
          Htagname = Htagname + 2                           ' (faengt ein Jahr mit "Mo" an, und das naechste ist ein Schaltjahr, so faengt dieses mit "Mi" an)
       Else
          Incr Htagname                                     ' (faengt ein Jahr mit nem "Mo" an, so faengt das naechste mit nem "Di" an)
       End If
    End If

    If Abtaster = 0 Then                                    'the same procedure as beim indrementieren, nur diesmal decrementieren
       Decr Jahr
       Decr Hjahr
       If Hjahr = 0 Then
          Htagname = Htagname - 2
       Else
          Incr Htagname
       End If
       If Hjahr < 1 Then
          Hjahr = 4
       End If
    End If

    If Htagname < 1 Then                                    'Htagname kann negativ werden ("mo" entspricht 1, -2 wird daraus -1. es ist aber 6, naemlich "Sa"
       Htagname = Htagname + 7
    Elseif Htagname > 7 Then
       Htagname = Htagname - 7                              'selbiges kann bei + passieren
    End If


    Print "Jahr: " ; Jahr                                   'und AUSGABE! (den Rest mit auszugeben wird zu problematisch)

    Waitms 200                                              'Warten, damit nicht zu schnell weiter-/zurueckgezaehlt wird (Reaktionstests und Geschicklichkeitsuebungen sind hier NICHT vorgesehen)

    Wend


    Wait 1


    While Setztaster = 1

       If Auftaster = 0 Then                                ' und das ganze fuern Monat
         If Monat = 12 Then                                 'nicht weiterzaehlen, ist sonst zu schwer
         Else                                               'sonst...

          Incr Monat

          Select Case Monat                                 'Jeh nach Monat beginnt der naeechste mit nem anderen Wochentag (pfffft, codecodecode)

         Case 1 :
            Htagname = Htagname + 3
         Case 2 :
           If Hjahr = 4 Then
              Htagname = Htagname + 1
           Else

           End If
         Case 3 :
           Htagname = Htagname + 3
         Case 4 :
           Htagname = Htagname + 2
         Case 5 :
           Htagname = Htagname + 3
         Case 6 :
           Htagname = Htagname + 2
         Case 7 :
           Htagname = Htagname + 3
         Case 8 :
           Htagname = Htagname + 3
         Case 9 :
           Htagname = Htagname + 2
         Case 10 :
           Htagname = Htagname + 3
         Case 11 :
           Htagname = Htagname + 2
         Case 12 :
           Htagname = Htagname + 3

         End Select

         Waitms 200                                         'Wieder warten, damit wir nicht zu schnell sind

        End If

       End If


    If Abtaster = 0 Then

       If Monat = 1 Then                                    'nicht weiterzaehlen, sonst zu schwer
       Else                                                 'ansonsten...
        Decr Monat


        Select Case Monat

         Case 1 :
            Htagname = Htagname - 3
         Case 2 :
           If Hjahr = 4 Then
              Htagname = Htagname - 1
           Else

           End If
         Case 3 :
           Htagname = Htagname - 3
         Case 4 :
           Htagname = Htagname - 2
         Case 5 :
           Htagname = Htagname - 3
         Case 6 :
           Htagname = Htagname - 2
         Case 7 :
           Htagname = Htagname - 3
         Case 8 :
           Htagname = Htagname - 3
         Case 9 :
           Htagname = Htagname - 2
         Case 10 :
           Htagname = Htagname - 3
         Case 11 :
           Htagname = Htagname - 2
         Case 12 :
           Htagname = Htagname - 3

        End Select

       End If

    End If

    If Htagname < 1 Then
       Htagname = Htagname + 7
    Elseif Htagname > 7 Then
       Htagname = Htagname - 7
    End If

    If Monat = 0 Then
       Monat = 12
    Elseif Monat = 13 Then
       Monat = 1
    End If



    Print "Monat: " ; Monat                                 'Ausgeben

    Waitms 200

    Wend



    Wait 1



    While Setztaster = 1                                    'Nun gehts noch an den Tag


      Select Case Monat                                     'brauch ich gleich

       Case 1 :
          Monatstage = 31
       Case 2 :
          If Hjahr = 4 Then
             Monatstage = 29
          Else
             Monatstage = 28
          End If
       Case 3 :
          Monatstage = 31
       Case 4 :
          Monatstage = 30
       Case 5 :
          Monatstage = 31
       Case 6 :
          Monatstage = 30
       Case 7 :
          Monatstage = 31
       Case 8 :
          Monatstage = 31
       Case 9 :
          Monatstage = 30
       Case 10 :
          Monatstage = 31
       Case 11 :
          Monatstage = 30
       Case 12 :
          Monatstage = 31

      End Select


      If Auftaster = 0 Then
         If Tag = Monatstage Then                           'nicht weiterzaehlen
         Else                                               'ansonsten..
          Incr Tag
          Incr Htagname                                     'der naechste Tag ist wohl auch der naechste Wochentag....
         End If
      End If

      If Abtaster = 0 Then
         If Tag = 1 Then                                    'nicht weiterzaehlen
         Else                                               'ansonsten
          Decr Tag
          Decr Htagname
         End If
      End If





      While Htagname < 1                                    'beidesmal While , wegen Dem "Htagname = Htagname + Monatstage" und dem "Htagname = Htagname - Monatstage"
        Htagname = Htagname + 7
      Wend
      While Htagname > 7
        Htagname = Htagname - 7
      Wend


      Print "Tag: " ; Tag                                   'und ausgeben

      Waitms 200

    Wend




  End Sub




  Sub Uhrzeiteinstellen(sekunde As Integer , Minute As Integer , Stunde As Integer )       'Die Sub fuer die Uhrzeit

    Wait 1

    While Setztaster = 1

       If Auftaster = 0 Then
          Incr Sekunde
       End If

       If Abtaster = 0 Then
          Decr Sekunde
       End If

       If Sekunde = 60 Then
          Sekunde = 0
       Elseif Sekunde < 0 Then
          Sekunde = 59
       End If


       Print Stunde ; ":" ; Minute ; ":" ; Sekunde

       Waitms 200

    Wend


    Wait 1

    While Setztaster = 1

       If Auftaster = 0 Then
          Incr Minute
       End If

       If Abtaster = 0 Then
          Decr Minute
       End If

       If Minute = 60 Then
          Minute = 0
       Elseif Minute < 0 Then
          Minute = 59
       End If


       Print Stunde ; ":" ; Minute ; ":" ; Sekunde

       Waitms 200

    Wend


    Wait 1



    While Setztaster = 1

       If Auftaster = 0 Then
          Incr Stunde
       End If

       If Abtaster = 0 Then
          Decr Stunde
       End If

       If Stunde = 24 Then
          Stunde = 0
       Elseif Stunde < 0 Then
          Stunde = 23
       End If


       Print Stunde ; ":" ; Minute ; ":" ; Sekunde

       Waitms 200

    Wend

  End Sub
evtuelle bugs sind nicht ausgeschlossen...