Probleme mit Bascom Wecker mit LCD-Display mit einem ATmega8

Status
Für weitere Antworten geschlossen.
Die Uhr funktioniert immer noch, wie schon sowas aussehen kann...

Auch das Minus hab ich auf die reihe gekriegt, nämlich so:
Code:
  Case 2      
    Decr _min
    If _min > 59 Then
     _min = 59
    End if
;)


Aber zwei Sachen machen mir noch etwas Kopfschmerzen, einmal die Home-Funktion und einmal das Datum.
Warum funktioniert das Datum nicht?
Die einstellung für Uhr und Datum sind identisch im Code, also nichts was mit Time$ oder zu tun hat, ist anders als bei Date$

Und bei Menu_homecnt haben wir ja eine Variable definiert, ich würde jetzt mit meinen verknoteten Hirn denken: Ja gut, dann befüllen wir doch die Variable Menu_homecnt mit der Uhrzeit, also Menu_homecnt = Time$ damit der dann nach 10 Sekunden die Uhrzeit anzeiigt...

Nee warte mal, ich merk gerade selber, das ich Unfug schreibe...

Ich glaube, ich muss Menu_Homecnt irgendwie die Zeit_pos entziehen... Nee das scheint auch völliger Quatsch zu sein...

Muss ich nochmal darüber nachdenken...
Meld mich später nochmal!




Hier nochmal der aktueller Stand des Codes:
Code:
'_________________________ CONTROLLER-KONFIG ___________________________________

$regfile = "m8def.dat"
$framesize = 24
$swstack = 8
$hwstack = 32
$crystal = 1000000


'_________________________ LCD-Display Einstellungen ___________________________

Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , _
   Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Initlcd
Display On
Waitms 400
Cursor Off
Cls


' ===== SoftClock starten ======================================================

Enable Interrupts
Dim Newsec As Byte                                          ' Flag fuer Erkennung von neuer Sekunde
Newsec = 0                                                  ' Flag initialisieren
Config Date = Dmy , Separator = .                           ' Datumsformat einstellen
Config Clock = Soft , Gosub = Sectic                        ' Sekunden-Sub setzen und Uhr starten
Cls

Time$ = "00:00:00"                                          ' Setzen auf Startwert
Date$ = "00.00.00"                                          ' Setzen auf Startwert


'_________________________ Variablen ___________________________________________

Dim Menu_homecnt As Byte
Dim Zeit_pos As Integer


'_________________________ Taster: Uhreit stellen ______________________________
Config Pind.5 = Input
Portd.5 = 1
Taster_s Alias Pind.5

'_________________________ Taster: Zeit (+) ____________________________________
Config Pind.6 = Input
Portd.6 = 1
Taster_p Alias Pind.6

'_________________________ Taster: Zeit (-) ____________________________________
Config Pind.7 = Input
Portd.7 = 1
Taster_m Alias Pind.7

'_________________________ Kontroll-LED ________________________________________
Config Portb.0 = Output
Portb.0 = 1
Led Alias Portb.0


Do

' ===== Uhrzeit mit Taster einstellen ==========================================
Debounce Taster_s , 0 , Zeit_stelle , Sub                   ' Taster fuer Uhrzeit einstellen
Debounce Taster_p , 0 , Zeit_plus , Sub                     ' Taster fuer Plus
Debounce Taster_m , 0 , Zeit_minus , Sub                    ' Taster fuer Minus
' ===== Uhrzeit einstellen Ende ================================================


' ===== Diese Zeilen werden durch SECTIC aktiviert =============================
If Newsec = 1 Then                                          ' Flag fuer neue Sekunde gesetzt ?
  Newsec = 0                                                ' Erkennung auf Sekundenaenderung zuruecksetzen
End If


' ===== SECTIC-Zeilen Ende =====================================================

   Locate 1 , 1                                             ' Zeige in Zeile 1, ab erstes Zeichen...
   Lcd Time$                                                ' ... die Uhrzeit an.
   Locate 2 , 1                                             ' Zeige in Zeile 1, ab erstes Zeichen...
   Lcd Date$                                                ' ... das Datum an.

Cursor Off Noblink
Waitms 50

Loop

End


' =============================================================================
' ===== Service-Routine sectic wird automatisch jede Sekunde ausgeführt. ======
' =============================================================================
Sectic:
  Toggle Led                                                ' LED fuer Lebenszeichen toggeln
  Newsec = 1                                                ' Flag fuer neue Sekunde setzen
Return


' =============================================================================
' ===== Stelle waehlen ========================================================
' =============================================================================
Zeit_stelle:
  Menu_homecnt = 10                                          ' Auto-Home auf 10 Sekunden setzen
   Incr Zeit_pos                                            ' Position +1
  If Zeit_pos > 8 Then
    Zeit_pos = 0
  End If
  Locate 2 , 13
  Select Case Zeit_pos
    Case 0                                                  ' 0 Ruheposition
      Lcd "Uhr ";
    Case 1                                                  ' 1 Sekunden
      Lcd "Sec.";
    Case 2                                                  ' 2 Minuten
      Lcd "Min.";
    Case 3                                                  ' 3 Stunden
      Lcd "Std.";
    Case 4                                                  ' 4 Tag
      Lcd "Tag.";
    Case 5                                                  ' 5 Monat
      Lcd "Mon.";
    Case 6                                                  ' 6 Jahr
      Lcd "Jahr";
    Case 7                                                  ' 7 Zeit speichern/laden
      Lcd "LdSp";
    Case 8                                                  ' 8 Initialisieren
      Lcd "Init";
  End Select
Return


Zeit_plus:
' Wenn ich auf Taster_p jumpt er zu der "Zeit_PLUS:"-Routine
' diese Routine wurde angesprungen weil Debounce den Druck vom Taster_p erkannt hat.
' Die Taste wurde also gedrückt um eine von Zeit_pos ausgewählte Stelle um eins zu erhöhen

Select Case Zeit_pos                                        ' Hier wird die Variable IM CASE VERGLICHEN (Schubladendenken) (0=Normal,1=Sec,2=Min,3=Std,...)
  Case 1                                                    ' Case 1 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _sec                                               ' Hier die Sekunde um eins erhöhen
    If _sec > 59 Then                                       ' Überlauf abfangen (Sekunde nur von 0...59)
      _sec = 0                                              ' Bei Sekunde > 59 wird wieder ab 0 angefangen
    End if

  Case 2                                                    ' Case 2 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _min                                               ' Hier die Minuten um eins erhöhen
    If _min > 59 Then                                       ' Überlauf abfangen (Minuten nur von 0...59)
      _min = 0                                              ' Bei Minuten > 59 wird wieder ab 0 angefangen
    End if
  Case 3                                                    ' Case 3 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _hour                                              ' Hier die Stunde um eins erhöhen
    If _hour > 23 Then                                      ' Überlauf abfangen (Stunde nur von 0...23)
      _hour = 0                                             ' Bei Stunde > 23 wird wieder ab 0 angefangen
    End if
  Case 3                                                    ' Case 4 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _day                                               ' Hier die Tage um eins erhöhen
    If _day > 31 Then                                       ' Überlauf abfangen (Tage nur von 1...31)
      _day = 1                                              ' Bei Tage > 31 wird wieder ab 1 angefangen
    End If
  Case 3                                                    ' Case 5 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _month                                             ' Hier die Monate um eins erhöhen
    If _month > 12 Then                                     ' Überlauf abfangen (Monate nur von 1...12)
      _month = 1                                            ' Bei Monate > 12 wird wieder ab 1 angefangen
    End if
  Case 3                                                    ' Case 6 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _year                                              ' Hier die Jahr um eins erhöhen
    If _year > 99 Then                                      ' Überlauf abfangen (Jahr nur von 0...99)
      _year = 0                                             ' Bei Jahr > 99 wird wieder ab 0 angefangen
    End if
End Select
Return

Zeit_minus:
Select Case Zeit_pos
  Case 1
    Decr _sec
    If _sec > 59 Then
    _sec = 59
    End if

  Case 2
    Decr _min
    If _min > 59 Then
      _min = 59
    End if
  Case 3
    Decr _hour
    If _hour > 23 Then
      _hour = 23
    End if
  Case 3
    Decr _day
    If _day > 31 Then
      _day = 31
    End if
  Case 3
    Decr _month
    If _month > 12 Then
      _month = 12
    End if
  Case 3
    Decr _year
    If _year > 99 Then
      _year = 99
    End if
