Probleme mit Bascom Wecker mit LCD-Display mit einem ATmega8

Status
Für weitere Antworten geschlossen.
Ich glaube das Problem bei uns ist die Sprache. Wir sprechen einfach verschiedene Sprachen.
Ich meine nicht, das wir aneinander vorbei reden, wir meinen beide (mehr oder weniger) dasselbe, wir drücken es nur verschieden aus...


Guck mal, genau das was du geschrieben hast habe ich ja gemeint.
Mit deinem letzten Post hast du das noch etwas genauer erklärt, was mir das ganze noch klarer gemacht hat, aber ich habe es letzendlich so gemeint.

Sectic wird von der Softclock gesteuert, das sorgt dafür, das einmal in der Sekunde was passiert, so ist halt der Rhytmus von Sectic.
Und weil du in dem Programmabschnitt Sectic If Newsec = 1 Then Newsec = 0 geschrieben hast, wird halt ist die "Kiste" (Variable) Newsec einmal in der Sekunde mit einer 1 gefüllt.

Also habe ich sozusagen im Sekunden Takt 'ne "1" und dann wieder "0"...




Als ich dich gefragt habe, wie ich zwei Stellen auf dem LCD bekomme, hast du zu mir gesagt: Guck dir mal Format() und Str(). Das habe ich dann auch getan und ich habe es geschafft auf dem Display zwei Stellen hinzu bekommen...


Ich habe geschrieben, das Newsec mit zählt, da hast du geschrieben: "Siehst du da irgendwo ein Incr oder sowas?"
Fand ich sehr cool deine Kommentare, den dadurch wurde klarer wie die Funktionsweise ist.
Im Nachhinein eigentlich eine doofe Frage von mir, weil in der Tat da nix von Incr oder so steht! Aber verlass dich drauf, das nächste mal stelle ich nicht mehr eine solche Frage ;)

Und genauso müsstest du mir das mit dem "Alarm auslösen" klar machen :)

Also, soweit ist mir das alles klar!
Was mir nur noch nicht so ganz klar ist, wie soll ich mit Newsec einen Alarm auslösen kann. Wie kann ich den Sekundentakt Newsec nutzen um einen Alarm auszulösen?
Mit was für Befehlen müsste ich da arbeiten?

Wenn du schreiben würdest:
Hier pass ma auf, wenn Newsec gleich bla bla, dann gosub bla bla, dann passiert jenes, dann nur noch das da und fertig guck dir das genau an und sag mir was du daraus verstanden hast...

Ich glaube, dann würde ich es ganz gut verstehen :)


Du darfst halt auch nicht vergessen, das ich ein absoluter Beginner bin, wenn du es so willst, ist sogar diese AlarmUhr mein erstes Projekt im Leben.



Sorry für die Umstände die ich dir bereitet habe!
Schönen Sonntag wünsche ich
 
Na dann auf ein Neues...
Überleg Dir selbst mal genau, warum Du den Alarm an den Sekundentakt (=sectic->newsec) binden willst. Da ist der logische Fehler.
Wann (und unter welchen Bedingungen) soll der Alarm losgehen?
(Tip: Dir steht ja in Form von Variablen die, grad aktuelleZeit zur Verfügung. Du aktualisierst sie ja jede Sekunde)

P.S.@Dino: so langsam wird mir klar, daß Du/wir bisher einfach zu schnell gewesen sind - mohi braucht kleinere Häppchen zum Verdauen.;)
 
Genau, ich habe ja noch die Variablen _hour, _min, _sec und da drinne steht immer die aktuelle Uhrzeit drinne.
Jede Sekunde werden _hour, _min, etc. aktualisiert... (Danke für den Tip :))

Und in den Variablen Alarm_Std, Alarm_min ist ja meine Weckzeit festgehalten.
So weit, so gut..

Mit Alarm_Std, Alarm_min setze ich einen neuen Flag (nicht Newsec, der ist ja bereits in Gebrauch) und wird dieser erreicht, dann löst der Alarm aus bzw. PortX.X = 1, richtig?

Nennen wir mal die neue Variable "Setalarm".


Ich muss ja dann irgendwie sagen: If Wert von Alarm_Std, Alarm_min in _hour, _min auftaucht Then Portx.x = 1

Oder das ganze wird berechnet, also ein Tag hat 86.400 Sekunden.
Wenn ich um sieben geweckt werden will, dann ist das ja die 25.200ste Sekunde nach 00:00:00 Uhr eines Tages.
Also müsste Setalarm bei 25.200 Sekunden gesetzt...

Aber warte, das passt ja nicht so ganz, das Problem ist das ja Newsec weiterläuft, würde ich sagen: Zähle Newsec = 1 und wenn 25.200 erreicht ist, dann funktioniert das ja nur einmal durch, weil der zählt ja weiter...
Es sei den ich sage der Variable: Wenn 86.400 erreicht ist, beginne wieder bei 0

Irgendwie so mmmmuss es gehen!!!


