Probleme mit Bascom Wecker mit LCD-Display mit einem ATmega8

Status
Für weitere Antworten geschlossen.
newsec ist hier nur einfachheitshalber ein byte. Eigentlich sollte es ein bit sein. Es ist nämlich nur ein Fähnchen, welches im Sekundentakt von sectic "hochgezogen" wird.Dein Hauptprogramm durchläuft die Hauptschleife zigmal pro Sekunde, und schaut (ua) ob die Fahne oben ist. Wenn das der Fall ist, holt er die Fahne wieder ein, und behandelt die neue Sekunde (Zeit weiterzählen usw).
zum Wecker:
-Du hast die Weckzeit in Variablen gespeichert
-Du hast einen Taster/Schalter/whatever, der den Wecker scharf macht (-> ein wecker enable flag)
-Du hast einen Taster/Schalter/whatever, der den Wecker entschärft (kann durchaus derselbe sein)
-desweiteren einen Alarm-Ausgang
beim Schärfen des Weckers wird das enable-Flag gesetzt
bei aktueller Zeit = Weckzeit folgt Alarmausgang=enableflag
beim Entschärfen wird das enable-Flag gelöscht, und ein eventuell bereits aktiver Alarm gestoppt.

Das Flag kann dabei direkt das Pin-Register-Bit sein, an dem ein Schalter zum ein und ausschalten hängt...
Nur mal so als Ansatz, wie ich das angehen würde...
 
Hallo,

man kann dem Alarm-Flag auch drei Zustände angedeihen lassen ...
0 = Alarm aus
1 = Alarm scharf
2 = Alarm ausgelöst (trööt)

Wer sagt das ein Flag nur 2 Zustände (0 + 1) haben darf ...
 
Ja stimmt, Newsec zählt ja net, weil kein Incr oder so da steht, eigentlich ne doofe Frage von mir! Sorry!

Flip-Flip ist doch einfach nur hin und her schalten, tik, tak, tik, tak, an, aus, an, aus, oder?

Noch mal eine doofe Frage: Einen Flag kann ich dann doch nur entweder auf "an" oder "aus" setzen.
Weil da ja nichts gezählt wird, weil ja kein incr oder so dran steht...

Wenn ich jetzt ein enable Flag setze, sagen wir mal auf 1 macht es doch immer nur 1 0 1 0 in einem gewissen Takt.
Ich verstehe hier nicht woran erkannt wird wie spät es ist...
Es sei den es werden die 1 0 1 0 (an/aus) gezählt, aber ansonsten kann ich mir das nicht erklären...

Ich hab echt schon schlechtes gewissen, weil ihr euch soviel Mühe gebt, tut mir echt Leid...


Hmmmm, ich steh da jetzt voll auf dem Schlauch.
Ich könnt jetzt höchstens so aus dem Gefühl einen Code zusammen schreiben, wie ihr das etwa gemeint habt:

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                                     '

[COLOR="#0000FF"]Dim Newsec2 As Byte                                          ' Flag fuer Erkennung von neuer Sekunde
Newsec = 0                                                  ' Flag initialisieren

Dim Menu_homecnt2 As Byte                                    '
Dim Zeit_pos As Integer                                     '
[/COLOR]


____________________________________________________

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


[COLOR="#0000FF"]Hier weiß ich schon nicht mehr weiter...[/COLOR]


Gesagt wurde, das ich Newsec und Menu_homecnt nicht nutzen kann, also habe ich zwei neue erstellt, ok soweit so gut, schreib ich jetzt mit "If Newsec2 = 1 Then Newsec2 = 0" Nee das wäre ja dasselbe wie Newsec...

Ich weiß es einfach nicht... :shout:

Ich versuch noch mich schlau zu machen...
 
Hi,

Noch mal eine doofe Frage: Einen Flag kann ich dann doch nur entweder auf "an" oder "aus" setzen.
Weil da ja nichts gezählt wird, weil ja kein incr oder so dran steht...