End Select
Return
 
Woher weiß Zeit_pos was es machen soll?

Wenn ich mir den Code so anschaue, dann sehe ich, das wir Zeit_pos als eine Integer-Variable definiert haben, nämlich wie folgt: Dim Zeit_pos As Integer
Aber das wars auch schon...
Zeit_pos taucht erst wieder im Case auf und da steht nur Inr Zeit_pos und Überlauf...

Aber woher weiß den Zeit_pos, dass er jedem Tastendruck von Sec zu Min zu Std, etc. jumpen muss und nicht z.B. von Std zu Sec zu Jahr zu Min...



Ich weiß nicht warum, aber irgendwie glaube ich, dass das auch der Grund ist warum das Datum bei mir nicht funktioniert...
 
Hi,

Und bei Menu_homecnt haben wir ja eine Variable definiert, ich würde jetzt mit meinen verknoteten Hirn denken: Ja gut, dann befüllen wir doch die Variable Menu_homecnt mit der Uhrzeit, also Menu_homecnt = Time$ damit der dann nach 10 Sekunden die Uhrzeit anzeiigt...

Nee warte mal, ich merk gerade selber, das ich Unfug schreibe...

Ich glaube, ich muss Menu_Homecnt irgendwie die Zeit_pos entziehen... Nee das scheint auch völliger Quatsch zu sein...

Muss ich nochmal darüber nachdenken...
Meld mich später nochmal!
Da muß sich wohl noch einiges sortieren :rolleyes: :dirol:

Code:
'_________________________ CONTROLLER-KONFIG ___________________________________

$regfile = "m8def.dat"
$framesize = 24
$swstack = 8
$hwstack = 32
$crystal = 1000000


'_________________________ LCD-Display Einstellungen ___________________________

Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , _
   Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Initlcd
Display On
Waitms 400
Cursor Off
Cls


' ===== SoftClock starten ======================================================

Enable Interrupts
Dim Newsec As Byte                                          ' Flag fuer Erkennung von neuer Sekunde
Newsec = 0                                                  ' Flag initialisieren
Config Date = Dmy , Separator = .                           ' Datumsformat einstellen
Config Clock = Soft , Gosub = Sectic                        ' Sekunden-Sub setzen und Uhr starten
Cls

Time$ = "00:00:00"                                          ' Setzen auf Startwert
Date$ = "00.00.00"                                          ' Setzen auf Startwert


'_________________________ Variablen ___________________________________________

Dim Menu_homecnt As Byte
Dim Zeit_pos As Integer


'_________________________ Taster: Uhreit stellen ______________________________
Config Pind.5 = Input
Portd.5 = 1
Taster_s Alias Pind.5

'_________________________ Taster: Zeit (+) ____________________________________
Config Pind.6 = Input
Portd.6 = 1
Taster_p Alias Pind.6

'_________________________ Taster: Zeit (-) ____________________________________
Config Pind.7 = Input
Portd.7 = 1
Taster_m Alias Pind.7

'_________________________ Kontroll-LED ________________________________________
Config Portb.0 = Output
Portb.0 = 1
Led Alias Portb.0


Do

' ===== Uhrzeit mit Taster einstellen ==========================================
Debounce Taster_s , 0 , Zeit_stelle , Sub                   ' Taster fuer Uhrzeit einstellen
Debounce Taster_p , 0 , Zeit_plus , Sub                     ' Taster fuer Plus
Debounce Taster_m , 0 , Zeit_minus , Sub                    ' Taster fuer Minus
' ===== Uhrzeit einstellen Ende ================================================


' ===== Diese Zeilen werden durch SECTIC aktiviert =============================
If Newsec = 1 Then                                          ' Flag fuer neue Sekunde gesetzt ?
  Newsec = 0                                                ' Erkennung auf Sekundenaenderung zuruecksetzen

  if Menu_homecnt > 0 then       ' Ist noch Restzeit von den 10sec uebrig ?
    decr Menu_homecnt             '  Menue Countdown durchfuehren (10 sekunden runterzaehlen)
  else                                ' Der Countdown ist abgelaufen, die 10sec sind um, Menueposition auf Normal
    Zeit_pos = 0                  ' Menue auf Normalmodus setzen
  endif
    

  ' Da sich die Uhrzeit sowieso nur jede Sekunde ändert kann man die vier Zeilen auch da reinsetzen
   Locate 1 , 1                                             ' Zeige in Zeile 1, ab erstes Zeichen...
   Lcd Time$                                                ' ... die Uhrzeit an.
   Locate 2 , 1                                             ' Zeige in Zeile 1, ab erstes Zeichen...
   Lcd Date$                                                ' ... das Datum an.

End If


' ===== SECTIC-Zeilen Ende =====================================================


' Cursor Off Noblink      ' Lass mal weg. Erstmal unnütz
' Waitms 50          ' Verbrät auch nur Zeit

Loop

End


' =============================================================================
' ===== Service-Routine sectic wird automatisch jede Sekunde ausgeführt. ======
' =============================================================================
Sectic:
  Toggle Led                                                ' LED fuer Lebenszeichen toggeln
  Newsec = 1                                                ' Flag fuer neue Sekunde setzen
Return


' =============================================================================
' ===== Stelle waehlen ========================================================
' =============================================================================
Zeit_stelle:
   Menu_homecnt = 10          '  Menue Countdown zurücksetzen auf 10sec Laufzeit (wegen Tastendruck)
   Incr Zeit_pos                                            ' Position +1
  If Zeit_pos > 8 Then
    Zeit_pos = 0
  End If
  Locate 2 , 13
  Select Case Zeit_pos
    Case 0                                                  ' 0 Ruheposition
      Lcd "Uhr ";
    Case 1                                                  ' 1 Sekunden
      Lcd "Sec.";
    Case 2                                                  ' 2 Minuten
      Lcd "Min.";
    Case 3                                                  ' 3 Stunden
      Lcd "Std.";
    Case 4                                                  ' 4 Tag
      Lcd "Tag.";
    Case 5                                                  ' 5 Monat
      Lcd "Mon.";
    Case 6                                                  ' 6 Jahr
      Lcd "Jahr";
    Case 7                                                  ' 7 Zeit speichern/laden
      Lcd "LdSp";
    Case 8                                                  ' 8 Initialisieren
      Lcd "Init";
  End Select
Return


Zeit_plus:
' Wenn ich auf Taster_p jumpt er zu der "Zeit_PLUS:"-Routine
' diese Routine wurde angesprungen weil Debounce den Druck vom Taster_p erkannt hat.
' Die Taste wurde also gedrückt um eine von Zeit_pos ausgewählte Stelle um eins zu erhöhen

Menu_homecnt = 10          '  Menue Countdown zurücksetzen auf 10sec Laufzeit (wegen Tastendruck)
Select Case Zeit_pos                                        ' Hier wird die Variable IM CASE VERGLICHEN (Schubladendenken) (0=Normal,1=Sec,2=Min,3=Std,...)
  Case 1                                                    ' Case 1 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _sec                                               ' Hier die Sekunde um eins erhöhen
    If _sec > 59 Then                                       ' Überlauf abfangen (Sekunde nur von 0...59)
      _sec = 0                                              ' Bei Sekunde > 59 wird wieder ab 0 angefangen
    End if

  Case 2                                                    ' Case 2 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _min                                               ' Hier die Minuten um eins erhöhen
    If _min > 59 Then                                       ' Überlauf abfangen (Minuten nur von 0...59)
      _min = 0                                              ' Bei Minuten > 59 wird wieder ab 0 angefangen
    End if
  Case 3                                                    ' Case 3 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _hour                                              ' Hier die Stunde um eins erhöhen
    If _hour > 23 Then                                      ' Überlauf abfangen (Stunde nur von 0...23)
      _hour = 0                                             ' Bei Stunde > 23 wird wieder ab 0 angefangen
    End if
  Case 3                                                    ' Case 4 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _day                                               ' Hier die Tage um eins erhöhen
    If _day > 31 Then                                       ' Überlauf abfangen (Tage nur von 1...31)
      _day = 1                                              ' Bei Tage > 31 wird wieder ab 1 angefangen
    End If
  Case 3                                                    ' Case 5 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _month                                             ' Hier die Monate um eins erhöhen
    If _month > 12 Then                                     ' Überlauf abfangen (Monate nur von 1...12)
      _month = 1                                            ' Bei Monate > 12 wird wieder ab 1 angefangen
    End if
  Case 3                                                    ' Case 6 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _year                                              ' Hier die Jahr um eins erhöhen
    If _year > 99 Then                                      ' Überlauf abfangen (Jahr nur von 0...99)
      _year = 0                                             ' Bei Jahr > 99 wird wieder ab 0 angefangen
    End if