Du hast gefragt: Wann (und unter welchen Bedingungen) soll der Alarm losgehen?
Alarm soll los gehen, wenn Alarm_Std, Alarm_min = _hour, _min ist. Sagen wir für 45 Minuten Portx.x = 1, dann wieder Portx.x =

Hmm das alles benötigt noch mindestens zwei Taster, einen für Snooze (was mir eigentlich nicht so wichtig ist) und einen Taster um dem ATmega zu sagen:
Wenn Taster X gedrückt, dann ist der Alarm scharf (es gilt was in Alarm_std, Alarm_min steht), drücke ich nochmal drauf, dann ist der Alarm nicht mehr scharf (es gilt nicht was in Alarm_std, Alarm_min steht).

Aber wie Dino schon sagte kann man ja die Plus- und Minustaster misbrauchen...


Sagt mir bitte diesmal nicht wieder, das ich völlig daneben liege...

Wenn das diesmal nicht klappt, hören wir auf!
Ich gebe dann auf mit der Alarmuhr und widme mich mehr so den Basics von Bascom. Ist wohl sinnvoller ;) aber auch langweiliger :(
 
Noch nicht ganz, aber die Richtung stimmt... (das wird schon!)
Deine Alarm-Stunden und -Minuten sind keine Flags, sondern normale Variablen. So wie die aktuellen Minuten und Stunden, nur daß Du sie eben nicht in jeder Sekunde aktualisierst. Soweit klar?
"Stellen" kannst Du die Alarmzeit analog zur richtigen Zeit mit den Tastern, auch das hatten wir schon erklärt (und verstanden), richtig?
Nächster kleiner Schritt:
Wann soll der Alarm losgehen? Wenn Aktuelle Zeit = Alarmzeit (das hattest Du eben verstanden, gell?) also ist genau das die Abfrage, um den Alarm auszulösen. Wenn Du diese Abfrage direkt in die Hauptprogramm-Schleife mit rein nimmst, wird die halt zig mal pro Sekunde abgefragt. gehen würde das so.
Ok, wenn Du das bisher verstanden hast, gehts so weiter:
Warum soll ich das zig mal pro Sekunde erfragen? innerhalb der Sekunde ändert sich ja nichts in dem Vergleich.
Wann ändert sich die Aussage (wahr/falsch) des Vergleiches? (also wann innerhalb einer Sekunde? Wann innerhalb einer Minute?)
Wie kann ich das im Hauptprogramm ausnutzen?
(Ja, bis jetzt ist noch nix mit Alarm schärfen/entschärfen drin (wäre immer scharf, liesse sich nie abschalten -> kleine Schritte))

Edit:war mir jetzt nicht mehr ganz sicher: Du hast derzeit 3 Taster?
-einen, um aus dem Hauptprogramm zum "Zeitstellen" zu springen (und dort weiterzuschalten, auch für Alarm und so), Rücksprung wird durch ein "timeout" (homecnt) ausgelöst.
-zwei, um dort den gerade aktiven Punkt zu verändern(+/-) - außerhalb des "Stellmodus", also direkt im HP werden diese Tasten bisher nie abgefragt?

Edit2: Jein, das mit den Tastern ist eher so:
In einer Variable (zeitpos) wird der Aktuelle "Stellzustand" gemerkt. Ein Taster "leiert" durch diese Zustände, "homecnt" setzt den Zustand auf 0.
Die anderen beiden Tasten verändern verschiedene Variablen (Minute/sekunde...), je nach Zustand von zeitpos (Case-Blöcke in den debounce-subs dieser Taster). Wenn zeitpos=0 wird nichts gemacht (da kein case 0 ...).
 
Noch nicht ganz, aber die Richtung stimmt... (das wird schon!)
Deine Alarm-Stunden und -Minuten sind keine Flags, sondern normale Variablen. So wie die aktuellen Minuten und Stunden, nur daß Du sie eben nicht in jeder Sekunde aktualisierst. Soweit klar?

Glasklar!!!

"Stellen" kannst Du die Alarmzeit analog zur richtigen Zeit mit den Tastern, auch das hatten wir schon erklärt (und verstanden), richtig?

Richtig!!!

Nächster kleiner Schritt:
Wann soll der Alarm losgehen? Wenn Aktuelle Zeit = Alarmzeit (das hattest Du eben verstanden, gell?) also ist genau das die Abfrage, um den Alarm auszulösen. Wenn Du diese Abfrage direkt in die Hauptprogramm-Schleife mit rein nimmst, wird die halt zig mal pro Sekunde abgefragt. gehen würde das so.
Ok, wenn Du das bisher verstanden hast, gehts so weiter:

Ganz genau so habe ich das verstanden, wenn Aktuelle Zeit = Alarmzeit oder wie ich es geschrieben habe _Alarm_std & Alarm_min = _hour & _min, dann Alarm auslösen.


Warum soll ich das zig mal pro Sekunde erfragen? innerhalb der Sekunde ändert sich ja nichts in dem Vergleich.
Wann ändert sich die Aussage (wahr/falsch) des Vergleiches? (also wann innerhalb einer Sekunde? Wann innerhalb einer Minute?)
Wie kann ich das im Hauptprogramm ausnutzen?
(Ja, bis jetzt ist noch nix mit Alarm schärfen/entschärfen drin (wäre immer scharf, liesse sich nie abschalten -> kleine Schritte))

Die Aussage (wahr/falsch) ändert sich bei jedem Sekundenneubeginn. Und innerhalb einer Minute nach 59 Sekunden.
Also ändert sich der Wert von Variable _min alle Minute einmal.
Und ja, Alarm wäre so immer scharf.


Wie ich das im Hauptprogramm ausnutzen könnte, weiß ich so jetzt nicht...
Im Hauptprogramm (also du meinst zwischen Do/Loop, richtig?) würde ich nur den Vergleich reinschreiben, also wenn aktuelle Zeit = Alarmzeit, dann Portx.x = 1.
Aber diese Abfrage würde er ja in der Do/Loop zig mal die Sekunde abfragen, obwohl hier eigentlich sogar die Abfrage nur einmal in der Minute langt...



Edit:war mir jetzt nicht mehr ganz sicher: Du hast derzeit 3 Taster?
-einen, um aus dem Hauptprogramm zum "Zeitstellen" zu springen (und dort weiterzuschalten, auch für Alarm und so), Rücksprung wird durch ein "timeout" (homecnt) ausgelöst.
-zwei, um dort den gerade aktiven Punkt zu verändern(+/-) - außerhalb des "Stellmodus", also direkt im HP werden diese Tasten bisher nie abgefragt?


Genau, ich habe drei Taster, nämlich: Zeit_stelle, Zeit_plus und Zeit_minus.
Mit Zeitstelle jumpe ich auf dem Display von Sek zu Min zu Std zu Tag zu Monat zu Jahr zu AlarmStd zu AlarmMin und wieder von vorn.
Mit Zeit_plus und Zeit_minus kann ich die jeweilige Stelle mit der Zahl meiner Wahl einstellen.

Zwischen Do/Loop werden die Tasten nie abgefragt.

Hier mal der aktuelle Code:
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
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 Newsec As Byte                                          ' Flag fuer Erkennung von neuer Sekunde
Newsec = 0                                                  ' Flag initialisieren

Dim Menu_homecnt As Byte                                    '
Dim Zeit_pos As Integer                                     '

Dim Alarm_std As Byte                                       ' Variable fuer die Alarm-Stunde
Dim Alstd As String * 2                                     ' Variable die einfach nur zwei Stellen ausgibt, um Alarm_std zweistellig auszugeben

Dim Alarm_min As Byte                                       ' Variable fuer die Alarm-Minute
Dim Almin As String * 2                                     ' Variable die einfach nur zwei Stellen ausgibt, um Alarm_min zweistellig auszugeben

'_________________________ 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
'_________________________ Wecker_______________________________________________
Config Portb.1 = Output
Portb.1 = 1
Wecker Alias Portb.1


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 5 Sek uebrig ?
    Decr Menu_homecnt                                       ' Menue Countdown durchfuehren (5 sekunden runterzaehlen)
  Else                                                      ' Der Countdown ist abgelaufen, die 5 Sek 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
   Alstd = Str(alarm_std)
   Alstd = Format(alstd , "00")
Lcd Alstd
Locate 1 , 14
Lcd ":"
Locate 1 , 15
   Almin = Str(alarm_min)
   Almin = Format(almin , "00")
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 = 5                                         ' Menue Countdown zurücksetzen auf 5 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 5 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_std                                          ' Case 7 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    If Alarm_std > 23 Then                                  ' Hier die Alarmstunde um eins erhöhen
      Alarm_std = 0                                         ' Überlauf abfangen (Alarmstunde nur von 0...23)
    End If                                                  ' Bei Jahr > 23 wird wieder ab 0 angefangen
  Case 8
    Incr Alarm_min                                          ' Case 8 da DURCH TASTER_P UND ZEIT_STELLE MINUTEN GEWAEHLT WURDEN
    If Alarm_min > 59 Then                                  ' Hier die Alarmminuten um eins erhöhen
      Alarm_min = 0                                         ' Überlauf abfangen (Alarmminuten nur von 0...59)
    End If                                                  ' Bei Alarmminuten > 59 wird wieder ab 0 angefangen
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 5 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_std
    If Alarm_std > 23 Then
      Alarm_std = 23
    End If
  Case 8
    Decr Alarm_min
    If Alarm_min > 59 Then
      Alarm_min = 59
    End If
End Select
Newsec = 1                                                  ' Trick 17 um die Ausgabe beim Uhr stellen sofort zu aktualisieren. Nicht schön aber funktionsfähig ;)
Return
 
Die do/loop ist die Hauptprogramm-Schleife, ja. Was geschieht dort?
Bei jedem Durchlauf der Schleife wird er Zustand der Taster erfragt (mit debounce zur Entprellung), und ggf die entsprechende sub angesprungen.
Und es wird nach dem flag newsec geschaut, welches fast immer 0 ist. Gaaanz selten mal (nämlich nur einmal pro Sekunde) wird der der Then-Teil abgearbeitet, welcher Dir die Displayausgabe aktualisiert.
Nochmal zu der Abfrage AktuelleZeit=Alarmzeit. Wenn diese Aussage schon zu begin einer Sekunde falsch war (Then Teil wird nicht ausgeführt), dann bleibt sie bis zum Anbruch der nächsten Sekunde auch weiterhin falsch. Es reicht also, nach jeder neuen Sekunde einmal zu vergleichen. Und wo findest Du im der Hauptschleife einen Teil, der nur je einmal "nach jeder neuen Sekunde" ausgeführt wird?

Zu den Tastern hatte ich oben noch'n 2ten Edit.
 
Den finde in meinem Code ab der Zeile
'_________________________ Diese Zeilen werden durch SECTIC aktiviert __________
einen Post vorher.

Da steht ja If Newsec = 1 Then Newsec = 0

Also da drunter schreibe ich den Code, nur wie?

Schreibe ich dann noch eine If/Then?
Und eine neue Variable muss doch auch her, oder nicht?
 
Was mir wirklich helfen würde, sind eindeutige Instruktionen, wie zum Beispiel:

Du brauchst eine Variable für dieses und einer weitere für jenes.
Im Hauptprogramm musst du .... machen und in der ISR Zeit_minus .... machen...

So in der Richtung würd mir echt helden, dann kann ich mir auch Gedanken machen, welche Codeteile ich wo einbauen muss...


Was für ein Akt, ehrlich...

Schönen Sonntag abend wünsch ich euch noch...
 
....dann kann ich mir auch Gedanken machen, welche Codeteile ich wo einbauen muss...

Hallo!

Einbauen........... oder eher reinkopieren? :wink:

Bei den ganzen Infos die du schon bekommen hast, müsste der Groschen doch langsam mal fallen!

Ich möchte Dino jetzt nicht auf die Füße treten, aber vielleicht sollte er besser WENIGER Infos und Hilfe geben und DU einfach mal etwas mehr selber ausprobieren!
Vielleicht solltest du auch einfach noch mal von vorne anfangen.....
und ich meine NICHT dieses Uhrenprogramm, sondern GANZ von vorne.

Mit kommt es jedenfalls so vor, als fehlten dir zig Grundlagen und darum wird das jetzt auch nichts. :cool:


Grüße,
Cassio
 
nicht so schnell, wir kommen doch ganz gut voran...
zu Deinem vorletzten Post:
Genau da. Alles zwischen dem If... und dem dazugehörendem end if (direkt über dem "sectic Zeilen Ende" Kommentar) wird nur einmal jede Sekunde ausgeführt (wegen newsec, klar). Wenn da also steht:
Code:
if (aktuelleZeit=Alarmzeit) Then PORTx.y=1
oder so, geht das Bein hoch (und nie wieder runter)
Außerdem wäre der Alarm immer scharf, dh sollte das Bein doch irgendwie unten sein, würde der Alarm am nächsten Tag wieder losgehen, klar?
Du willst also eine Möglichkeit einbauen, den Alarm Scharfzuschalten oder zu entschärfen.
Du brauchst eine Variable für dieses
, genau genommen wieder ein Flag, daß Du eben vor dem losgehen lassen des Alarmes mitüberprüfst (quasi beide IFs in Reihe schalten).
Wie Dino bereits gesagt hat, kannst Du das mittels der +/- Tasten erledigen.

Kleines Rätsel für Dich: Wie?


versteckter Tip: Welchen Zutand hat Zeitpos im Normalbetrieb?

2ter Tip: Was geschieht dann beim Druck auf +/- genau?
 
nicht so schnell, wir kommen doch ganz gut voran...


Hallo LotadaC!

Stimmt!
IHR kommt ganz gut voran!
Bei Mohi bin ich mir da nicht so sicher...... :D

Er schreibt doch so lange Unsinn, bis einer von euch beiden ihm wieder ein Stück fertigen Programmcode liefert. :cool:


Grüße,
Cassio
 
Hallo!

Einbauen........... oder eher reinkopieren? :wink:

Grüße,
Cassio

Bitte keine doofen Kommentare!

Wenn Dino mir sagt, guck dir mal Format() und Str() dann tu ich da auch nix reinkopieren, geht ja nicht, oder???
Sondern ich guck mir an wie der Aufbau (z.B. im Referenzbuch) ist und versuch das in meinem Code umzusetzen!

Sowas nenne ich learning by doing ;)