Wenn ich jetzt ein enable Flag setze, sagen wir mal auf 1 macht es doch immer nur 1 0 1 0 in einem gewissen Takt.
Ich verstehe hier nicht woran erkannt wird wie spät es ist...
Es sei den es werden die 1 0 1 0 (an/aus) gezählt, aber ansonsten kann ich mir das nicht erklären..
Es wird einfach NICHTS gezählt.
Stell dir mal diese amerikanischen Briefkästen vor.
Wenn der Postbote Briefe reinsteckt dann zieht er diese rote Fahne hoch (das Flag). Davon weißt du auch nicht wieviele Briefe da drin sind Du weißt nur DAS welche drin sind. Du weißt nur DAS sich der ZUSTAND des Briefkastens GEÄNDERT hat. Nicht mehr und nicht weniger. Das ist ein Flag. Es läßt dich eine Zustandsänderung erkennen.

Das ist so wie eine Ampel. Ein Flag mit drei Zuständen.
rot = nicht gehen
gelb = gleich wirds rot
grün = gehen
Es sagt dir nicht wie schnell du gehen sollst und die Ampel zählt auch nicht wieviele drüber gehen. Sie sagt die nur das du gehen sollst oder nicht.

Genauso sagt dir Newsec mit einer 1 das eine neue Sekunde angebrochen ist. Du erkennst es und setzt es als Quittung und damit es wieder auf 1 gesetzt werden kann dann auf 0. Es ist nur ein Merker, eine Flagge, ein Signal. Es zählt nix. Es sagt dir nur das sich was geändert hat.

Eine Variable ist lediglich eine Kiste. Du kannst die Kiste für alles mögliche nehmen. Entweder du legst eine Anzahl Murmel rein wo du welche dazulegen oder wegnehmen willst (addieren subtrahieren) oder du legst ne Zeitung rein (Text) oder du legst nen Taschentuch mit Knoten rein (nen Merker, ein Flag).

Gruß
Dino
 
Ja schön und gut, dann bedeutet es aber das der Flag an eine Uhrzeit gesetzt wird.
Zum Beispiel auf 06:30 ein Flag setzen.
Wird 06:30 erreicht wird ein Ereignis ausgelöst, das muss ich in Bascom umsetzen, richtig?


PS: Übrigens lustig erklärt mit den Briefkasten :)
 
Hi,

ich fürchte du hast noch massive grundlegende Verständnisprobleme mit dem Ablauf des Programmes. Meiner Meinung nach stehst du bei dem Programm das du da vor dir liegen hast eher wie ein Ochse vor dem Scheunentor und siehst den Wald vor Bäumen nicht.

Also mal in einer ganz kleinen Version. Sieh dir das folgende Programm mal an. Spiel es im Kopf durch und probier es aus. Versuch es wirklich zu verstehen. Wenn die LED mit der Kathode an GND hängt dann tut sie das was im Programm steht.
Code:
'_________________________ CONTROLLER-KONFIG ___________________________________
$regfile = "m8def.dat"
$framesize = 24
$swstack = 8
$hwstack = 32
$crystal = 1000000

'_________________________ Variablen ___________________________________________

'_________________________ Taster1: ____________________________________________
Config Pind.5 = Input
Portd.5 = 1
Taster1 Alias Pind.5

'_________________________ Taster2: ____________________________________________
Config Pind.6 = Input
Portd.6 = 1
Taster2 Alias Pind.6

'_________________________ Taster3: ____________________________________________
Config Pind.7 = Input
Portd.7 = 1
Taster3 Alias Pind.7

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

Do
  '_________________________ Taster abfragen _____________________________________
  Debounce Taster1 , 0 , Routine1 , Sub                     ' Drucker auf Taster1 ruft Routine1 auf
  Debounce Taster2 , 0 , Routine2 , Sub                     ' Drucker auf Taster2 ruft Routine2 auf
  Debounce Taster3 , 0 , Routine3 , Sub                     ' Drucker auf Taster3 ruft Routine3 auf

Loop


' =============================================================================
' ===== Subroutinen ===========================================================
' =============================================================================
Routine1:                     '  Routine 1 schaltet die LED ein
  Led = 1
Return