End Select
Return

Zeit_minus:
Menu_homecnt = 10          '  Menue Countdown zurücksetzen auf 10sec Laufzeit (wegen Tastendruck)
Select Case Zeit_pos
  Case 1
    Decr _sec
    If _sec > 59 Then
    _sec = 59
    End if

  Case 2
    Decr _min
    If _min > 59 Then
      _min = 59
    End if
  Case 3
    Decr _hour
    If _hour > 23 Then
      _hour = 23
    End if
  Case 3
    Decr _day
    If _day > 31 Then
      _day = 31
    elsif _day < 1 Then    ' Der Tag kann hier auch 0 werden. Also Überlauf abfangen
      _day = 31
    End if
  Case 3
    Decr _month
    If _month > 12 Then
      _month = 12
    elsif _month < 1 Then    ' Der Monat kann hier auch 0 werden. Also Überlauf abfangen
      _month = 12
    End if
  Case 3
    Decr _year
    If _year > 99 Then
      _year = 99
    End if
End Select
Return

Versuch das mal .... ;)

Gruß
Dino
 
Wenn Locate 1 , 1; Lcd Time$; Locate 2 , 1; Lcd Date$ vor End if (bei Sectic) steht, funktionieren die Taster für Plus und Minus sehr träge, deswegen habe ich nach End if (sozusagen nach Sectic) die Positionierung der Uhrzeit und Datum kopiert...

Menu_homecnt funktioniert, aber hat einen kleines Schönheitsfehler, nämlich, das Display ist von Menu_homecnt nicht betroffen...
Also mein Display sieht ja etwa so aus:

00:00:00
00.00.00

Wenn ich nun auf Taster_s (PD.5 - Zeitstellen) drücke dann steht am Ende der zweiten Zeile des Displays die jeweilige Stelle Sec, Min, Std, Tag, etc..pp
Also etwa so:

00:00:00
00.00.00 Tag

Warte ich nun 10 Sekunden ab, steht zwar auf dem Display (unten rechts) immer noch "Tag", aber +/- Tasten sind deaktiv und wenn ich wieder auf Taster_s drücke, beginnt die die "Anzeige" wieder bei Sec, so wie es sein soll.

Erst dachte ich, das Case 0 nach Ablauf der 10 Skunden aufgerufen wird, da steht ja Lcd "Uhr ";, also habe ich Uhr raus gelöscht, so: Lcd " ";. Weil ja Case 0 die ' 0 Ruheposition ist, aber so ist es leider nicht...

Hast du irgendwie einen Hauch von Ahnung wie man dieses Problem beheben könnte? :)

Datum muss ich auch noch gucken, woran das liegen könnte, das ich Tag/Monat/Jahr nicht einstellen kann...
 
Das seltsame bei Datum, wenn ich einen Vorwert eingebe, also z.B. Date$ = 22.02.12 und die Uhrzeit dann auf 23:59 einstelle (via Tastern), dass dann auch das Datum umspringt wenn die Uhrzeit auf 00:00:00 Uhr springt...

Aber die Variablen _day, _month und _year lassen sich nicht über die Taster mit den Befehlen der Routine ändern...
 
Problem Menu_homecnt ist nun gelöst! Ich habs geschafft :D
Ja, ich kanns selber noch nicht fassen, aber wenn ich 10 Sekunden warte, erlischt der Text, also Sek, Min, Std, etc..

Dazu habe ich in Sectic noch Locate 2 , 10; Lcd " "; rein geschrieben, also so:

Code:
' ===== Diese Zeilen werden durch SECTIC aktiviert =============================
If Newsec = 1 Then                                          ' Flag fuer neue Sekunde gesetzt ?
  Newsec = 0                                                ' Erkennung auf Sekundenaenderung zuruecksetzen

  If Menu_homecnt > 0 Then                                  ' Ist noch Restzeit von den 10sec uebrig ?
   Decr Menu_homecnt                                        ' Menue Countdown durchfuehren (10 sekunden runterzaehlen)
  Else                                                      ' Der Countdown ist abgelaufen, die 10sec sind um, Menueposition auf Normal
    Zeit_pos = 0                                            ' Menue auf Normalmodus setzen
[COLOR="#0000CD"]      Locate 2 , 10                                         ' löscht die Anzeige, ab Zeile 2, Position 10
      Lcd "       ";                                        ' bzw. schreibt ab Zeile 2, Position 10 "      ", also nur Lehrzeichen[/COLOR]
  End If
End If
' ===== SECTIC-Zeilen Ende =====================================================

Hättest du das eigentlich auch so gelöst?

Jetzt nur noch Datum :D
 
Oh man bin ich dooof...

Der Grund warum Datum-Einstellen nicht ging, war ein doofer copy/paste-Fehler!
Ich hab die einzelnen Cases mit Strg+c kopiert und sie unter einander eingefügt, hab zwar den Inhalt angepasst, aber vergessen die Case-Nummer forlaufend zu nummerieren ::stupid:

Wie dem auch sei, nun funktioniert alles... :D

Also ich muss sagen, das macht ja richtig Spaß :D

Sind eigentlich folgende Cases überhaupt notwendig??
Code:
    Case 0                                                  ' 0 Ruheposition
      Lcd "Uhrzeit";
    Case 7                                                  ' 7 Zeit speichern/laden
      Lcd "  Ld/Sp";
    Case 8                                                  ' 8 Initialisieren
      Lcd "   Init";


Jetzt fehlt nur noch Alarm... :)
 
Hi,

also mal die Verbesserungen für Aktualisierung der Anzeige beim Tastendrücken (Trick17-Zeilen)

Code:
'_________________________ CONTROLLER-KONFIG ___________________________________

$regfile = "m8def.dat"
$framesize = 24
$swstack = 8
$hwstack = 32
$crystal = 1000000


'_________________________ LCD-Display Einstellungen ___________________________

Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , _
   Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Initlcd
Display On
Waitms 400
Cursor Off
Cls


' ===== SoftClock starten ======================================================

Enable Interrupts
Dim Newsec As Byte                                          ' Flag fuer Erkennung von neuer Sekunde
Newsec = 0                                                  ' Flag initialisieren
Config Date = Dmy , Separator = .                           ' Datumsformat einstellen
Config Clock = Soft , Gosub = Sectic                        ' Sekunden-Sub setzen und Uhr starten
Cls

Time$ = "00:00:00"                                          ' Setzen auf Startwert
Date$ = "00.00.00"                                          ' Setzen auf Startwert


'_________________________ Variablen ___________________________________________

Dim Menu_homecnt As Byte
Dim Zeit_pos As Integer


'_________________________ Taster: Uhreit stellen ______________________________
Config Pind.5 = Input
Portd.5 = 1
Taster_s Alias Pind.5

'_________________________ Taster: Zeit (+) ____________________________________
Config Pind.6 = Input
Portd.6 = 1
Taster_p Alias Pind.6

'_________________________ Taster: Zeit (-) ____________________________________
Config Pind.7 = Input
Portd.7 = 1
Taster_m Alias Pind.7

'_________________________ Kontroll-LED ________________________________________
Config Portb.0 = Output
Portb.0 = 1
Led Alias Portb.0


Do

' ===== Uhrzeit mit Taster einstellen ==========================================
Debounce Taster_s , 0 , Zeit_stelle , Sub                   ' Taster fuer Uhrzeit einstellen
Debounce Taster_p , 0 , Zeit_plus , Sub                     ' Taster fuer Plus
Debounce Taster_m , 0 , Zeit_minus , Sub                    ' Taster fuer Minus
' ===== Uhrzeit einstellen Ende ================================================