Hallo LotadaC!

Stimmt!
IHR kommt ganz gut voran!
Bei Mohi bin ich mir da nicht so sicher......

Er schreibt doch so lange Unsinn, bis einer von euch beiden ihm wieder ein Stück fertigen Programmcode liefert.


Guck ma Cassio, solche Kommentare bringen mich hier nicht weiter!

Warum schreibe ich den Unsinn? Weil ich keinen Plan habe!
Hätte ich Plan, dann wäre ich nicht hier in diesem Forum, oder was meinst du, hmm???

Ich will eine Alarmuhr basteln und da brauche ich Unterstützung, wenn möglich keine Destruktive!

Ein Phenomen was mir immer wieder auffällt, jetzt nicht nur bei euch, sondern im allgemeinen, dass das Erklären ziemlich schwer fällt! Vorallem wenn Fachmänner Laien etwas erklären wollen...


Ich hab 1000mal gefragt was das mit dem Newsec auf sich hat, was das soll, tausend mal wurde gesagt Flag flag flag...

Hätte man bei meiner Frage was Newsec bewirken soll geantwortet:
Pass ma auf, wir haben keinen festen Sekundentakt, keinen festen Sekunden-Rhytmus!
In dem Abschnitt "Sectic" wird alles im Sekundentakt ausgeführt! In der Do/Loop wird nicht einmal in der Sekunde was ausgeführt sondern Zig tausend mal die Sekunde...
Und damit wir einen festen Sekundentakt bekommen, sagen wir der "Sectic" das er jede Sekunde die Variable Newsec auf 1 setzt und wieder auf 0.
Also jedesmal wenn eine 1 in Newsec auftaucht beginnt eine neue Sekunde....
1000 mal kurz die 1 in Newsec, bedeutet 1000 Sekunden!