Routine2:                     '  Routine 2 schaltet die LED aus
  Led = 0
Return

Routine3:
Return

End
das ist deine erste Aufgabe.

Danach kannst du die gleiche Aufgabe mal mit diesem Programm durchführen. Versuch auch dieses Programm wirklich zu verstehen. Interpretier nichts wildes rein. Spiel es im Kopf durch. Überleg dir was bei welchen Tastendruck passiert und was beim Ablauf in diesem Programm so los ist ...
Code:
'_________________________ CONTROLLER-KONFIG ___________________________________
$regfile = "m8def.dat"
$framesize = 24
$swstack = 8
$hwstack = 32
$crystal = 1000000

'_________________________ Variablen ___________________________________________
Dim Merker As Byte
Merker = 0

'_________________________ Taster1: ____________________________________________
Config Pind.5 = Input
Portd.5 = 1
Taster1 Alias Pind.5

'_________________________ Taster2: ____________________________________________
Config Pind.6 = Input
Portd.6 = 1
Taster2 Alias Pind.6

'_________________________ Taster3: ____________________________________________
Config Pind.7 = Input
Portd.7 = 1
Taster3 Alias Pind.7

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

Do
  '_________________________ Taster abfragen _____________________________________
  Debounce Taster1 , 0 , Routine1 , Sub                     ' Drucker auf Taster1 ruft Routine1 auf
  Debounce Taster2 , 0 , Routine2 , Sub                     ' Drucker auf Taster2 ruft Routine2 auf
  Debounce Taster3 , 0 , Routine3 , Sub                     ' Drucker auf Taster3 ruft Routine3 auf

  '_________________________ Diese Zeilen werden durch Marker aktiviert __________
  If Merker = 1 Then                                        ' Diese Zeilen werden nur bei gesetztem Merker ausgefuehrt
    Led = 1                                                 ' LED anschalten
  End If
  '_________________________ Marker-Zeilen Ende __________________________________

Loop


' =============================================================================
' ===== Subroutinen ===========================================================
' =============================================================================
Routine1:                     '  Routine 1 setzt den Merker
  Merker = 1
Return

Routine2:                     '  Routine 2 löscht den Merker
  Merker = 0
Return

Routine3:                     '  Routine 3 schaltet die LED aus
  Led = 0
Return

End
Wenn du wirklich verstehst was in diesem Programm abläuft bist du ein Stück weiter. Ein Tip : Es wird nichts gezählt.

(Ich hoffe mal das ich da jetzt keine Böcke drin habe. Ist alles lediglich im Texteditor geschrieben)

Gruß
Dino
 
Ok, kann ich mir die Funktion von Newsec bzw. Merker so vorstellen, das ich mit einer Routine einen Flag in der Zeitspanne zwischen 00:00 und 23:59 setze?

Aktiviere ich mit einer Routine den Newsec-Flag (oder in deinem anderen Beispiel "Merker") bei einer bestimmten Zeit? Also bei einem von mir festgelegten Zeitpunkt?

Ich hoffe, du sagst jetzt ja, denn dann bedeutet das, das ich es mehr oder weniger verstanden habe :)


Es tut mir wirklich Leid, das ihr beide solche "Kopfschmerzen" mit mir habt!
Also ich weiß nicht was ich sagen soll...
Und ja ich stande oder stehe wie der Ochs vorm Berg bei dieser Newsec-Geschichte...


Ich meine eine Kiste, gefüllt mit einer "0" oder einer "1", was bringt mir das???
Was hab ich davon...

Stell dir mal ein Lineal vor, stellst es Senkrecht auf, unten ist 00:00 Uhr und ganz oben 23:59 Uhr.
Wenn ich die Fahne auf 06:30 stecke (also die Kiste mit einer "1" befülle), dann läuft ja erst mal die Zeit ja unabhängig davon weiter, aber wenn die 06:30 erreicht ist, dann passiert eine Aktion, richtig?
Wenn du mir jetzt sagst, das die Kiste einfach nur ein Flag in dieser Zeitspanne (00:00-23:59) ist, damit an diesem Flag irgendwas passieren kann, dann kann ich gleihc mit dem programmieren beginnen :)