' ===== Diese Zeilen werden durch SECTIC aktiviert =============================
If Newsec = 1 Then                                          ' Flag fuer neue Sekunde gesetzt ?
  Newsec = 0                                                ' Erkennung auf Sekundenaenderung zuruecksetzen

  if Menu_homecnt > 0 then       ' Ist noch Restzeit von den 10sec uebrig ?
    decr Menu_homecnt             '  Menue Countdown durchfuehren (10 sekunden runterzaehlen)
  else                                ' Der Countdown ist abgelaufen, die 10sec sind um, Menueposition auf Normal
    Zeit_pos = 0                  ' Menue auf Normalmodus setzen
    ' deine beiden Löschzeilen vom letzten Post mit eingefügt.
    Locate 2 , 10                                         ' löscht die Anzeige, ab Zeile 2, Position 10
      Lcd "       ";                                        ' bzw. schreibt ab Zeile 2, Position 10 "      ", also nur Lehrzeichen
  endif
    

  ' Da sich die Uhrzeit sowieso nur jede Sekunde ändert kann man die vier Zeilen auch da reinsetzen
   Locate 1 , 1                                             ' Zeige in Zeile 1, ab erstes Zeichen...
   Lcd Time$                                                ' ... die Uhrzeit an.
   Locate 2 , 1                                             ' Zeige in Zeile 1, ab erstes Zeichen...
   Lcd Date$                                                ' ... das Datum an.

End If


' ===== SECTIC-Zeilen Ende =====================================================


' Cursor Off Noblink      ' Lass mal weg. Erstmal unnütz
' Waitms 50          ' Verbrät auch nur Zeit

Loop

End


' =============================================================================
' ===== Service-Routine sectic wird automatisch jede Sekunde ausgeführt. ======
' =============================================================================
Sectic:
  Toggle Led                                                ' LED fuer Lebenszeichen toggeln
  Newsec = 1                                                ' Flag fuer neue Sekunde setzen
Return


' =============================================================================
' ===== Stelle waehlen ========================================================
' =============================================================================
Zeit_stelle:
   Menu_homecnt = 10          '  Menue Countdown zurücksetzen auf 10sec Laufzeit (wegen Tastendruck)
   Incr Zeit_pos                                            ' Position +1
  If Zeit_pos > 8 Then
    Zeit_pos = 0
  End If
  Locate 2 , 13
  Select Case Zeit_pos
    Case 0                                                  ' 0 Ruheposition
      Lcd "Uhr ";
    Case 1                                                  ' 1 Sekunden
      Lcd "Sec.";
    Case 2                                                  ' 2 Minuten
      Lcd "Min.";
    Case 3                                                  ' 3 Stunden
      Lcd "Std.";
    Case 4                                                  ' 4 Tag
      Lcd "Tag.";
    Case 5                                                  ' 5 Monat
      Lcd "Mon.";
    Case 6                                                  ' 6 Jahr
      Lcd "Jahr";
    Case 7                                                  ' 7 Zeit speichern/laden
      Lcd "LdSp";
    Case 8                                                  ' 8 Initialisieren
      Lcd "Init";
  End Select
Return


Zeit_plus:
' Wenn ich auf Taster_p jumpt er zu der "Zeit_PLUS:"-Routine
' diese Routine wurde angesprungen weil Debounce den Druck vom Taster_p erkannt hat.
' Die Taste wurde also gedrückt um eine von Zeit_pos ausgewählte Stelle um eins zu erhöhen

Menu_homecnt = 10          '  Menue Countdown zurücksetzen auf 10sec Laufzeit (wegen Tastendruck)
Select Case Zeit_pos                                        ' Hier wird die Variable IM CASE VERGLICHEN (Schubladendenken) (0=Normal,1=Sec,2=Min,3=Std,...)
  Case 1                                                    ' Case 1 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _sec                                               ' Hier die Sekunde um eins erhöhen
    If _sec > 59 Then                                       ' Überlauf abfangen (Sekunde nur von 0...59)
      _sec = 0                                              ' Bei Sekunde > 59 wird wieder ab 0 angefangen
    End if

  Case 2                                                    ' Case 2 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _min                                               ' Hier die Minuten um eins erhöhen
    If _min > 59 Then                                       ' Überlauf abfangen (Minuten nur von 0...59)
      _min = 0                                              ' Bei Minuten > 59 wird wieder ab 0 angefangen
    End if
  Case 3                                                    ' Case 3 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _hour                                              ' Hier die Stunde um eins erhöhen
    If _hour > 23 Then                                      ' Überlauf abfangen (Stunde nur von 0...23)
      _hour = 0                                             ' Bei Stunde > 23 wird wieder ab 0 angefangen
    End if
  Case 3                                                    ' Case 4 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _day                                               ' Hier die Tage um eins erhöhen
    If _day > 31 Then                                       ' Überlauf abfangen (Tage nur von 1...31)
      _day = 1                                              ' Bei Tage > 31 wird wieder ab 1 angefangen
    End If
  Case 3                                                    ' Case 5 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _month                                             ' Hier die Monate um eins erhöhen
    If _month > 12 Then                                     ' Überlauf abfangen (Monate nur von 1...12)
      _month = 1                                            ' Bei Monate > 12 wird wieder ab 1 angefangen
    End if
  Case 3                                                    ' Case 6 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _year                                              ' Hier die Jahr um eins erhöhen
    If _year > 99 Then                                      ' Überlauf abfangen (Jahr nur von 0...99)
      _year = 0                                             ' Bei Jahr > 99 wird wieder ab 0 angefangen
    End if
End Select
Newsec = 1                ' Trick 17 um die Ausgabe beim Uhr stellen sofort zu aktualisieren. Nicht schön aber funktionsfähig ;)
Return

Zeit_minus:
Menu_homecnt = 10          '  Menue Countdown zurücksetzen auf 10sec Laufzeit (wegen Tastendruck)
Select Case Zeit_pos
  Case 1
    Decr _sec
    If _sec > 59 Then
    _sec = 59
    End if

  Case 2
    Decr _min
    If _min > 59 Then
      _min = 59
    End if
  Case 3
    Decr _hour
    If _hour > 23 Then
      _hour = 23
    End if
  Case 3
    Decr _day
    If _day > 31 Then
      _day = 31
    elsif _day < 1 Then    ' Der Tag kann hier auch 0 werden. Also Überlauf abfangen
      _day = 31
    End if
  Case 3
    Decr _month
    If _month > 12 Then
      _month = 12
    elsif _month < 1 Then    ' Der Monat kann hier auch 0 werden. Also Überlauf abfangen
      _month = 12
    End if
  Case 3
    Decr _year
    If _year > 99 Then
      _year = 99
    End if
End Select
Newsec = 1                ' Trick 17 um die Ausgabe beim Uhr stellen sofort zu aktualisieren. Nicht schön aber funktionsfähig ;)
Return

Problem Menu_homecnt ist nun gelöst! Ich habs geschafft :D
Ja, ich kanns selber noch nicht fassen, aber wenn ich 10 Sekunden warte, erlischt der Text, also Sek, Min, Std, etc..

Dazu habe ich in Sectic noch Locate 2 , 10; Lcd " "; rein geschrieben, also so:

Code:
' ===== Diese Zeilen werden durch SECTIC aktiviert =============================
If Newsec = 1 Then                                          ' Flag fuer neue Sekunde gesetzt ?
  Newsec = 0                                                ' Erkennung auf Sekundenaenderung zuruecksetzen

  If Menu_homecnt > 0 Then                                  ' Ist noch Restzeit von den 10sec uebrig ?
   Decr Menu_homecnt                                        ' Menue Countdown durchfuehren (10 sekunden runterzaehlen)
  Else                                                      ' Der Countdown ist abgelaufen, die 10sec sind um, Menueposition auf Normal
    Zeit_pos = 0                                            ' Menue auf Normalmodus setzen
[COLOR="#0000CD"]      Locate 2 , 10                                         ' löscht die Anzeige, ab Zeile 2, Position 10
      Lcd "       ";                                        ' bzw. schreibt ab Zeile 2, Position 10 "      ", also nur Lehrzeichen[/COLOR]
  End If
End If
' ===== SECTIC-Zeilen Ende =====================================================

Hättest du das eigentlich auch so gelöst?
steht bei mir genauso drin ;)
Also mit dem oberen Quellcode sollte das mit der Anzeigeänderung beim stellen auch klappen. Problem ist dadurch aber das man beim Stellen der Uhr im Bereich "If Newsec = 1 Then" keinen Sekundenrhytmus mehr hat weil zu den Sekunden nun noch die Tastendrücke dazukommen. Sollte aber in dieser Anwendung verschmerzbar sein.