Also hast du mit Newsec jetzt einen festen Sekundentakt (kleine Abweichung ist aber drinne)

Hätte man das so von Anfang an geschrieben, hättenw ir uns 40 Posts sparen können!!!


Was mich so verwirrt hat ist diese ganze Flag-Geschichte.
Flag kenne ich eigentlich aus Datenbanken, wenn du meherer hast und diese miteinader verknüpft werden sollen, dann setzt man einen Flag, damit die einem Datenbank weiß wo er bei der anderen weiter machen muss.
Das ist für mich ein Flag...


Deswegen habe ich ja auch gesagt, das wir verschiedene Sprachen sprechen, nicht das wir aneinander vorbei reden, nein nein, wir sprechen einfach verschiedenen Sprachen...


Aber ich glaube das ich so langsam eure Sprache verstehe ;)
 
Genau genommen haben wir das mit den Flags ja die ganze Zeit versucht. Letztendlich ist das hier nur eine Variable. Die Betonung Flag soll sagen, daß hier Zustände gespeichert und übermittelt werden sollen. Die Verrechnung von "Werten" wird dann durch "normale" Variablen erledigt. Letztendlich sind das aber alles nur bytes. Kannst ja auch mal Wiki zu "Flag" befragen...
Also jedesmal wenn eine 1 in Newsec auftaucht beginnt eine neue Sekunde....
Nein, andersrum: jedesmal, wenn eine neue Sekunde begonnen hat, wird durch sectic newsec auf 1 gesetzt. Ob da vorher 'ne 0, 'ne 1, 'n Schinkenbrötchen oder sonstwas drin stand, ist sectic egal. Hinterher ist 'ne 1 drin.
Haste Dich mit dem Rätsel beschäftigt?
 