Ich weiß nicht irgendwie habe ich Angst auf den "Antworten"-Button hier in diesem Forum-Textfeld zu klicken :stupido2: Ich mach's einfach mal, malsehen was passiert....
 
Hi mohi,

Aktiviere ich mit einer Routine den Newsec-Flag (oder in deinem anderen Beispiel "Merker") bei einer bestimmten Zeit? Also bei einem von mir festgelegten Zeitpunkt?
nein. ... Verbeiß dich nicht so in deine Uhrzeit. Du fixierst dich beim Verständnis nur auf deine Uhr. Es mach dich blind für die eigentliche Funktion. Die beiden Beispielprogramme von mir haben aber auch garnichts mit einer Uhr zu tun. Sie schalten nur über die Taster die LED ein und aus. Mehr nicht. Sie sollten dem Verständnis des Flags dienen. Einmal schaltest du den Port mit der LED direkt über die Taster ein und aus und einmal machst du es über die drei Taster.

Hast du die beiden Programme so wie sie da sind mal getestet ?

Dein Uhrenprogramm setzt dir im Moment Scheuklappen auf und du siehst anscheinend den Wald vor Bäumen nicht.

Es tut mir wirklich Leid, das ihr beide solche "Kopfschmerzen" mit mir habt!
Also ich weiß nicht was ich sagen soll...
Und ja ich stande oder stehe wie der Ochs vorm Berg bei dieser Newsec-Geschichte...
irgendwie bist du im Moment meiner Meinung nach vor lauter Uhrzeit-Denkerei blind für die eigentliche Funktion.
Ich glaube wenn du das mit den Flags verstanden hast dann fallen nicht die Tomaten sondern die Kürbisse von den Augen ;)

---

Stell dir mal ein Lineal vor, stellst es Senkrecht auf, unten ist 00:00 Uhr und ganz oben 23:59 Uhr. Wenn ich die Fahne auf 06:30 stecke (also die Kiste mit einer "1" befülle),
Nein! Das Flag hat mit den 6:30 aber auch garnichts zu tun. Deine Fahne ist die Vergleichsoperation. Also deine IF/THEN Zeile in der die aktuelle Uhrzeit mit der Alarmzeit verglichen wird. Wenn das gleich ist dann schaltet diese If/Then-Zeile deinen Gebimmel ein (Befüllt die Kiste mit der 1). Die 1 sagt dann das die Alarmzeit erreicht wurde und es grade bimmelt. Wenn du dann zB das Gebimmel ausschaltest oder Snooze drückst oder sowas dann wird die 1 wieder aus der Kiste genommen (Gebimmel ist aus).

dann läuft ja erst mal die Zeit ja unabhängig davon weiter, aber wenn die 06:30 erreicht ist, dann passiert eine Aktion, richtig?
Diese Aktion hat allerdings garnichts mit dem Flag zu tun.

Wenn du mir jetzt sagst, das die Kiste einfach nur ein Flag in dieser Zeitspanne (00:00-23:59) ist, damit an diesem Flag irgendwas passieren kann, dann kann ich gleihc mit dem programmieren beginnen :)
Das Flag ist ne Kiste die Jahrhunderte lang (bis zum Stromausfall) die 1 behält und weiterbimmelt. Das Flag hat also nichts mit der Uhrzeit zu tun sondern nur mit dem Zustand das es jetzt bimmelt. Das mußt du im Kopf trennen. Der Lichtschalter bei dir im Zimmer hat ja auch nichts mit dem Lauf der Sonne zu tun.

Ich weiß nicht irgendwie habe ich Angst auf den "Antworten"-Button hier in diesem Forum-Textfeld zu klicken :stupido2: Ich mach's einfach mal, mal sehen was passiert....

Irgendwie hast du da noch nen Knoten im Hirn von deinen ganzen Gedanken an die Uhrzeit.