Jetzt nur noch Datum :D
Tja ... denn mal los. Die Routinen stehen nun für eine funktionierende Uhr. Wenn du noch mehr bei deinem Programm geändert hast solltest du nur die entsprechenden "Trick17"-Zeilen aus dem obigen Quellcode übernehmen.

Ich tippe mal das du nun recht schnell selber Lösungswege oder wenigstens Ansätze finden wirst. ;) (hoffe ich mal)

Gruß
Dino
 
Ich mach Fortschritte ;) Dank dir!
Mit Datum hatte ich ja (wie einige Posts vorher erklärt) Probleme, wegen den Case-Nummerierung...
Nun funktioniert alles und ich komme nun zur Alarm-Funktion.

Ich habe erst mal Variablen für Alarm Stunde und Minute erstellt, so:
Code:
Dim Menu_homecnt As Byte
Dim Zeit_pos As Integer
Dim Alarm_std As Byte                                       ' Variable fuer die Alarm-Minute
Alarm_std = 00
Dim Alarm_min As Byte                                       ' Variable fuer die Alarm-Stunde
Alarm_min = 00

Wie kann ich eigentlich aus zwei Stellen im Display anzeigen lassen?

Ich hab ja geschrieben Alarm_std = 00 und Alarm_min = 00, leider erscheint so nicht zwei Nullen für min und zwei Nullen für Std sondern es erscheint folgendes: "0 :0 "

Positioniert habe ich die beiden Variablen wie folgt:
Code:
Locate 1 , 12
Lcd Alarm_std
Locate 1 , 14
Lcd ":"
Locate 1 , 15
Lcd Alarm_min

Wie gesagt, leider erscheint auf dem Display nur "0 :0 " statt "00:00"...

Ok weiter:
Du hasst ja geschrieben:
Beim Alarm hast du ja keine Zeitvariablen aus der Softclock. Du mußt also eigene (zB alarm_min, alarm_std) für deine Alarmzeit benutzen die du um eins erhöhst oder verringerst. Den Variablenwert (zB alarm_min) vergleichst du dann einfach jede Sekunde einmal mit _min und wenn alle Werte (_min, _hour, ...) gleich sind dann ist ALARM !!!!!

Das bedeutet dann für mich:
If Alarm_min = _min and Alarm_std = _hour Then PortB.1 = 1 Else PortB.1 = 0

Und um die Alarmzeit einstellen zu können, erweitere ich einfach den Case Zeit_pos um die beiden Stellen für Alarm, gell?

Kurz was anderes: Fängt man bei Cases eigentlich immer mit Null an, also Case 0, Case 1, etc., oder ist es egal und ich kann auch mit der 1 beginnen?
 
Hi,

Ich hab ja geschrieben Alarm_std = 00 und Alarm_min = 00, leider erscheint so nicht zwei Nullen für min und zwei Nullen für Std sondern es erscheint folgendes: "0 :0 "
...
Wie gesagt, leider erscheint auf dem Display nur "0 :0 " statt "00:00"...
das wär so wie ... Das Papier ist Null Null Zentimeter dick. Ein Wert ist kein Text.
Wenn du das haben möchtest dann sieh mal FORMAT() und STR() nach (Bascom Referenz).
Spiel mal mit den Befehlen rum. Du benötigst beide dafür.

Kurz was anderes: Fängt man bei Cases eigentlich immer mit Null an, also Case 0, Case 1, etc., oder ist es egal und ich kann auch mit der 1 beginnen?
sieh dir doch einfach mal den Befehl in der Bascom-Referenz an ;) ist zwar englisch aber sehr empfehlenswert. Oder such hier im Forum mal nach "Case" und sieh dir an was du findest.

Merkst du was ? ... ich versuch dich abzunabeln damit du anfängst selber zu laufen :p :cool:
Man muß immer nur wissen wo es steht ;)

Gruß
Dino
 
Neeeiiinn, nicht abnabeln... Ich will bei Mami bleiben, heul..schluchtz.. ::cry:
Spaß ;)


Ok, das mit den Format hab ich nun auch hingekriegt!
Deine Lernmethode scheint zu wirken :)

Ich habe Format wie folgt gelöst:
Code:
Dim Alarm_std As Byte                                     
Dim Alstd As String * 2
Alstd = Str(alarm_std)
Alstd = Format(alstd , "00")

Dim Alarm_min As Byte                                        
Dim Almin As String * 2
Almin = Str(alarm_min)
Almin = Format(almin , "00")

Hättest du das auch so gemacht??


Wie kann ich nun die beiden Variablen editierbar machen?

Einige Posts vorher habe ich mich schonmal gefragt, woher zeit_pos weiß zu welcher Position er jumoen muß...
Allein durhc die Case-Anweisung kann ja nicht sein, weil ja da nur was von LCD "MIn -- ++" oder so steht...

Wie kann ich mit Taster_s auf Alarm_min (Almin) oder auf Alarm_std (Alstd) hüpfen?



Im moment sieht so der komplette Code aus:
Code:
'_________________________ CONTROLLER-KONFIG ___________________________________
$regfile = "m8def.dat"
$framesize = 24
$swstack = 8
$hwstack = 32
$crystal = 1000000


'_________________________ LCD-Display Einstellungen ___________________________
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , _
   Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Initlcd
Display On
Waitms 400
Cursor Off
Cls


'_________________________ SoftClock starten ___________________________________
Enable Interrupts
Dim Newsec As Byte                                          ' Flag fuer Erkennung von neuer Sekunde
Newsec = 0                                                  ' Flag initialisieren
Config Date = Dmy , Separator = .                           ' Datumsformat einstellen
Config Clock = Soft , Gosub = Sectic                        ' Sekunden-Sub setzen und Uhr starten
Cls

Time$ = "00:00:00"                                          ' Setzen auf Startwert
Date$ = "00.00.00"                                          ' Setzen auf Startwert

'_________________________ Variablen ___________________________________________
Dim Menu_homecnt As Byte
Dim Zeit_pos As Integer

Dim Alarm_std As Byte                                       ' Variable fuer die Alarm-Minute
Dim Alstd As String * 2
Alstd = Str(alarm_std)
Alstd = Format(alstd , "00")

Dim Alarm_min As Byte                                       ' Variable fuer die Alarm-Stunde
Dim Almin As String * 2
Almin = Str(alarm_min)
Almin = Format(almin , "00")

'_________________________ Taster: Uhreit stellen ______________________________
Config Pind.5 = Input
Portd.5 = 1
Taster_s Alias Pind.5

'_________________________ Taster: Zeit (+) ____________________________________
Config Pind.6 = Input
Portd.6 = 1
Taster_p Alias Pind.6

'_________________________ Taster: Zeit (-) ____________________________________
Config Pind.7 = Input
Portd.7 = 1
Taster_m Alias Pind.7

'_________________________ Kontroll-LED ________________________________________
Config Portb.0 = Output
Portb.0 = 1
Led Alias Portb.0


Do

'_________________________ Uhrzeit mit Taster einstellen _______________________
Debounce Taster_s , 0 , Zeit_stelle , Sub                   ' Taster fuer Uhrzeit einstellen
Debounce Taster_p , 0 , Zeit_plus , Sub                     ' Taster fuer Plus
Debounce Taster_m , 0 , Zeit_minus , Sub                    ' Taster fuer Minus


'_________________________ Diese Zeilen werden durch SECTIC aktiviert __________
If Newsec = 1 Then                                          ' Flag fuer neue Sekunde gesetzt ?
  Newsec = 0                                                ' Erkennung auf Sekundenaenderung zuruecksetzen

  If Menu_homecnt > 0 Then                                  ' Ist noch Restzeit von den 10sec uebrig ?
    Decr Menu_homecnt                                       '  Menue Countdown durchfuehren (10 sekunden runterzaehlen)
  Else                                                      ' Der Countdown ist abgelaufen, die 10sec sind um, Menueposition auf Normal
    Zeit_pos = 0                                            ' Menue auf Normalmodus setzen
    Locate 2 , 10                                           ' löscht die Anzeige, ab Zeile 2, Position 10, bzw. schreibt...
      Lcd "       ";                                        ' ...ab Zeile 2, Position 10 "      ", also nur Lehrzeichen.
  End If