@mohi

Bitte keine doofen Kommentare!..
..Guck ma Cassio, solche Kommentare bringen mich hier nicht weiter!
schau mal auf den Zähler rechts, das hier ist Beitrag #94
Was hat dich denn in diesem langen Thread weitergebracht?
Ich hab den ganzen Thread mitverfolgt und kann Cassio verstehen, wenn er feststellt, daß es nicht seine Schuld ist, wenn du nicht vorwärtskommst.
Vielleicht hast du in deiner Bascom-Karriere nur vergessen, die Geschichten mit LED-Blinken und so durchzuziehen.
Dann wäre es jetzt der geeignete Zeitpunkt, damit anzufangen, der Geduldstopf ist ja schon ziemlich leer.

SickBoy
 
nicht so schnell, wir kommen doch ganz gut voran...
zu Deinem vorletzten Post:
Genau da. Alles zwischen dem If... und dem dazugehörendem end if (direkt über dem "sectic Zeilen Ende" Kommentar) wird nur einmal jede Sekunde ausgeführt (wegen newsec, klar). Wenn da also steht:
Code:
if (aktuelleZeit=Alarmzeit) Then PORTx.y=1
oder so, geht das Bein hoch (und nie wieder runter)
Außerdem wäre der Alarm immer scharf, dh sollte das Bein doch irgendwie unten sein, würde der Alarm am nächsten Tag wieder losgehen, klar?
Du willst also eine Möglichkeit einbauen, den Alarm Scharfzuschalten oder zu entschärfen. , genau genommen wieder ein Flag, daß Du eben vor dem losgehen lassen des Alarmes mitüberprüfst (quasi beide IFs in Reihe schalten).
Wie Dino bereits gesagt hat, kannst Du das mittels der +/- Tasten erledigen.

Kleines Rätsel für Dich: Wie?

versteckter Tip: Welchen Zutand hat Zeitpos im Normalbetrieb?

2ter Tip: Was geschieht dann beim Druck auf +/- genau?


Ich bin jetzt leider gerade nicht zuhause und kann also nicht ausprobieren ob das funktioniert was ich gleich schreiben werde, aber jetzt mal ganz primitiv:

Ich würde dass dann ungefähr so machen:

Code:
If (aktuelleZeit=Alarmzeit) Then Portx.y = 1
Wait 2700 
else Portx.y = 0
End if

Ungefähr bedeutet das, wenn aktuelle Uhrzeit = Alarmzeit, dann 2700 Sekunden also 45Minuten lang Portx.y auf 1 und dann wieder auf 0.
Das würde die Uhr so nun jeden Tag machen und der Alarm wäre nonstop Scharf. Das bedeutet ich kann den Alarm sonntags nicht ausschalten!


Und jetzt glaube ich, kommt deine Variable ins Spiel. Ich bin mir nicht sicher, aber ich würde jetzt ne neue Variable generieren die sagen wir mal Setalarm heißt:
Code:
Dim Setalarm As Byte
Setalarm = 1

So, Setalarm ist nun genauso wie Newsec, nur halt mit nem anderen Namen.

Die Verhaltensweise von Newsec wird in der Sectic mit folgender Zeile definiert: If Newsec = 1 Then Newsec = 0

So eine ähnliche Verhaltensweise brauche ich ja dann auch für meine neue Variable Setalarm, aber nicht mehr für Sekunde weil ja dafür schon Newsec existiert!


Aber jetzt kommt ja wieder mein Verständnis Problem, ich verstehe ja meinen ganzen Code bisher (ok eins zwei kleine Fragen hätte ich noch), aber wie soll ich mit einem zusätzlichen Flag einen Alarmauslösen?

Ich persönlich hätte gesagt:
Ok machste aus der neuen Variablen Setalarm eine Long Variable und dann hätte ich gesagt:

If Newesec = 1 Then
Incr Setalarm
Elseif Setalarm > 86400 Then
Setalarm = 0
End if

Bedeutet einfach, ein Tag hat 86400 Sekunden.

Wenn Newsec eins wird, dann erhöhe den Wert von Setalarm um eins nach oben. Wenn in Setalarm den Wert 86399 erreicht, dann beginne wieder bei 0.

Was habe ich davon?
Na ganz einfach, ich hab jetzt nicht nur einen Sekunden Takt (nämlich mit Newsec) sondern auch einen Tagestakt, mit Setalarm.

Jetzt könnte ich ja sagen das 7 Uhr in der früh die 25200ste Sekunde nach 0 ist….

So würde ich jetzt Schritt für Schritt vorgehen, aaaaaber ich bin mir sicher dass ihr das auf gar keinen Fall so machen würdet….

Außerdem fällt mir gerade selber auf, das es dann Probleme geben würde mit den Variablen der Alarmzeit. Denn in Alarm_std steht ja nur die Stunde und in Alarm_min nur die Minute, aber die 25200ste Sekunde ist ja eine 5stellige Zahl...

Ok alles quatsch!

Fangen wir mal von vorne an, wozu dient den die neue Variable eigentlich?

Ich denke ihr meint, das ich mit der neuen Variable Setalarm einen Flag auf die zu weckende Zeit setze, wird diese erreicht, lösst der Alarm aus, gell?
Lasst uns erst mal einen zusätzlichen Taster für das Scharf machen der Weckzeit nehmen, drücke ich auf Taster_scharf dann wird ein Flag gesetzt.




Also ich glaube ich muss erst verstehen wie der Prozessablauf ist!

Etwa so wie bei einem Verbrennungsmotor, wie funktioniert der?

Einlassventil geht auf, Kolben geht runter, dabei wird Luft-Gas-Gemisch angesaugt, dann Einlasventil wieder zu, Kolben geht nach oben, Luft-Gas-Gemisch wird verdichtet, Zundkerze zündet, Luft-Gas-Gemisch explodiert und drückt dabei den Kolben wieder runter, Auslassvebtil geht auf, Kolben wieder nach oben, Luft-Gas-Gemisch wird rausgepresst und das Ganze wieder von vorne...

(Das ist nur ein Beispiel, bitte nicht mich fertig machen, wenn der ein oder andere Fehler drinne ist!!)

Also was ich damit sagen wollte, wie funktioniert den die neue Variable? Wie ist der Prozessablauf?
Taster_scharf wird gedrückt, und dann?








So zu deinen Fragen:
Welchen Zustand hat Zeitpos im Normalbetrieb?
Was geschieht dann beim Druck auf +/- genau?

Zeit_pos hat im Normal zustand die 0 und je nach der Anzahl von Drücken auf Taster_s die 1, 2, 3, 4, 5, 6, 7, 8 und wieder von vorne bei 0


Wenn ich einmal auf Taster_s (Zeit_stelle) klicke, dann tritt Case 1 in Kraft und darin steh das er auf Position Locate 2 , 10 Sekunde anzeigen soll (Lcd "Sekunde").

Ist in der Variable Zeit_pos die 1 hinterlegt, dann kann ich _sec mit den Plus/Minus-Tasten inkrementieren bzw. dekrementieren. Ist in Zeit_pos die 2 hinterlegt, dann kann ich _min mit den Plus/Minus-Tasten inkrementieren bzw. dekrementieren, etc.pp.
 