Stell dir vor du mißt einen Wasserstand mit einem Schwimmer. Wenn der Schwimmer ne gewisse Höhe erreicht hat dann schiebt er nen Schalter auf AN. Dann geht die Pumpe an und der Wasserstand fällt. Wenn der Schwimmer nun aber keine Möglichkeit hat den Schalter wieder auf AUS zu schieben dann pumpt die Pumpe bis sie durchbrennt oder die Sicherung fliegt. Der Schalter bleibt aber immer noch auf AN. Er hat also eigentlich nicht wirklich etwas direkt mit dem Wasserstand zu tun. Man könnte ihn ja auch per Hand auf AN schieben dann würde die Pumpe auch pumpen. Der Schalter wäre zB ein Flag (Pumpe soll pumpen)

Gruß
Dino
 
Ja, habe ich.
Drücke ich auf Taster1 geht die LED an, klicke ich auf Taster2 bleibt die LED an, drücke ich auf Taster3 geht die LED wieder aus.

Durch If Merker = 1 Then Led = 1 End if geht die LED an, wenn ich auf Taster1 drücke.
Weil Taster1 die Kiste "Merker" mit einer eins befühlt.
Und wenn die Kiste Merker eine einhat, läst If Merker = 1 Then Led = 1 End if die LED leuchten.

Drücke ich auf Taster3 bleibt die LED an, sie kann nicht ausgehen, weil "Merker" noch die eins drinne hat und weil ja If Merker = 1 Then Led = 1 End if in der Do/Loop steht, bleibt halt die Led an.

Erst wenn die Kiste die Null enthält, was durch Taster2 passiert geht die Led aus bei druck auf Taster3.
Denn wenn in der Kiste eine 0 drinne ist, kann ja If Merker = 1 Then Led = 1 End if nicht funktionieren, weil die If/Then in Merker eine eins erwartet.


Aber um noch mal auf meine heißgeliebte Uhr zurück zu kommen :D wird doch Newsec benutzt um irgendwo zwischen 00:00 und 23:59 einen Flag zu setzen, oder?
 
Noch was, der Wasserstand ist meine Uhr und der Schwimmer ist Newsec, richtig?
 
Hi mohi,

sehr schön. Programm durchgespielt und verstanden ;)

Aber um noch mal auf meine heißgeliebte Uhr zurück zu kommen :D wird doch Newsec benutzt um irgendwo zwischen 00:00 und 23:59 einen Flag zu setzen, oder?
Newsec sagt durch eine 1 lediglich das eine neue Sekunde (New Second) angefangen hat. Da ich diese Variabel aber von der Funktion her nicht in der Sectic-Routine auf 0 drehen kann muß ich es wo anders machen. Also mache ich es da wo ich dieses Flag (die Variable) abfrage und das ist dieses Teil in der Hauptschleife. Das Flag wird auch zwischen Weihnachten und Ostern gesetzt und nicht nur zwischen 00:00 und 23:59. Es wird gesetzt um ...
- 00:00:00
- 00:00:01
- 00:00:02
...
- 23:59:57
- 23:59:58
- 23:59:59
- 00:00:00
- 00:00:01
...
..
.
JEDE Sekunde!

Jetzt genau aufpassen :
Da die Hauptschleife mehrere tausend mal in der Sekunde durchlaufen wird und je nach ausgeführten Befehlen da drin auch noch mit verschiedenen Durchlaufzeiten läuft habe ich dort drin keine festen Zeitabläufe. Ich generier mir für diesen einen Teil in der Hauptschleife durch die Information im Flag Newsec (neue Sekunde angebrochen) einen festen Sekunden-Rhythmus (mit einer relativ kleinen Abweichung durch die Durchlaufzeiten in der Hauptschleife). Ich kann auf diese Art also in der Hauptschleife Teile einbauen die ohne ein Wait oder was anderes Prozessorzeit fressendes nur einmal pro Sekunde oder einmal pro Minute oder einmal in 37 Sekunden aufgerufen wird.

Das Flag transportiert also keine Zeit oder irgendetwas anderes kompliziertes sondern lediglich die Info "Neue Sekunde". Wenn du in der Hauptschleife zB in diesem Teil die Zeile "Newsec=0" rauslassen würdest dann würde dieser Teil das erste mal nach einer Sekunde ausgeführt und dann bei jedem Hauptschleifendurchlauf. Das soll aber nicht sein. Es soll ja jede Sekunde sein.