Locate 1 , 1                                                ' Zeige in Zeile 1, ab erstes Zeichen...
Lcd Time$                                                   ' ... die Uhrzeit an.
Locate 2 , 1                                                ' Zeige in Zeile 1, ab erstes Zeichen...
Lcd Date$                                                   ' ... das Datum an.

Locate 1 , 12
Lcd Alstd
Locate 1 , 14
Lcd ":"
Locate 1 , 15
Lcd Almin
End If
'_________________________ SECTIC-Zeilen Ende __________________________________


Loop

End


' =============================================================================
' ===== Service-Routine sectic wird automatisch jede Sekunde ausgeführt. ======
' =============================================================================
Sectic:
  Toggle Led                                                ' LED fuer Lebenszeichen toggeln
  Newsec = 1                                                ' Flag fuer neue Sekunde setzen
Return


' =============================================================================
' ===== Stelle waehlen ========================================================
' =============================================================================
Zeit_stelle:
   Menu_homecnt = 10                                        ' Menue Countdown zurücksetzen auf 10 Sek Laufzeit (wegen Tastendruck)
   Incr Zeit_pos                                            ' Position +1
  If Zeit_pos > 8 Then
    Zeit_pos = 1
  End If
  Locate 2 , 10
  Select Case Zeit_pos
    Case 1                                                  ' 1 Sekunden
      Lcd "Sekunde";
    Case 2                                                  ' 2 Minuten
      Lcd " Minute";
    Case 3                                                  ' 3 Stunden
      Lcd " Stunde";
    Case 4                                                  ' 4 Tag
      Lcd "    Tag";
    Case 5                                                  ' 5 Monat
      Lcd "  Monat";
    Case 6                                                  ' 6 Jahr
      Lcd "   Jahr";
    Case 7                                                  ' 7 Alarm - Stunde
      Lcd "Alarm S";
    Case 8                                                  ' 8 Alarm - Minute
      Lcd "Alarm M";
  End Select
Return


Zeit_plus:
' Wenn ich auf Taster_p jumpt er zu der "Zeit_PLUS:"-Routine
' diese Routine wurde angesprungen weil Debounce den Druck vom Taster_p erkannt hat.
' Die Taste wurde also gedrückt um eine von Zeit_pos ausgewählte Stelle um eins zu erhöhen

Menu_homecnt = 5                                            ' Menue Countdown zurücksetzen auf 10 Sek Laufzeit (wegen Tastendruck)
Select Case Zeit_pos                                        ' Hier wird die Variable IM CASE VERGLICHEN (Schubladendenken) (0=Normal,1=Sec,2=Min,3=Std,...)
  Case 1                                                    ' Case 1 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _sec                                               ' Hier die Sekunde um eins erhöhen
    If _sec > 59 Then                                       ' Überlauf abfangen (Sekunde nur von 0...59)
      _sec = 0                                              ' Bei Sekunde > 59 wird wieder ab 0 angefangen
    End If

  Case 2                                                    ' Case 2 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _min                                               ' Hier die Minuten um eins erhöhen
    If _min > 59 Then                                       ' Überlauf abfangen (Minuten nur von 0...59)
      _min = 0                                              ' Bei Minuten > 59 wird wieder ab 0 angefangen
    End If
  Case 3                                                    ' Case 3 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _hour                                              ' Hier die Stunde um eins erhöhen
    If _hour > 23 Then                                      ' Überlauf abfangen (Stunde nur von 0...23)
      _hour = 0                                             ' Bei Stunde > 23 wird wieder ab 0 angefangen
    End If
  Case 4                                                    ' Case 4 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _day                                               ' Hier die Tage um eins erhöhen
    If _day > 31 Then                                       ' Überlauf abfangen (Tage nur von 1...31)
      _day = 1                                              ' Bei Tage > 31 wird wieder ab 1 angefangen
    End If
  Case 5                                                    ' Case 5 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _month                                             ' Hier die Monate um eins erhöhen
    If _month > 12 Then                                     ' Überlauf abfangen (Monate nur von 1...12)
      _month = 1                                            ' Bei Monate > 12 wird wieder ab 1 angefangen
    End If
  Case 6                                                    ' Case 6 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    Incr _year                                              ' Hier die Jahr um eins erhöhen
    If _year > 99 Then                                      ' Überlauf abfangen (Jahr nur von 0...99)
      _year = 0                                             ' Bei Jahr > 99 wird wieder ab 0 angefangen
    End If
  Case 7
    Incr Alarm_min
    If Alarm_min > 59 Then
      Alarm_min = 0
    End If
  Case 8
    Incr Alarm_std
    If Alarm_std > 23 Then
      Alarm_std = 0
    End If
End Select
Newsec = 1                                                  ' Trick 17 um die Ausgabe beim Uhr stellen sofort zu aktualisieren. Nicht schön aber funktionsfähig ;)
Return

Zeit_minus:
Menu_homecnt = 5                                            ' Menue Countdown zurücksetzen auf 10 Sek Laufzeit (wegen Tastendruck)
Select Case Zeit_pos
  Case 1
    Decr _sec
    If _sec > 59 Then
    _sec = 59
    End If

  Case 2
    Decr _min
    If _min > 59 Then
      _min = 59
    End If
  Case 3
    Decr _hour
    If _hour > 23 Then
      _hour = 23
    End If
  Case 4
    Decr _day
    If _day > 31 Then
      _day = 31
    Elseif _day < 1 Then                                    ' Der Tag kann hier auch 0 werden. Also Überlauf abfangen
      _day = 31
    End If
  Case 5
    Decr _month
    If _month > 12 Then
      _month = 12
    Elseif _month < 1 Then                                  ' Der Monat kann hier auch 0 werden. Also Überlauf abfangen
      _month = 12
    End If
  Case 6
    Decr _year
    If _year > 99 Then
      _year = 99
    End If
  Case 7
    Decr Alarm_min
    If Alarm_min > 59 Then
      Alarm_min = 0
    End If
  Case 8
    Decr Alarm_std
    If Alarm_std > 23 Then
      Alarm_std = 0
    End If
End Select
Newsec = 1                                                  ' Trick 17 um die Ausgabe beim Uhr stellen sofort zu aktualisieren. Nicht schön aber funktionsfähig ;)
Return


HAb eben noch etwas herumexperimentiert, wenn ich die Variable Alarm_std per LCD-Befehl anzeigen lasse, kann ich die Stunden zwar ändern, aber das format ist falsch.
Nehme ich die Variable Alstd, dann zeigt er mir zwar das richtige Format an, aber ich kann mit den +/-Tasten nichts ändern...

Also am Format oben im Code in der Variablen-Ebene muss der Fehler liegen...
 
...Einige Posts vorher habe ich mich schonmal gefragt, woher zeit_pos weiß zu welcher Position er jumoen muß...
Allein durhc die Case-Anweisung kann ja nicht sein, weil ja da nur was von LCD "MIn -- ++" oder so steht...

Wie kann ich mit Taster_s auf Alarm_min (Almin) oder auf Alarm_std (Alstd) hüpfen?
...
Die Frage ist so falsch formuliert. zeit_pos ist die Information, wohin gesprungen wird. deswegen sollte in der "debounce-sub" des Stelltasters auch ein "incr zeit_pos" zu finden sein (und ein zurücksetzen). Und deswegen wird in den subs der +/- Taster mittels "select case zeit_pos" auch dessen Zustand ausgewertet. Gesprungen wird diesbezüglich nur durch debounce (->sub), und select case (->case x).

Dann wird der Alarm genau so behandelt, wie der Rest bisher: Spannweite von Zeit_pos erweitern (also bevor es zurückgesetzt wird), in der "zeitstellen-sub", und auch die Ausgabe...
in den "+/- Tasten-subs" dann die entsprechenden case'es hinzufügen

In der Zeit-Stellen-sub legst Du fest, wie ab jetzt auf "+" und "-" zu reagieren ist. Diese Information steckt dann in der Variable zeit_pos. Reagieren tust Du erst in den subs der anderen Taster. Deutlich genug?
 
Hallo,