@mohi
schau mal auf den Zähler rechts, das hier ist Beitrag #94
Was hat dich denn in diesem langen Thread weitergebracht?
Ich hab den ganzen Thread mitverfolgt und kann Cassio verstehen, wenn er feststellt, daß es nicht seine Schuld ist, wenn du nicht vorwärtskommst.
Vielleicht hast du in deiner Bascom-Karriere nur vergessen, die Geschichten mit LED-Blinken und so durchzuziehen.
Dann wäre es jetzt der geeignete Zeitpunkt, damit anzufangen, der Geduldstopf ist ja schon ziemlich leer.

SickBoy


Ich weiß!
Ich hab doch selber geschrieben, das ich alleine nur für Newsec zig Posts benötigt habe!!!

Und mir ist auch klar, das Cassio und vorallem Dino die Schnauze voll haben!
Glaubst du ich habe Spaß daran euch so abzunerven???
Meinst du nicht, das ich gerne schon vor Tagen mit der Uhr fertig wäre??

Ich habe tierischen Bock auf den Wecker!
Nicht nur weil er mich weckt, sondern weil ich wenn die Uhr fertig ist ich mich auf den verschiedensten Art und weisen wecken lasen würde...
Mit Licht, per Summer, via einem Relais mit einem Radio, via mit einem Relais Wasserspritze steuern und und und...


Verstehst du, mir gefällt das und ich würde das gerne so können wie ihr, aber ich kanns einfach nicht!!!


Glaubt mir, mein Neid auf eure Programmierkünste ist euch sicher! Denn davon bin ich meeeiiilenweit entfernt!


Aber nach und nach wird das schon, denke ich.
Ich meine sooooooooooooooooooooooooooooooooo doof bin ich auch nun wieder nicht!
Obwohl ihr alle bestimmt vom Gegenteil überzeugt seid!



Wie auch immer, tut mir leid...
 
Hi,

das folgende hatten wir doch schonmal ...
Ich bin jetzt leider gerade nicht zuhause und kann also nicht ausprobieren ob das funktioniert was ich gleich schreiben werde, aber jetzt mal ganz primitiv:

Ich würde dass dann ungefähr so machen:

Code:
If (aktuelleZeit=Alarmzeit) Then Portx.y = 1
[B]Wait 2700 [/B]
else Portx.y = 0
End if

Ungefähr bedeutet das, wenn aktuelle Uhrzeit = Alarmzeit, dann 2700 Sekunden also 45Minuten lang Portx.y auf 1 und dann wieder auf 0.
Das würde die Uhr so nun jeden Tag machen und der Alarm wäre nonstop Scharf. Das bedeutet ich kann den Alarm sonntags nicht ausschalten!

sieh mal hier ... Beitrag #54
mohi 04.03.2012, 10:05 #54
und meine Antwort darauf ...
dino03 04.03.2012, 10:15 #55
lies es dir nochmal durch.

Ein Mikrocontroller macht kein Multitasking. Außer du schreibst dafür ein Subsystem. Viel Spaß ;)
Was soll er denn die 45Minuten sonst noch machen ? In der Nase popeln weil er so schön Strom verbraucht und dafür nix tuen muß ?

Gruß
Dino
 
Hi mohi,

also nichts gegen dich oder deine Intelligenz oder was auch immer. Ich bin aber langsam auch eher der Meinung wie Sickboy. Es fehlen beim Mikrocontroller oder überhaupt bei der Programmierung doch noch wesentliche Grundkenntnisse. Versteif dich nicht auf diesen Wecker oder das du ihn möglichst noch in diesem Monat fertig bekommst. Ich fürchte das wird so nix.

Was meinst du wohl wie ich trotz jahrelanger Programmiererfahrung mit Perl, Pascal, Basic, Assembler, PHP, ... mit den Mikrocontrollern angefangen habe ?
Code:
;	---------------------------------------
;	Test-Projekt: blinkende LED an Port PB0
;	---------------------------------------
;
.include "2313def.inc"			;Definitionsdatei laden
.cseg					;Beginn eines Code-Segmentes
.org 0					;Startadresse=0
;
start:	ldi	r16,low(ramend)		;Stackpointer auf
	out	spl,r16			;RAM-Ende setzen
	ldi	r16,0b00000001		;PortB: PB0 auf Ausgang
	out	ddrb,r16		;setzen
	clr	r16			;Anfangswert setzen
;
loop:	out	portb,r16		;Daten an PortB ausgeben
	rcall	wait			;Warteschleife aufrufen
	inc	r16			;Datenwert erhöhen
	rjmp	loop			;Schleife neu beginnen
;
;	Warteschleife (ungefähr 500ms)
;
wait:	ldi	r19,5			;r19, r18 und r17
	clr	r18			;ergeben zusammen
	clr	r17			;einen 3-Byte-Zähler
wait1:	dec	r17			;niedrigstes Byte -1
	brne	wait1			;0 erreicht? nein -> Schleife
	dec	r18			;mittleres Byte -1
	brne	wait1			;0 erreicht? nein -> Schleife
	dec	r19			;höchstes Byte -1
	brne	wait1			;0 erreicht? nein -> Schleife
	ret				;Schleifenende, Rückkehr