Gruß
Dino
 
Ich muss mir deinen Text noch mal in aller Ruhe ein paar mal durch lesen! Gebe mir bitte noch etwas Zeit...
Aber alles sehr cool, dein ganzer Einsatz hier!
Ich komme mir auch etwas doof vor ständig Danke zu sagen, aber ich muss das sagen!
Sollte ich mal einen Sohn bekommen, nenne ich ihn Dino :D

Noch kurz zwei Sachen:
Brauche ich neue Routinen (außer Zeit_stelle, Zeit_plus und Zeit_minus), ja gell?

Und die Do/Loop-Schleife läuft mehrere tausend mal die Sekunde?
Ja nach Takt, gell?

Ich frag nur so um ganz sicher zu sein :)
 
Hi mohi,

Sollte ich mal einen Sohn bekommen, nenne ich ihn Dino :D
dann hat er meinen Spitznamen ;) Aber Dino gibts ja auch als richtigen Namen :)

Noch kurz zwei Sachen:
Brauche ich neue Routinen (außer Zeit_stelle, Zeit_plus und Zeit_minus), ja gell?
kommt drauf an wofür. Für die Alarmzeit stellen, Alarm an/aus eigentlich nicht.
Auf jeden Fall nichtwirklich eigene Subroutinen. Eher ein paar Kleine Erweiterungen.

Und die Do/Loop-Schleife läuft mehrere tausend mal die Sekunde?
Ja nach Takt, gell?
Kannst du ja ausrechnen.
Die kleinste Hauptschleife (ohne Inhalt) ...

Do
Loop

könnte man als Endlosschleife auch so schreiben

schleife:
GOTO schleife

oder in Assembler sieht es so aus ...

schleife:
rjmp schleife

=> rjmp heißt Relative Jump. Damit kann man zweitausend Speicherstellen im Flash nach vorne oder hinten springen.

- Dein Prozessor läuft mit 16MHz.
- Die meißten Befehle werden in einem Taktzyklus abgearbeitet (1/16MHz = 62,5ns => Nanosekunden).
- Ein Sprungbefehl (rjmp) dauert 2 Taktzyklen (also 125ns)
- Damit würde die Hauptschleife (ohne Inhalt) also 1/125ns = 8 Millionen mal pro Sekunde durchlaufen.

Jeder Befehl der in der Hauptschleife ausgeführt wird verlangsamt sie zusätzlich. Ich tippe mal das beim Uhrenprogramm so einige Zehntausend Durchläufe pro Sekunde zusammenkommen. Ist aber jetzt nur eine Schätzung.

Gruß
Dino
 
Guten Morgen,

na, alles ok? Hoffe euch gehts gut!?
Mir geht es samstagsmäßig seeehr gut ;)

Da die Hauptschleife mehrere tausend mal in der Sekunde durchlaufen wird und je nach ausgeführten Befehlen da drin auch noch mit verschiedenen Durchlaufzeiten läuft habe ich dort drin keine festen Zeitabläufe. Ich generier mir für diesen einen Teil in der Hauptschleife durch die Information im Flag Newsec (neue Sekunde angebrochen) einen festen Sekunden-Rhythmus (mit einer relativ kleinen Abweichung durch die Durchlaufzeiten in der Hauptschleife). Ich kann auf diese Art also in der Hauptschleife Teile einbauen die ohne ein Wait oder was anderes Prozessorzeit fressendes nur einmal pro Sekunde oder einmal pro Minute oder einmal in 37 Sekunden aufgerufen wird.

Das Flag transportiert also keine Zeit oder irgendetwas anderes kompliziertes sondern lediglich die Info "Neue Sekunde". Wenn du in der Hauptschleife zB in diesem Teil die Zeile "Newsec=0" rauslassen würdest dann würde dieser Teil das erste mal nach einer Sekunde ausgeführt und dann bei jedem Hauptschleifendurchlauf. Das soll aber nicht sein. Es soll ja jede Sekunde sein.