Die Frage ist so falsch formuliert. zeit_pos ist die Information, wohin gesprungen wird.
...
Dann wird der Alarm genau so behandelt, wie der Rest bisher: Spannweite von Zeit_pos erweitern (also bevor es zurückgesetzt wird), in der "zeitstellen-sub", und auch die Ausgabe...
in den "+/- Tasten-subs" dann die entsprechenden case'es hinzufügen
...
In der Zeit-Stellen-sub legst Du fest, wie ab jetzt auf "+" und "-" zu reagieren ist. Diese Information steckt dann in der Variable zeit_pos. Reagieren tust Du erst in den subs der anderen Taster. Deutlich genug?
stimmt ;)

Ich glaube du bringst im Moment noch etwas Ursache und Wirkung im Programm durcheinander.

Ok, das mit den Format hab ich nun auch hingekriegt!
Deine Lernmethode scheint zu wirken :)

Ich habe Format wie folgt gelöst:
Code:
Dim Alarm_std As Byte                                     
Dim Alstd As String * 2
Alstd = Str(alarm_std)
Alstd = Format(alstd , "00")

Dim Alarm_min As Byte                                        
Dim Almin As String * 2
Almin = Str(alarm_min)
Almin = Format(almin , "00")

Hättest du das auch so gemacht??
Hab ich auch so in der Art gelöst. Allerdings sieht es bei mir so aus ...
Code:
Dim Alarm_std As Byte    
[B]Dim alstd_str As string * 3 [/B]                                
Dim Alstd As String * 2
[B]Alstd_str[/B] = Str(alarm_std)
Alstd = Format([B]alstd_str[/B] , "00")
ich hab also noch ne Zwischenvariable eingesezt. Ist aber unerheblich. Wenn das so läuft dann ist es gut.

Wie kann ich nun die beiden Variablen editierbar machen?

Einige Posts vorher habe ich mich schonmal gefragt, woher zeit_pos weiß zu welcher Position er jumoen muß...
Allein durhc die Case-Anweisung kann ja nicht sein, weil ja da nur was von LCD "MIn -- ++" oder so steht...

Wie kann ich mit Taster_s auf Alarm_min (Almin) oder auf Alarm_std (Alstd) hüpfen?
Doch. Genau wie LotadaC geschrieben hat. Es ist so einfach. Die Variable zeit_pos beinhaltet die Information was du stellen willst und was du als Info auf dem Display haben willst damit du auch weißt was grade zum stellen aktiviert ist. zeit_pos ist wie die Seitennummer eines Buches. Wenn du mehr Seiten benötigst (zB für Alarm) dann klebst du Seiten dran (höher zählen lassen) und erweiterst in den anderen beiden Routinen auch die Reaktionen auf +/- (also was auf den Seiten steht und geändert werden soll).

Du mußt abstrakter und vor allem einfacher denken. Es ist alles sehr logisch und einfach. Du mußt auch aufpassen das du beim denken nicht Ursache und Wirkung durcheinander bringst. Frei nach dem Motto ... Die Was-passiert-Dann-Maschine aus der Sesamstrasse :rolleyes:

- SESAMSTRASSE Folge 1 (Teil 3) ab 3:10
- Sesamstrasse - Die "A" Maschine
- Sesamstrasse -Monster test machine
das waren noch Zeiten :cool: da konnte man als Kind im Fernsehen noch was lernen und wurde nicht so mit diesem japanischen Kommerzkram zugemüllt.

Gruß
Dino
 
Ja deutlich genug :) Obwohl mir eins zwei Sachen noch nicht so ganz klar sind, aber ich denke, das mir die Logik dahinter mit der Zeit schon ins Auge springen wird...

Ok, eigentlich hab ich den Code jetzt soweit fertig, bis auf die Alarm-Funktion und Überlauf muss ich auch noch korrigieren, ist hier aber etwas umständlicher...

Wie löse ich in Bascom den Alarm?

Ich stell mir sowas hier vor:

If Alarm_std = _hour and Alarm_min = _min Then PortB.1 = 1
Wait 45
PortB.1 = 0



Also der Syntax ist total falsch, ich weiß, aber ist der Ansatz so wenigstens richtig?
 
Hallo,

Wie löse ich in Bascom den Alarm?
Ich stell mir sowas hier vor:

If Alarm_std = _hour and Alarm_min = _min Then PortB.1 = 1
Wait 45
PortB.1 = 0


Also der Syntax ist total falsch, ich weiß, aber ist der Ansatz so wenigstens richtig?
und damit hällst du das gesamte Programm für 45sec auf und es tut nichts mehr außer warten. Nichtmal die Zeit wird aktualisiert.

So geht es nicht. Sie dir mal das Funktionsprinzip von der Variable "Newsec" an. Die wird als sogenanntes "Flag" verwendet. Ich transportiere damit Status-Informationen (ne neue Sekunde angebrochen) von einer Routine in eine andere und werte sie dort aus. Wenn du das mit dem Funktionsprinzip von "Menu_homecnt" verbindest dann hast du die Lösung .Ich hab das extra fett und unterstrichen gemacht weil du das selber in ähnlicher Funktion für den Alarm nachbauen mußt. Du kannst dafür aber nicht die genannten Variablen "Newsec" und "Menu_homecnt" verwenden da die ja schon für eine andere Funktion benutzt werde die du dann beeinflussen würdest.

Also an einer Stelle erkennen das die Alarmzeit erreicht ist. Den Alarm auslösen und nach Ablauf der 45sec den Alarm zurückstellen oder aber mit einem Taster den Alarm zurückstellen. Denk mal nach ... ich laß mich mal überraschen ;)

Gruß
Dino
 
Aber ganz ehrlich!
Sesamstrasse und auch Sendung mit der Maus, die STimme von Armin, der Hammer wie der das erklärt hat und bei Sesamstrasse ist Herbert Leichtfuß the King :D (oder sagen wir mal lieber, einer der Kings)


Ja, ich merke auch, das ich was durcheinander Bringe. Aber das es konkret die Ursache und Wirkung ist was ich verwechsele war mir bis jetzt nicht klar :)

Ich denke immer noch viel zu verknötet, aber durch eure Tipps entknottet sich bei mir mein Denkensweise...
Also ganz ehrlich, letzte Woche hätte ich das mit der Formatierung der Variable alleine auf gar keinen Fall hinbekommen!!!
Was glaubst du, was ich für feelings hatte, als ich gesehen habe das die Format-Geschichte funktioniert?? Ganz schön krasse Feelings, das kann ich dir sagen, mein Lieber ;)

Wie gesagt, alles funktioniert, bis auf die Überläufe bei Alarm und halt die Weckfunktion an sich.

Ich werd jetzt erst mal schauen, ob ich das mit den Überläufen in den Griff kriegen...
 
Hallo,


und damit hällst du das gesamte Programm für 45sec auf und es tut nichts mehr außer warten. Nichtmal die Zeit wird aktualisiert.

So geht es nicht. Sie dir mal das Funktionsprinzip von der Variable "Newsec" an. Die wird als sogenanntes "Flag" verwendet. Ich transportiere damit Status-Informationen (ne neue Sekunde angebrochen) von einer Routine in eine andere und werte sie dort aus. Wenn du das mit dem Funktionsprinzip von "Menu_homecnt" verbindest dann hast du die Lösung .Ich hab das extra fett und unterstrichen gemacht weil du das selber in ähnlicher Funktion für den Alarm nachbauen mußt. Du kannst dafür aber nicht die genannten Variablen "Newsec" und "Menu_homecnt" verwenden da die ja schon für eine andere Funktion benutzt werde die du dann beeinflussen würdest.

Also an einer Stelle erkennen das die Alarmzeit erreicht ist. Den Alarm auslösen und nach Ablauf der 45sec den Alarm zurückstellen oder aber mit einem Taster den Alarm zurückstellen. Denk mal nach ... ich laß mich mal überraschen ;)

Gruß
Dino

Ach stimmt ja... :eek:
Wie löse ich das mit dem Alarm an sich??
Ich brauch ja einen zusätzlichen Taster....


Also mein Wecker zuhause bimmelt eine Stunde lang, es sei den ich drücke auf die Al-Aus-Taste...
Aber warte... Mensch, Snooze gibts ja auch noch...

Da muß ich mal darüber nach denken :)

Nee das wird jetzt zu viel!

Alarm geht eine Stunde lang an und geht danach aus, es sei den man drückt auf einen Taster, das langt völlig.

OK, ich les mir jetzt das was du geschrieben hast noch mal genau durch, versuch mein Glück und meld mich dann nochmal...


Vielen Dank euch beiden!