Sieh dir mal den Titel an.
Das Programm davor war noch kleiner. Da habe ich lediglich die Ports gesetzt um zu verstehen wie das alles zusammenhängt. Da ich schon recht lange was mit Elektronik, Analogtechnik und Digitaltechnik mache ging es bei mir relativ schnell (eine Woche) bis ich das erste Programm (4-Kanal Software-PWM) zum laufen hatte. Also versuch lieber nicht alles übers Knie zu brechen oder dich jetzt wie mit Scheuklappen auf deinen Wecker zu versteifen. Ich fürchte das wird im Frust enden und das wär eigentlich schade.

Gruß
Dino
 
Hallo !

Na, ich glaube..... so langsam fällt der Groschen! :wink:

Verstehst du, mir gefällt das und ich würde das gerne so können wie ihr, aber ich kanns einfach nicht!!!

Einsicht ist bekanntlich der erste Weg zur Besserung! :cool:

Natürlich kannst du es nicht. Du fängst ja auch gerade erst an!
Das ist ja auch nicht schlimm und hier wird auch einem Anfänger im freundlichen Ton und mit viel Gelduld oft geholfen!
Allerdings ist dies kein kostenloser Fernlehrgang um das Programmieren zu erlernen!
Dafür gibt es zum Beispiel bei Elektor extra Lehrgänge..... die aber natürlich auch Geld kosten!



Glaubt mir, mein Neid auf eure Programmierkünste ist euch sicher! Denn davon bin ich meeeiiilenweit entfernt!

Neidisch musst du darauf aber nicht sein!
Viele hier haben sich das Programmieren selber beigebracht..... andere haben es gelernt oder studiert.

Letztlich spielt das aber alles keine Rolle......
Keiner von denen hat sich gleich eine Aufgabe ausgesucht, die er nicht lösen kann!
Jeder von uns hat mal ganz klein angefangen!

Tja und genau DA liegt bei dir das Problem!
DU möchtest unbedingt diese Zeitschaltuhr bzw. diesen Wecker!
Das DU dich aber erst mal ein paar Monate mit den Grundprinzipien von Hard- und Software vertraut machen musst, ignorierst du einfach!

Sorry, aber ohne dieses Grundwissen wird das hier nichts werden! :cool:

Tja und ich kann mir vorstellen, dass die Anderen das inzwischen genauso sehen und daher langsam die Hilfe einstellen.
Es gleicht sonst langsam der Beatmung einer Leiche.... was am Ende auch keinen Sinn macht. :wink:


Mein FAZIT:
Brich das Ganze hier ab und pack es für einige Monate an die Seite!
Beginne mit den Grundlagen und praktischen Übungen.
Je nach Fortschritt und Erfahrung kannst du in 3 - 12 Monaten mit deinem Wecker weiter machen......
und musst nur in bestimmten Fällen dann mal um Rat fragen!


Bleibt mir also abschließend nur noch zu sagen.....
Did it, or dump it ! :cool:

Grüße,
Cassio
 
...
Welchen Zustand hat Zeitpos im Normalbetrieb?
...
Zeit_pos hat im Normal zustand die 0...
Ok
Was geschieht dann beim Druck auf +/- genau?
...
Ist in der Variable Zeit_pos die 1 hinterlegt, dann kann ich _sec mit den Plus/Minus-Tasten inkrementieren bzw. dekrementieren. Ist in Zeit_pos die 2 hinterlegt, dann kann ich _min mit den Plus/Minus-Tasten inkrementieren bzw. dekrementieren, etc.pp.
Ich hatte aber, wie Du richtig erkannt hast, für den Fall Zeit_pos=0 gefragt...
Ok, wenn Du das erkannt hast, erstmal in Gedanken beiseite legen...

Jetzt zu der eigentlichen "Alarm-auslösen" Geschichte.
Daß Du das mit dem Vergleich aktuelleZeit=Alarmzeit einmal für immer auslösen kannst, ist geklärt.
Daß dann anschliessend langes Warten ein Holzweg ist hast Du selbst erkannt (also aus der Kritik, als Du das das letzte mal so machen wolltest was gelernt).
Setalarm in jeder Sekunde zu verändern bringt Dir so allein auch nichts (allerdings hat das Potential zu einem genialen Trick, der mir bisher noch gar nicht aufgefallen war - trotzdem würde ich das für das Verständnis erstmal rauslassen). Der Schritt mit dem automatischen Abschalten des Alarmes ist zu groß. Versuch erst einmal hinzubekommen, den Alarm per Hand (Knopf/Flag/Statusvariable) scharfzuschalten und zu entschärfen.
Also so, daß der Alarm bei erreichen der Alarmzeit losgeht, und dann solange geht, bis Du ihn manuell wieder abschaltest.
Tip: ich würde das Flag deswegen AlarmEnabled nennen
Wann muß es gesetzt werden?
Wann muß es abgefragt werden? (Und laß das löschen erstmal außer acht!)
 
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)