Warte ma ganz kurz:
Newsec macht nix anderes als die Länge einer Sekunde festlegen?
Also du meinst erst durch Newsec weiß der ATmega8 das eine Sekunde eine Sekunde lang dauert??
Ehrlich???

Ohh man die ganze Zeit ging es nur darum mit Newsec die zeitliche Dauer einer Sekunde festzulegen..
Oooohh man... :stupido:

Ja gut, aber woher weiß den trotzdem der ATmega wie lange eine Sekunde dauert?
Da steht ja nix von wegen: If 3213 Zyklen durchlaufen, Then Newsec = 1. ("3213" willkürlich gewählt)
Wahrscheinlich durch Sectic, richtig?? :)

Wenn man die softclock aktiviert hat und man beginnt in der Do/Loop mit einem If, weiß dann Bascom das es sich um sectic handelt?
Wegen dem Befehl: Config Clock = Soft , Gosub = Sectic , gell?
 
- Dein Prozessor läuft mit 16MHz.
- Die meißten Befehle werden in einem Taktzyklus abgearbeitet (1/16MHz = 62,5ns => Nanosekunden).
- Ein Sprungbefehl (rjmp) dauert 2 Taktzyklen (also 125ns)
- Damit würde die Hauptschleife (ohne Inhalt) also 1/125ns = 8 Millionen mal pro Sekunde durchlaufen.

Jeder Befehl der in der Hauptschleife ausgeführt wird verlangsamt sie zusätzlich. Ich tippe mal das beim Uhrenprogramm so einige Zehntausend Durchläufe pro Sekunde zusammenkommen. Ist aber jetzt nur eine Schätzung.

Mein ATmega läuft gerade mit dem int. Quarz von einem MHz

Kann ich ungefähr so rechnen:

1/1MHz = 1 ms
Ein Sprungbefehl dauert 2 Taktzyklen, also sind es 2 Millisekunden.
Und somit würde die Do/Loop 0,5ms also 500 mal die Sekunde durchlaufen...


8 Millionen mal die Sekunde bei 16MHz? Da ist ja im ATmega die Hölle los :)
Eigentlich aber der reine Wahnsinn!
 


Hallo!

Seit wann sind denn:
Eins durch eine Million
gleich eine tausendstel Sekunde? :hmmmm:

Das sagt doch schon die Zahl...... MILLION!
Also müssen es doch wohl millionstel Sekunden sein!

Dafür benötigt man noch nicht mal einen Taschenrechner. :wink:

In Kurzform:
1 / 1MHz = 1 Mikrosekunde!

Grüße,
Cassio
 
Hallo!

Seit wann sind denn:
Eins durch eine Million
gleich eine tausendstel Sekunde? :hmmmm:

Das sagt doch schon die Zahl...... MILLION!
Also müssen es doch wohl millionstel Sekunden sein!

Dafür benötigt man noch nicht mal einen Taschenrechner. :wink:

In Kurzform:
1 / 1MHz = 1 Mikrosekunde!

Grüße,
Cassio

Eins durch eine Millionen ergibt 0,000.001 ;)
 
Hi mohi,

Warte ma ganz kurz:
Newsec macht nix anderes als die Länge einer Sekunde festlegen?
Also du meinst erst durch Newsec weiß der ATmega8 das eine Sekunde eine Sekunde lang dauert??
Ehrlich???
:rolleyes: :p Waaahhhhh !!!! :banghead: :shout:

Ungefähr so wie eine Ampel festlegt wie lange eine Stunde zu dauern hat . :p :hmpf:

Langsam kommen mir echt Zweifel ..... :vollkommenauf: :hmmmm:
... ob das noch was wird mit dem Verständnis :fie: :stupid:

Du verwechselst wieder Ursache und Wirkung.

Dieser Thread hat bereits beinahe 80 Beiträge und es hängt immer noch beim Verständnis was so ein Flag eigentlich ist oder macht. Das ist meiner Meinung nach recht schnell erklärt und verstanden. Ich weiß echt nicht mehr ob du das nicht verstehen willst ... oder was auch immer.