PS: Eben ist mir auch noch aufgefallen, das ja auch ein Alarm-Aktiv-Symbol auf dem Display sein sein sollte... Ohhh jee, das hört ja nie auf.... Ich dachte ich wäre wirklich gleich fertig :)
Aber da sieht man mal wie kompliziert eigentlich so Sachen sind wie iPhone oder so, In einem iPhone muss ja da Hölle los sein, um alles so auf dem Display zu bekommen...
Ein Wunderwerk eigentlich...
Na ja, genug philosophiert ;)
 
Hi mohi,

Was glaubst du, was ich für feelings hatte, als ich gesehen habe das die Format-Geschichte funktioniert?? Ganz schön krasse Feelings, das kann ich dir sagen, mein Lieber ;)
es ist äußerst befriedigend und gut für das Selbstwertgefühl wenn man eine Lösung selber gefunden hat und nicht nur abgekupfert hat. :cool:

Wie löse ich das mit dem Alarm an sich??
Ich brauch ja einen zusätzlichen Taster....

Also mein Wecker zuhause bimmelt eine Stunde lang, es sei den ich drücke auf die Al-Aus-Taste...
Aber warte... Mensch, Snooze gibts ja auch noch...

Da muß ich mal darüber nach denken :)
Denk mal nach ... ich geb dir mal nen Tip ...
- Geht der Alarm los wenn du den Wecker stellst ? oder geht der Alarm nur im Normalbetrieb los.
- Du hast drei Taster wo bei zweien wohl noch Menüpositionen frei wären ;)
Denk mal drüber nach und laß es im Kopf kreisen ...

Gruß
Dino
 
Also ich hab mal etwas herum experimentiert, jetzt wo ich ja schon ein "Fortgeschrittener" bin ;)

Ebenmal so mit folgendem Code is nicht!
Code:
If _hour = Alarm_std And _min = Alarm_min Then
Wecker = 1
Else
Wecker = 0
End If

Und warum nicht?
Na weil hier von vorne herein der Alarmsignal an ist und der Alarmsignal nur solange dauart, so lange die Minuten und Stunden von Alarm und Uhrzeit identisch ist und das ist halt nur eine Minute lang. Danach ist das Alarmsignal wieder aus...

Aber immerhin, wenn ich die Alarmzeit bei mir einstelle und die Uhrzeit die Alarmzeit erreicht, dann wird PortB.1 (alias Wecker) auf High gesetzt :)

Hmmm, was brauch ich den eigentlich alles? Und wie soll ich den die Weckfuntion aktivieren?
OK, am besten mal auflisten, was der Wecker brauch:

- Taster zum aktivieren
- Symbol auf der LCD, damit man sieht, das Alarm aktiv ist
- Vielleicht eine Snooze-Taste

Das wars eigentlich, oder?

Ich kann doch bestimmt den Wecker aktivieren, wenn ich auf zwei Taster gleichzeitig drücke... Zum Beispiel, wenn ich auf die Plus und Minustaste gleichzeitig drücke, das dann das Symbol auf dem Display erscheint und Alarm aktiv ist...


Ok, eins nach dem anderen, du sagtest, ich soll mir Newsec und Menu_homecnt genau angucken:
Code:
Dim Newsec As Byte                                          ' Flag fuer Erkennung von neuer Sekunde
Newsec = 0                                                  ' Flag initialisieren

Dim Menu_homecnt As Byte                                    '
Dim Zeit_pos As Integer                                     '

____________________________________________________

If Newsec = 1 Then                                          ' Flag fuer neue Sekunde gesetzt ?
  Newsec = 0                                                ' Erkennung auf Sekundenaenderung zuruecksetzen

  If Menu_homecnt > 0 Then                                  ' Ist noch Restzeit von den 10sec uebrig ?
    Decr Menu_homecnt                                       '  Menue Countdown durchfuehren (10 sekunden runterzaehlen)
  Else                                                      ' Der Countdown ist abgelaufen, die 10sec sind um, Menueposition auf Normal
    Zeit_pos = 0                                            ' Menue auf Normalmodus setzen
    Locate 2 , 10                                           ' löscht die Anzeige, ab Zeile 2, Position 10, bzw. schreibt...
      Lcd "       ";                                        ' ...ab Zeile 2, Position 10 "      ", also nur Lehrzeichen.
  End If

Newsec ist ein Byte und gefüllt mit einer 0. Wenn Newsec = 1 dann Newsec = 0
Sieht für mich aus als zählt es so die Sekunden, und zwar nur die Sekunden...

Am sympatichsten erscheint mir irgendwie noch der Weg: If _hour = Alarm_std and _min = Alarm_min Then Set PortB.1
Funktioniert ja auch im Anstatz...

Aber wahrscheinlich ist das der Hasenweg um den Wecker in meinem Code einzubinden, euer Weg ist denn eher der Chefweg :)

Muss jetzt essen gehen... Bis denne
 
Hallo,

Ebenmal so mit folgendem Code is nicht!
Code:
If _hour = Alarm_std And _min = Alarm_min Then
Wecker = 1
Else
Wecker = 0
End If

Und warum nicht?
Na weil hier von vorne herein der Alarmsignal an ist und der Alarmsignal nur solange dauart, so lange die Minuten und Stunden von Alarm und Uhrzeit identisch ist und das ist halt nur eine Minute lang. Danach ist das Alarmsignal wieder aus...
das ist logisch. Hast du schonmal in Digitaltechnik von einem RS-FlipFlop gehört ? Ein Ereignis schaltet das FlipFlop ein, das andere Ereignis schaltet es wieder aus. In den Zeilen oben hast du nur ein Ereignis (If _hour = Alarm_std And _min = Alarm_min Then) das ein UND aus schaltet.

Ich kann doch bestimmt den Wecker aktivieren, wenn ich auf zwei Taster gleichzeitig drücke... Zum Beispiel, wenn ich auf die Plus und Minustaste gleichzeitig drücke, das dann das Symbol auf dem Display erscheint und Alarm aktiv ist...
ha ... das versuch mal :rolleyes: auf wieviel Mikrosekunden genau möchtest du die beiden Taster den gleichzeitig drücken ? An deiner Stelle würde ich ne andere Lösung suchen. Wenn du nen Stück weiter bist dann kannst du den Lösungsweg ja meinetwegen wieder aufgreifen.

Ok, eins nach dem anderen, du sagtest, ich soll mir Newsec und Menu_homecnt genau angucken:
Code:
Dim Newsec As Byte                                          ' Flag fuer Erkennung von neuer Sekunde
Newsec = 0                                                  ' Flag initialisieren

Dim Menu_homecnt As Byte                                    '
Dim Zeit_pos As Integer                                     '

____________________________________________________

If Newsec = 1 Then                                          ' Flag fuer neue Sekunde gesetzt ?
  Newsec = 0                                                ' Erkennung auf Sekundenaenderung zuruecksetzen

  If Menu_homecnt > 0 Then                                  ' Ist noch Restzeit von den 10sec uebrig ?
    Decr Menu_homecnt                                       '  Menue Countdown durchfuehren (10 sekunden runterzaehlen)
  Else                                                      ' Der Countdown ist abgelaufen, die 10sec sind um, Menueposition auf Normal
    Zeit_pos = 0                                            ' Menue auf Normalmodus setzen
    Locate 2 , 10                                           ' löscht die Anzeige, ab Zeile 2, Position 10, bzw. schreibt...
      Lcd "       ";                                        ' ...ab Zeile 2, Position 10 "      ", also nur Lehrzeichen.
  End If

Newsec ist ein Byte und gefüllt mit einer 0. Wenn Newsec = 1 dann Newsec = 0
Sieht für mich aus als zählt es so die Sekunden, und zwar nur die Sekunden...
Nein, nein, nein. Siehst du bei Newsec ein INCR oder ein +1 oder -1 oder irgendwas ähnliches ? Es ist eine Variable die wie ein Schalter verwendet wird. Wie ein RS-FlipFlop. Die SECTIC-Routine schaltet die Variable ein (1) und in der Hauptschleife wird s eingeschaltete erkannt und nach der Erkennung wieder ausgeschaltet (0) also zwei getrennte Stellen die auf einen Schalter drücken. So wie ein RS-FlipFlop. Das nennt man bei der Programmierung "Flag".

Gruß
Dino
 
Status
Für weitere Antworten geschlossen.

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)