Am Herd sagt dir die rote Leuchte ja auch nicht wie lange die Suppe noch zu kochen hat sondern nur das die Platte noch heiß ist. Wenn man Ursache und Wirkung verwechselt dann könnte man auch meinen das die Suppe noch 10 Minuten kochen muß weil die rote Lampe ja noch an ist. Ich gebs echt auf.

Gruß
Dino
 
Da die Hauptschleife mehrere tausend mal in der Sekunde durchlaufen wird und je nach ausgeführten Befehlen da drin auch noch mit verschiedenen Durchlaufzeiten läuft habe ich dort drin keine festen Zeitabläufe. Ich generier mir für diesen einen Teil in der Hauptschleife durch die Information im Flag Newsec (neue Sekunde angebrochen) einen festen Sekunden-Rhythmus (mit einer relativ kleinen Abweichung durch die Durchlaufzeiten in der Hauptschleife).

Du hast doch hier selber geschrieben, das du dir durch den Flag Newsec einen festen Sekunden-Rythmus generierst.
Lese ich doch richtig oder nicht???

Du generierst dir diesen festen Sekunden-Rythmus weil du keine festen Zeitabläufe hast.

Selbst die kleine Abweichung (die du erwähnt hast) konnte ich in meiner Uhr feststellen, ungefähr alle 12 Stunden 3 Sekunden Abweichung oder so.
Ich verstehe das so, das Newesec bei jeden neuen Sekundenbeginen ein flag setzt und gleich wieder entfernt, dadurch weiß mein ATmega wie lange eine Sekunde dauert..

Also ist Newsec mein Bezugspunkt. 60 Newsec-Flags bedeuten eine Minute.

So verstehe ich deinen Text...

Also ich bin auch ganz kurz vor der Kapitulation!
 
Hi mohi,

Du hast doch hier selber geschrieben, das du dir durch den Flag Newsec einen festen Sekunden-Rythmus generierst.
Lese ich doch richtig oder nicht???

Du generierst dir diesen festen Sekunden-Rythmus weil du keine festen Zeitabläufe hast.
Ja und nein.

Fangen wir mal bei Adam und Eva an.

- Was erzeugt in der Hardware den Takt ? => der Quarzoszillator oder der interne RC-Oszillator. Der Takt gilt für alles als Quelle. Für die gesamte Hardware und für die Software.

- Wie wird der Takt für die Softclock erzeugt ? => mit einem Timer der seinen Takt vom Oszillator bekommt. Bei einem Timer kannst du neben dem System-Oszillator auch einen anderen aktivieren der dann zB den 32kHz-Uhrenquarz dran hat.

- Wie werden die Sekunden, Minuten, Stunden, ... deine Uhrzeit erzeugt ? => Das macht die Softclock in Software mit der Hilfe des Timers und mit Variablen wo die Uhrzeit drin ist.

- Wie kannst du Sachen im Sekundenrhythmus ausführen lassen ? => über die Routine SECTIC die von der Softclock gesteuert wird. Diese Routine wird jede Sekunde einmal aufgerufen. Was du in dieser SECTIC-Routine reinschreibst wird jede Sekunde einmal aufgerufen.

- Wie erzeugt man an anderen Stellen im Programm einen festen Rhythmus (zB von einer Sekunde) ? => man leitet die Information das eine neue Sekunde angebrochen ist über eine Variable (ein Flag) aus der SECTIC in die andere Programmstelle weiter. Newsec ist nichts weiter wie ein Informationsrohr. Diese Variable erzeugt selber keinen Takt!

Also ...

Quarz ====> Timer ====> Softclock ====> SECTIC ==(Newsec)==> Programmteil

Dieser Weg ist eine Einbahnstraße. Der Takt geht NUR von links nach rechts. Du kannst eventuell Informationen verändern (Stunde, Minute, ....) aber die Taktquelle ist immer links. Du kannst zwischendurch die Richtung nicht ändern.

So ... nun wolln wir mal sehen ...

Gruß
Dino

PS : ich hab dir noch ne PN geschickt ...
 
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)