Probleme mit Bascom Wecker mit LCD-Display mit einem ATmega8

Status
Für weitere Antworten geschlossen.

mohi

Mitglied
05. Nov. 2011
59
0
6
Sprachen
Hallo,

wie kann ich in BASCOM am ehestens und vorallem am einfachsten Einstellungen an der Uhrzeit einer Uhr programmieren?
Uhr besteht aus einem Atmega8 welches mit einem 16MHz ext. Quarz getaktet ist und das ganze auf einem LCD-Display 16*2 (1602A) ausgibt.

Die Uhr zeigt neben der Uhrzeit, auch das Datum und die Alarmzeit an und zwar im folgenden Format:
00:00:00___00:00
01.01.2000____an

So jetzt kommt mein Hauptproblem:

Wie kann ich die Uhrzeit am idealsten einstellen?
Ich hab mir die Einstellung etwa so vorgestellt: Wenn ich auf Taster0 länger als 3 Sekunden drücke, dann blinkt erst Stunden (also 00), mit Taster1 kann ich diese ändern, drücke ich nochmal auf Tatser0, dann blinkt Minute, nochmal, dann blinkt Tag, dann Monat, dann Jahr und so weiter...

Wie würdet ihr das Programmieren?

Ich kenn mich leider nicht so aus mit BASCOM, deswegen müsstet ihr etwas Geduld mit mir haben...


Bis denne und danke schonmal :)

Mohi
 
Hi Mohi,

Ich hab mir die Einstellung etwa so vorgestellt: Wenn ich auf Taster0 länger als 3 Sekunden drücke, dann blinkt erst Stunden (also 00), mit Taster1 kann ich diese ändern, drücke ich nochmal auf Tatser0, dann blinkt Minute, nochmal, dann blinkt Tag, dann Monat, dann Jahr und so weiter...

Wie würdet ihr das Programmieren?
so ungefähr hab ich das bei meinem Mega128 Testboard gemacht.
Sie dir dazu mal den Befehl "Debounce" an.

Ein Taster zählt bei mir bei jedem Druck einen Zähler um eins hoch ...
0 = Normalzustand, 1 = Stunden stellen, 2 = Minuten stellen, 3 = Sekunden auf Null, 4 = Monat stellen, ... usw.
Mit zwei weiteren Tastern ändere ich die entsprechende Stelle um +1 oder -1.
Außerdem habe ich einen Zähler der jede Sekunde um 1 heruntergezählt wird. Wenn ich einen der drei Taster drücke, dann wird er auf 20 gestellt (20 Sekunden Countdown). Wenn ich jetzt keine Taste mehr drücke dann wird bei erreichen von Null der Zähler für die Auswahl der zu stellen den Positionen auch auf Null zurückgestellt (= Normalzustand).

Versuch es mal umzusetzen. Es geht mit ein wenig ...
- If/Then/Else
- Select/Case
- Debounce

Wenn du die Befehle einsetzt dann sollte es kein Problem sein. Un nun das Gehirn anschmeißen ;)

Gruß
Dino
 
Hey Dino, danke für die schnelle Antwort!

Drei Tasten? Klingt doch schonmal sehr gut...
Eins um nacheinander von Stelle zu Stelle zu jumpen und zwei für hochzählen (+) und runter zählen (-)...


Debounce??
Damit entprellt man doch eigentlich..

Brauch ich eigentlich einen Timer für die 3 Sekunden Gedrückthaltaktion?
Hab ja bereits einen aktiviert für die Uhr..


Um die Stelle um eins höher zählen zu lassen würde ich folgendes schreiben:
If Taster1 = 0 Then
Waitms 25
Incr Stunde
End If

Funktioniert auch, aber wie ich von Stelle zu Stelle jumpen kann, davon habe ich keinen blaßen Dunst :-(
Wenn ich ja nochmal auf Taster0 drücke, dann soll er ja zur nächsten Stelle jumpen...
Von Stunde zu Minute, zu Alarmstunde, zu Alarmminute, zu Tag, zu Monat, zu Jahr und dann hört das Blinken der Stelle auf und die uhr geht ihren gewohnten Gang...

Ich kann das nur hasenhaft schreiben wie ich es gerne hätte, nämlich wie folgt:

Kannst du mir ungefähr sagen, wie das Prinzip funktioniert?

Etwa so:
If Taster0 3 sekunden = 1 then jump stunde (blinken lassen)
else
Stunde nicht jumpen lassen


Oder vielleicht hast du ja auch ein Mustercode...

Ich hab Wünsche, gell?? :-D
 
Hi,

Debounce??
Damit entprellt man doch eigentlich..
genau. Damit do das zeugs nicht brauchst ...
Um die Stelle um eins höher zählen zu lassen würde ich folgendes schreiben:
If Taster1 = 0 Then
Waitms 25
Incr Stunde
End If

Funktioniert auch, aber wie ich von Stelle zu Stelle jumpen kann, davon habe ich keinen blaßen Dunst :-(
Wenn ich ja nochmal auf Taster0 drücke, dann soll er ja zur nächsten Stelle jumpen...
Von Stunde zu Minute, zu Alarmstunde, zu Alarmminute, zu Tag, zu Monat, zu Jahr und dann hört das Blinken der Stelle auf und die uhr geht ihren gewohnten Gang...
Genau. Auch mit Debounce. Und dann läßt du eine Variable bei jedem Tastendruck um 1 hochzählen. Du nummerierst sozusagen die "zu stellenden Positionen" durch. Und über die beiden +/- Taster wird genau diese angewählte (Select/Case) nummerierte Stelle verändert.

Oder vielleicht hast du ja auch ein Mustercode...
na, na ,a .... wer wird denn ;) selber tippen macht schlau :p :cool:
Ein wenig Gehirnschmalz mußt du schon reinstecken. Dann lernst du am meißten dran. Die Befehle hab ich dir schon gesagt. Spiel mal ein wenig mit rum.

Gruß
Dino
 
Hi,

genau. Damit do das zeugs nicht brauchst ...

Genau. Auch mit Debounce. Und dann läßt du eine Variable bei jedem Tastendruck um 1 hochzählen. Du nummerierst sozusagen die "zu stellenden Positionen" durch. Und über die beiden +/- Taster wird genau diese angewählte (Select/Case) nummerierte Stelle verändert.

na, na ,a .... wer wird denn ;) selber tippen macht schlau :p :cool:
Ein wenig Gehirnschmalz mußt du schon reinstecken. Dann lernst du am meißten dran. Die Befehle hab ich dir schon gesagt. Spiel mal ein wenig mit rum.

Gruß
Dino

Hätte ja sein können, das ich Welpenschutz bekomme ;-)
Spaß :)


OK, dann brauch jede Einheit seinen Select/case, richtig?
Etwa so:
Code:
Debounce Taster0 , 1 , Einstellen , Sub

Select Case Einstellen 
Case 1:                  'Stelle: Stunde
If Taster1 = 0 Then
Waitms 25
Incr Stunde
End If

Case 2:                 'Stelle: Minute
If Taster1 = 0 Then
Waitms 25
Incr Minute
End If

Case 3:                 'Stelle: Alarm Stunde
If Taster1 = 0 Then
Waitms 25
Incr Alarm Stunde
End If

Case 4:                 'Stelle: Alarm Minute
If Taster1 = 0 Then
Waitms 25
Incr Alarm Minute
End If

Case 5:                 'Stelle: Tag
If Taster1 = 0 Then
Waitms 25
Incr Tag
End If

Case 6:                 'Stelle: Monat
If Taster1 = 0 Then
Waitms 25
Incr Monat
End If

Case 7:                 'Stelle: Jahr
If Taster1 = 0 Then
Waitms 25
Incr Jahr
End If
 
Ich hab jetzt echt lange im Internet nach Bascom-Wecker gegoogelt, aber ohne nennenswerten Erfolg...
Sind auch viele Sachen die ich nicht verstehe, wie z.B. sectic, weder im Internet noch in der Bascom-Hilfe konnte ich was Verwertbares finden...
Also aus eigener Kraft wird das nix...
Wenn's wenigstens ein idiotensicheren Tutorial geben würde, wäre ja echt geil, egal was ich im Internet gefunden habe, es war irgendwie nie Anfängergerecht...
Das muss sich ändern!

Ich würde gerne einen Wecker von Anfang an programmieren und würde mich echt freuen, wenn ich da Unterstützung bekommen würde! Wenn ich es schaffen solte einen Wecker zu programmieren, dann schreib ich den idiotensicheren Tutorial :) denn eins steht fest, es gibt viele, viele Menschen die genau mein Problem haben ;-)

Also, damit überhaupt eine Uhr auf dem LCD-Display (1602A) erscheint ist folgender Grundcode notwendig:
Code:
'____________________ Microcontroller Konfiguration ____________________________

$regfile = "m8def.dat"                                      'Gibt an, das es sich um einen ATmega8 handelt
$framesize = 24
$swstack = 8
$hwstack = 32
$crystal = 16000000                                         'Gibt an das der ATmega8 mit 16MHz getaktet wird (externer Quarz)


'____________________ LCD-Display (1602A-HD44780) Einstellungen ________________

Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , _
   Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5               'Welcher LCD-Pin an welchem Port des ATmegas hängt
Config Lcd = 16 * 2                                         'Gibt an wievie Zeichen (je Zeile) auf wieviele Zeilen das LCD hat
Config Lcdbus = 4
Config Lcdmode = Port
Initlcd
Display On
Waitms 400


'____________________ Uhrenroutine _____________________________________________

$external _soft_clock
Config Clock = User
Const _sectic = 0
Config Date = Dmy , Separator = .                           ' Deutsches Datumsformat TT.MM.JJ (Dmy), Trennzeichen ist ein Punkt (.)


'____________________ UHR (hier entsteht der Sekundentakt) _____________________

Config Timer1 = Timer , Prescale = 256 , Clear Timer = 1
Const Ctc_value =(_xtal / 256) - 1
Compare1a = Ctc_value
Enable Compare1a
On Compare1a Timer1_clock_isr Nosave
Time$ = "23:59:55"
Date$ = "29.02.12"
Dim Curr_sec As Byte
Curr_sec = 255

Enable Interrupts                                           ' Aktivierung des Interruptes

Cls                                                         ' Löscht das Display

'____________________ HAUPTSCHLEIFE ____________________________________________

Do

Locate 1 , 1                                                ' Positionierung der Uhrzeit, nämlich ab ersten Zeile, ersten Zeichen
Lcd Time$                                                   ' Lcd ist hier wie print und hinter Time$ verbirgt sich die Uhrzeit xx:xx:xx
Locate 2 , 1                                                ' Positionierung des Datums, nämlich ab zweite Zeile, ersten Zeichen
Lcd Date$                                                   ' Lcd ist hier wie print und hinter Date$ verbirgt sich das Datum TT.MM.JJ

Cursor Off Noblink
Waitms 50

Loop



'____________________ SUB: Timer1_Clock_ISR ____________________________________

Timer1_clock_isr:
Pushall
Popall

  !jmp _soft_clock
Return

Getdatetime:
Return

Settime:
Return

Setdate:
Return

End

Hab nicht hinter jede Zeile des Codes ein Kommentar geschrieben, weil mir einiges noch nicht so klar ist...
Wenn du gerne ergänzen möchtest, habe ich nix dagegene :)
Aber nach und nach möchte und werde ich jede Zeile kommentieren.

Sooo, mit diesem Code sehe ich auf der ersten Zeile des LCDs die Uhrzeit und in der zweite Zeile das Datum. Alls funktioniert Prima und auch das Datum springt schön um ab 23:59:59...
Also alles einwandfrei...


Wie kann ich nun diesen Code so mit Befehlen ergänzen, das ich die Uhrzeit stellen kann?
Also müsste ich doch Time$ (was ja 00:00:00 ist) splitten und zwar jeweils in 00 für Stunden und 00 für Minuten...
Irgendwie muss ich doch aus Time$ und Date$ einzelne stellen machen können, oder bin ich total auf dem Holzweg?
 
Hi Mohi,

schau mal in die Bascom-Referenz (die große PDF-Datei) bei Punkt "6.99 CONFIG CLOCK"
Da steht eigentlich alles drin. Unter anderem ...
Syntax
CONFIG CLOCK = soft | USER [, GOSUB = SECTIC]

Remarks
Soft : Use SOFT for using the software based clock routines. Use USER to write/
use your own code in combination with an I2C clock chip for example.
unter anderem stehen da neben dem beiden Variablen Time$ + Date$ die Variablen _sec , _min , _hour, _day , _month , _year . Die kann man nicht nur auslesen sondern auch setzen. Auf die Weise kann man die Softclock stellen. Ich hab das so gemacht das ich beim Systemstart die RTC (DS1307) gelesen und in die Softclock gesetzt habe. Mit den Tastern zum stellen habe ich auch einen Punkt reingebaut bei dem ich mit dem +Taster die Softclock in die RTC schreiben kann und mit dem -Taster die RTC in die Softclock lesen kann. Also sozusagen Speichern und Laden.

Du mußt also nur über Select/Case die entsprechenden Stellen auswählen (Case 2 zB für Minuten) und mit den + und - Tastern die Minuten (_min) um eins hoch oder runterzählen und dann gleich anzeigen damit du die Änderung siehst.

Über die Definition der Softclock (Gosub = Sectic ... zB Gosub = Sekundenroutine) kannstz du auch sekündlich ein Unterprogramm aufrufen lassen. Damit kann man zB nur dann die Uhrzeit anzeigen lassen wenn sich auch wirklich was geändert hat. Das ist ja normalerweise jede Sekunde einmal der Fall.

Sieh dir mal die Bascom-Referenz an. Das Beispiel ist eigentlich eine ganz gute Basis. Es wird für die Softclock immer der Asynchrone Timer2 verwendet an dem der zusätzliche Oszillator dranhängt. An den Pins des Oszillators (TOSC1/TOSC2) muß dafür ein 32768Hz (32kHz) Uhrenquarz angeschlossen werden. Extra Kondensatoren wie beim Systemquarz benötigst du an den Pins nicht.

EDIT: Ich geb dir mal ein paar Brocken die du noch zusammenbauen mußt ... Ein wenig Arbeit mußt du ja auch haben ;)

Also die Initialisierung der Softclock ...
Code:
' =============================================================================
' ===== 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

Das ist eine Routine die in der Mainloop sitzt und durch das Flag der Sectic-Routine angeschubst wird ...
Code:
' ===== Diese Zeilen werden durch SECTIC aktiviert =====
If Newsec = 1 Then                                          ' Flag fuer neue Sekunde gesetzt ?
  Newsec = 0                                                ' Erkennung auf Sekundenaenderung zuruecksetzen

  Sec_s = Str(_sec)
  Sec_s = Format(sec_s , "00")
  Min_s = Str(_min)
  Min_s = Format(min_s , "00")
  Std_s = Str(_hour)
  Std_s = Format(std_s , "00")

  Lcd  Date$ ; " " ; Std_s ; ":" ; Min_s ; ":" ; Sec_s

End If
' ===== SECTIC-Zeilen Ende =====
... auf die Art kann man Teile in die Mainloop einbauen die durch Flags aktiviert werden und dann zB nur jede Sekunde oder jede Minute oder nur wenn ein Pin einen bestimmten Pegel hat aufgerufen werden. Man muß nicht auf Ereignisse warten. Wenn die Teile über die Flags nicht aktiviert werden läuft die Mainloop ohne warten mit voller Geschwindigkeit durch und du hast die CPU nicht mit Warteschleifen blockiert. Du hast immer volle Leistung.

Das ist die wirklich kurze Sectic-Routine ...
Code:
' =============================================================================
' ===== Service-Routine sectic wird automatisch jede Sekunde ausgeführt. ======
' =============================================================================
Sectic:
  Toggle Portb.0                                            ' LED fuer Lebenszeichen toggeln
  Newsec = 1                                                ' Flag fuer neue Sekunde setzen
Return

Da siehst du wie eine Tastenabfrage mit Debounce abläuft (in der Mainloop) ...
Code:
' ===== Uhrzeit mit Taster einstellen =====
Debounce Pind.5 , 0 , Zeit_stelle , Sub                     ' Taster 2
Debounce Pind.6 , 0 , Zeit_minus , Sub                      ' Taster 3
Debounce Pind.7 , 0 , Zeit_plus , Sub                       ' Taster 4
' ===== Uhrzeit einstellen Ende=====

und das ist eine Subroutine die vom Tastendruck aktiviert wird ...
Code:
' =============================================================================
' ===== Stelle waehlen ========================================================
' =============================================================================
Zeit_stelle:
  Menu_homecnt = 10                                         ' Auto-Home auf 10 Sekunden setzen
  Incr Zeit_pos                                             ' Position +1
  ' 0 Ruheposition
  ' 1 Sekunden
  ' 2 Minuten
  ' 3 Stunden
  ' 4 Tag
  ' 5 Monat
  ' 6 Jahr
  ' 7 Zeit speichern/laden
  ' 8 Initialisieren
  If Zeit_pos > 8 Then
    Zeit_pos = 0
  End If
  Locate 4 , 5
  Select Case Zeit_pos
    Case 0
      Lcd "Uhr  ..  .. ";
    Case 1
      Lcd "Sec  00  30 ";
    Case 2
      Lcd "Min  --  ++ ";
    Case 3
      Lcd "Std  --  ++ ";
    Case 4
      Lcd "Tag  --  ++ ";
    Case 5
      Lcd "Mon  --  ++ ";
    Case 6
      Lcd "Jahr --  ++ ";
    Case 7
      Lcd "RTC  Ld  St ";
    Case 8
      Lcd "Init HCk SCk";
  End Select
Return
... bau mit dieser Subroutine zwei weitere auf die in gleicher weise mit den beiden anderen Tastern die entsprechende Stelle um ein hoch oder runterzählen können.

Deine Aufgabe ist es jetzt also die Teile richtig zusammenzufügen und die beiden fehlenden Routinen zu erstellen. Das sollte möglich sein :cool:
Sieh dir die Befehle DEBOUNCE, SELECT/CASE, CONFIG CLOCK mal in der Bascom-Referenz an.

Noch was zur Ausgabe auf nem LCD. Die Ausgabe frißt extrem viel CPU-Zeit. Gib nur was aus wenn sich wirklich was geändert hat und nicht bei jedem Schleifendurchlauf. Notfalls mach es zB jede Sekunde oder jede halbe Sekunde (über Timer oder Sectic). Außerdem solltest du auf keinen Fall dauernd CLS verwenden. Dann würde das LCD anfangen zu flackern (Bild da, Bild weg). Wenn sich Teile geändert haben dann überschreib nur diese Teile. Zum Beispiel mit Leerzeichen oder mit den neuen Werten.

Gruß
Dino
 
Hallo Dino,

vielen vielen Dank für deine Erklärung!

Glaube mir, ich hab mir echt Mühe gegeben im Internet entsprechende Infos zu finden...
Gebe mal Sectic in google ein, du wirst nix bzw. fast nix finden!


Du hast den Quarz angesprochen, ich bin so froh darüber, ehrlich :)
Wie funktionierten das mit den 32768 HZ Quarz?

Ich kann ja bei $Chrystal nicht 32768 angeben ... Bascom gibt da ein Fehler aus...

Wenn ich dann den Uhrenquarz einbaue, sind dann 2 Quarze aktiv, oder wie? Einmal der Interne (1MHz) und einemel der exterene Uhrenquarz?
Irgendwo muss ja der Uhrenquarz definiert werden, so wie der interne Quarz mit $chrystal = 1000000
Oder die Definition ist in der Uhrenroutine hinterlegt, also in $external _soft_clock...


Das bedeutet ja auch, das wenn der Uhrenquarz angeschloßen ist, ich die Schaltung nicht z.B. mit einem extrenen 16MHz betreiben kann, weil ja TOSC1 und TOSC2 (Pin 9 und 10 am ATmega8) besetzt ist nämlich mit dem Uhrenquarz?
Also geht dann nur der interne Quarz mit 1MHz



Ich werde mir später deinen Post in alller aller seelen Ruhe durchlesen und mich dann noch mal melden.
Ich bin mir aber sicher, das mir das schon sehr helfen wird.



Weißt du, als ich nach einem Codeschnipsel gefragt habe und du Nöö nöö nöö gesagt hast :) da wollte ich nciht den Code aus Faulheit haben, ich mein, ich schau mir dann den Code an und versuche da die Logik zu erkennen...
Deshalb finde ich ja Bascom-Code mit den Kommentaren also zum Beispiel: " ' LED fuer Lebenszeichen toggeln" obergeil :)

Vielen Dank nochmal für deine Mühe und bis später, muss jetzt erst mal Kakao trinken gehen :)
 
Warte ma, bevor ich Kaffee trinken gehe, wo ist den dein erwähntes Bascom-Referenz-Buch zu finden?

Konnte nur jenes hier finden, aber da steht nicht unter 6.99 (Seite 160) etwas über CONFIG CLOCK...
 
Hi mohi,

deinen ganzen Text hab ich jetzt noch nicht gelesen ... kommt gleich ion Ruhe.

Warte ma, bevor ich Kaffee trinken gehe, wo ist den dein erwähntes Bascom-Referenz-Buch zu finden?
Bascom ist von MCS Electronics also mal auf die Homepage gehen.
Dann unter Downloads >> Bascom >> Bascom-AVR
etwa im unteren Drittel der Seite findes du die PDF-Datei ...
BASCOM-AVR Manual
PDF version of the BASCOM-AVR Help.
This is a 20 MB file. Do not press the PRINT button unless you have a lot of paper.
Die PDF hat 921 Seiten. Es ist jeder Befehl mit einem kleinen Beispiel erklärt. Allerdings alles in Englisch. :p
Die Datei hab ich meißtens neben dem Bascom-Fenster offen um mal schnell nachzuschlagen. Im Bereich "6 BASCOM Language Reference" sind alle Befehle alphabetisch aufgeführt. Ich finde die Doku eigentlich recht gelungen.

EDIT: so weiter gehts ...
Glaube mir, ich hab mir echt Mühe gegeben im Internet entsprechende Infos zu finden...
Gebe mal Sectic in google ein, du wirst nix bzw. fast nix finden!
das Problem ist das man ohne das richtige Stichwort eigentlich entweder zu viel oder garnichts findet. Manchmal kommt man erst durch ein Stichwort in irgendeinem anderen Forum auf die richtige Fährte. Ich hab mal Infos für ein LCD gesucht. Und es gab nix. Selbst stundenlanges suchen half nicht. Erst durch einen Link in einem Forum der auf eine polnische Seite (zum Glück in englisch) verwiesen hat war dann der Knoten geplatzt. Dann hatte ich genug Infos zusammen.

Du hast den Quarz angesprochen, ich bin so froh darüber, ehrlich :)
Wie funktionierten das mit den 32768 HZ Quarz?

Ich kann ja bei $Chrystal nicht 32768 angeben ... Bascom gibt da ein Fehler aus...

Wenn ich dann den Uhrenquarz einbaue, sind dann 2 Quarze aktiv, oder wie? Einmal der Interne (1MHz) und einemel der exterene Uhrenquarz?
Irgendwo muss ja der Uhrenquarz definiert werden, so wie der interne Quarz mit $chrystal = 1000000
Oder die Definition ist in der Uhrenroutine hinterlegt, also in $external _soft_clock...

Das bedeutet ja auch, das wenn der Uhrenquarz angeschloßen ist, ich die Schaltung nicht z.B. mit einem extrenen 16MHz betreiben kann, weil ja TOSC1 und TOSC2 (Pin 9 und 10 am ATmega8) besetzt ist nämlich mit dem Uhrenquarz?
Also geht dann nur der interne Quarz mit 1MHz
Der Mega8 ist für die Uhrenanwendung eher suboptimal. Er geht. Das Problem ist aber das er gegenüber einem Mega16/32/8535/... (einem 40poligen Atmel) keine eigenen Pins für XTAL1/2 und TOSC1/2 hat. Wichtig ist, das du dir für den Überblick über die Hardware die Datenblätter ziehst. Nimm die großen Dateien und nicht die Summary. Nur in den großen steht wirklich das drin was man über die einzelnen Komponenten im Atmel wissen muß.

Aber zurück zu den Pins ...

Beim Mega8 ist ....
(XTAL1/TOSC1) PB6 auf Pin 9 und
(XTAL2/TOSC2) PB7 auf Pin 10.
du hast also keine getrennten Pins für den Systemquarz und den Uhrenquarz. Beim Mega32 zB sieht es so aus ...
XTAL2 auf Pin 12 ,
XTAL1 auf Pin 13 ,
PC7 (TOSC2) auf Pin 29 und
PC6 (TOSC1) auf Pin 28
Man kann bei den 40poligen also die CPU mit zB 16MHz laufen lassen und trotzdem den Oszillator für den Timer2 asynchron (unabhängig vom Systemtakt) mit den 32kHz betreiben. Beim Mega8 kannst du nur den CPU-Takt auf den internen Oszillator (internal RC-Oszillator) mit maximal 8MHz laufen lassen. Dann sind die Pins frei für den 32kHz Uhrenquarz. Wie du siehst sollte man sich bei der Planung eines Projektes vorher so seine Gedanken über die Belegung der Pins und die Verteilung der Hardware am Atmel und die benötigte Controller-Größe machen. Aber fürs erste kommst du mit dem Mega8 eigentlich schon recht weit.

Ach ja ... die Datenblätter findest du natürlich auf www.atmel.com (wo sonst) und dann bei ...
Products (oben) >> Mikrocontrollers >> Atmel AVR 8- and 32-bit
dann links im grauen Feld auf "megaAVR" Dort kannst du dir den gewünschten Typ raussuchen. Wenn du draufgeklickt hast dann findest du im Reiter "Documents" die Datenblätter und alle Infos die sich mit dem Typ befassen.
Laß dich nicht von der Größe der ausführlichen Datenblätter abschrecken. Es ist alles recht sortiert darin abgelegt. Du brauchst meißtens nur ein Kapitel oder wenige Teile daraus. Das schöne sind die Blockschaltbilder die dir die internen Abläufe im Controller zeigen. Die sind für mich immer die wichtigste Hilfe für das Verständnis der Funktion. Noch was ... Die Beispiele sind nur in Assembler und C. Bei manchen Controllern sind die Beispiele aber leider falsch. Da stimmen die Registerbezeichnungen nicht oder die Register lassen sich nicht wie im Beispiel ansprechen. Die richtigen Registernamen findest du aber immer hinten in der "Register-Summary" des Datenblattes. Der Bereich ist auch sehr wichtig neben den Pin-Bezeichnungen am Anfang und den zugehörigen Erklärungen.

Gruß
Dino
 
Hallo Dino,
ok, vom Grundprinzip hab ich so ungefähr verstanden.
Durch den Debounce-Befehl hast du jeden der drei Tastern einen Label zugewiesen, nämlich Zeit_stelle, Zeit_minus und Zeit_plus.

Drücke ich auf Taster "Zeit_stelle" dann jumpt der zu dem Label "Zeit_stelle:" (was nach dem Endbefehl geschrieben steht) und führt die Anweisung durch.

Ok, unter "Zeit_stelle:" steht Menu_homecnt, da sagt mir Bascom beim Codecheck, das Error : 46 stattgefunden hat. Assigment error [MENU_HOMECNT: 0 10:112]


Und noch was ist folgendes:
Code:
  ' 0 Ruheposition
  ' 1 Sekunden
  ' 2 Minuten
  ' 3 Stunden
  ' 4 Tag
  ' 5 Monat
  ' 6 Jahr
  ' 7 Zeit speichern/laden
  ' 8 Initialisieren
relevant fürs Code?
Ich dachte, dass wenn ein ' vor einem Befehl/Text steht, das diese dann von Bascom ignoriert wird…
Warum ich frage, weil Bascom beim Code auch hier einen Fehler angezeigt hat… Hat mich etwas verwirrt :)


Kannst du mir auch noch mal ganz kurz die Logik von folgendem Erklären:
Code:
    Case 2
      Lcd "Min  --  ++ ";
Für mich bedeutet das, das auf dem LCD-Display folgendes erscheint: "Min -- ++", sehe ich das so richtig?

Und falls es dich brennend interessiert wie mein Code bis jetzt aus sieht, hier hast du die Gelegenheit zum Code sichten:
Code:
'_________________________ CONTROLLER-KONFIG ___________________________________

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

'_________________________ 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
Config Lcdbus = 4
Config Lcdmode = Port
Initlcd
Display On
Waitms 400


' =============================================================================
' ===== 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


'_________________________ Variablen ___________________________________________

'Dim _sec As Word
'Dim _min As Word
'Dim _hour As Word
Dim Sec_s As String * 2
Dim Min_s As String * 2
Dim Std_s As String * 2


'_________________________ Taster: Zeit stellen ________________________________
Config Pind.5 = Input
Portd.5 = 1
Taster1 Alias Pind.5

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

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




Do
' ===== Uhrzeit mit Taster einstellen =====
Debounce Pind.5 , 0 , Zeit_stelle , Sub                     ' Taster 1
Debounce Pind.6 , 0 , Zeit_minus , Sub                      ' Taster 2
Debounce Pind.7 , 0 , Zeit_plus , Sub                       ' Taster 3
' ===== Uhrzeit einstellen Ende=====


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

  Sec_s = Str(_sec)                                         'Sec_s ist nun die Variable für _sec
  Sec_s = Format(sec_s , "00")
  Min_s = Str(_min)
  Min_s = Format(min_s , "00")
  Std_s = Str(_hour)
  Std_s = Format(std_s , "00")

  Lcd Date$ ; " " ; Std_s ; ":" ; Min_s ; ":" ; Sec_s

End If
' ===== SECTIC-Zeilen Ende =====

Locate 1 , 1
Lcd Std_s
Locate 1 , 3
Lcd ":"
Locate 1 , 4
Lcd Min_s
Locate 1 , 6
Lcd ":"
Locate 1 , 7
Lcd Sec_s

Cursor Off Noblink
Waitms 50

Loop

End


' =============================================================================
' ===== Service-Routine sectic wird automatisch jede Sekunde ausgeführt. ======
' =============================================================================
Sectic:
  Toggle Portb.0                                            ' 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
  ' 0 Ruheposition
  ' 1 Sekunden
  ' 2 Minuten
  ' 3 Stunden
  ' 4 Tag
  ' 5 Monat
  ' 6 Jahr
  ' 7 Zeit speichern/laden
  ' 8 Initialisieren
  If Zeit_pos > 8 Then
    Zeit_pos = 0
  End If
  Locate 4 , 5
  Select Case Zeit_pos
    Case 0
      Lcd "Uhr  ..  .. ";
    Case 1
      Lcd "Sec  00  30 ";
    Case 2
      Lcd "Min  --  ++ ";
    Case 3
      Lcd "Std  --  ++ ";
    Case 4
      Lcd "Tag  --  ++ ";
    Case 5
      Lcd "Mon  --  ++ ";
    Case 6
      Lcd "Jahr --  ++ ";
    Case 7
      Lcd "RTC  Ld  St ";
    Case 8
      Lcd "Init HCk SCk";
  End Select
Return

Zeit_minus:
Return

Zeit_plus:
Return

Aber bitte lach nicht, ok? :)

Schönen Sonntag dir...
 
Hi,

Hallo Dino,
ok, vom Grundprinzip hab ich so ungefähr verstanden.
Durch den Debounce-Befehl hast du jeden der drei Tastern einen Label zugewiesen, nämlich Zeit_stelle, Zeit_minus und Zeit_plus.
noch nicht ganz ... was heißt "bounce" ? ... => "springen". Also was heißt "debounce" ? => "nicht springen".
Der Befehl DEBOUNCE verhindert also das dein Programm das Kontaktprellen als mehrere Tastendrücke mitbekommt. Das macht der Befehl primär und ist sein eigentlicher Zweck. Das mit dem Label ist absolut sekundär. Und wichtig ist bei mir das "Sub" am Ende.

Drücke ich auf Taster "Zeit_stelle" dann jumpt der zu dem Label "Zeit_stelle:" (was nach dem Endbefehl geschrieben steht) und führt die Anweisung durch.
Nein. Er jumpt nicht sondern er macht ein Gosub zu dem Label. Darum das "Sub". Sonst würdest du nicht mehr aus der aufgerufenen Subroutine zurückkommen. Steht aber alles in der "Bascom-Referenz" (die 20MB PDF).

Ok, unter "Zeit_stelle:" steht Menu_homecnt, da sagt mir Bascom beim Codecheck, das Error : 46 stattgefunden hat. Assigment error [MENU_HOMECNT: 0 10:112]

EDIT: OK ... da hab ich mich wohl zwischen den Threads leicht verwickelt ;) ...
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
tja ... warum wohl :rolleyes: ... hast du in meinem Beispielcode mal nachgesehen wo das "Menu_homecount" überall steht, was es ist und was es bezwecken soll ? Warum setze ich es auf 10 ? Ließ mal meine Bemerkung hinter der Zeile und sieh dir mal den Teil in meiner Hauptschleife an der durch die Sectic (über das Flag Newsec) aktiviert wird dann wirst du darauf kommen. Ich geb zu das mein Beispielcode nicht grade kurz ist. Aber die dafür entscheidenden Teile sind eigentlich recht gut erklärt. Sieh auch mal ganz an den Anfang meines Beispielcodes. Darauf solltest du eigentlich recht einfach kommen da es sonst eher nicht nach verstanden sondern nach "copy/paste" aussehen würde :p
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
... bei diesem hab ich ja lediglich Ausschnitte aus dem Beispielcode reingestellt ... ups ... nix für ungut.

Also nochmal ...
Was sagt die Zeile ...
"Menu_homecnt = 10 ' Auto-Home auf 10 Sekunden setzen" ???
Einer Variablen wird ein Wert zugewiesen. Was passiert wenn du eine Variable verwendest die du vorher nicht mit DIM angelegt hast ? ... ;)
Schmeiß die Zeile bei dir einfach mal raus dann ist der Fehler weg. Die Funktion ist bei dir im Code sowieso nicht reingebaut. Ich schau nochmal ein wenig über den Code ...

EDIT2 : Setz mal das "Enable Interrupts" kurz vor das "Do" der Hauptschleife. Dann läuft deine Initialisierung noch ohne Interrupts durch. Dann ganz wichtig ... setz mal den Bereich von "Locate 1,1" bist "Lcd Sec_s" an das Ende des "If Newsec"-Blockes vor das EndIf (also innen rein sonst ändert sich ja nix. Dann laß das leidige "Waitms 50" weg. Das frißt nur Prozessorzeit und lösch auch gleich das "Cursor Off Noblink". Das muß man dem Display auch nicht dauernd sagen. Beim Autofahren drehst du während der Fahrt ja auch nicht dauernd am Zündschlüssel um sicherzugehen das der Motor noch läuft :rolleyes: Tja ... beim Zeit_minus und Zeit_plus muß jetzt noch was mit Wirkung rein ;) ... Ein paar Kleinigkeiten sind selbstgestrickt aber irgendwie sieht es doch stark nach "Copy/paste" aus :rolleyes: ... OK ... ich würde mal sagen ... probier mal ein wenig rum, spiel mal etwas mit der Basis, laß mal ein paar der Variablen auf dem LCD anzeigen um zu sehen was innen im Programm drin passiert. Motto ist also : Probieren und spielen, sehen was passiert und Rückschlüsse ziehen warum es so passiert. (Die was passiert dann Maschine)

Gruß
Dino
 
Mooooment mal :)
Spaß nee aber ehrlich jetzt: Der ausgeschrieben Befehl heißt ja "Debounce Pind.5 , 0 , Zeit_stelle , Sub".
Das Debounce in erster Linie fürs entprellen ist, hab ich ja auch ganz am Anfang schon erwähnt, aber danach steht ja Zeit_stelle tja und danach steht sub...
OK ok ok was du gesagt hast klingt einleuchtend :)

Also im Code steht das Menu_homecount nur ein einziges... nämlich in Zeit_Stelle:
Und klar habe ich gelesen das da Autohome nach 10 Skunden steht, aber was soll das?
Das er nach 10 Sekunden nach Autohome geht? Wo ist Autohome?

Guck mal, ne ganze doofe Sache, wenn ich schreibe:

Do
PortB.1 = 1
Waitms 50
PortB.1 =0
Waitms 50
Loop

Dann ist mir alles glas klar, und logisch obendrein, aber wenn ich im gesamten Code dann nur einmal Home_cnt lese und dahinter steht Auto-Home nach 10 Sek, dann kann ich noch soviel darüber grübeln, ich komm einfach nicht auf des Rätsels Lösung..

Ich kenn mich halt kaum mit Programmierung aus, aber ich habe große Lust es auch zu können, so wie du...
ISt doch total geil, wenn man eine SChaltung bastelt und daruf losprogrammieren kann, ohne tausendmal im Forum nach zu fragen...
Macht mir eigentlich so keinen Spaß! Aber die Mictocontrollerwelt ist einfach zu interessant als das ich mir ein neues Hobby suchen könnte.

(Hab ich in einem anderen Forum mal gelesen, da hat einer ein ähnliches Problem wie ich gehabt und dann hat man ihm nahe gelegt sich ein neues Hobby zu suchen... Ich will aber nicht!!!)

Und na klar habe ich viel copy/paste gemacht, aber nicht NUR copy/paste!!! ;-)



Ok, zurück zum Thema:

Home_cnt müsste ich noch als Variable deklarieren, oder? Oder es ist in der Softclock hinterlegt.. Ne kann nicht sein, sonst müsste es ja auch im Referenzbuch stehen...

Locate 4 , 5 kann nicht ganz richtig sein, weil ja mein Display nur zwei Zeilen hat, richtig?
Wenn dann müsste es heißen Locate 1 , 5, also erste Zeile, fünfte Stelle...


Ok, ich werd nochmal mein Glück versuchen...
Bis denne
 
Mooooment mal :)
Spaß nee aber ehrlich jetzt:
Nicht ärgern ;) ich hab da deinen und nen anderen Thread im Kopf etwas verwürfelt (ich lese zu viel) :eek: :rolleyes:
Ich hab den fehlerhaften Textbereich jetzt zwischen die Strichel-Linien gesetzt und noch was unten druntergeschrieben.

Heute werde ich wohl nicht mehr viel im Forum sein ( gibt gleich Kuchen ;) ) Also genug Zeit um mal mit den Befehlen rumzuspielen.

Gruß
Dino
 
Also nochmal ...
Was sagt die Zeile ...
"Menu_homecnt = 10 ' Auto-Home auf 10 Sekunden setzen" ???
Einer Variablen wird ein Wert zugewiesen. Was passiert wenn du eine Variable verwendest die du vorher nicht mit DIM angelegt hast ? ...
Schmeiß die Zeile bei dir einfach mal raus dann ist der Fehler weg. Die Funktion ist bei dir im Code sowieso nicht reingebaut. Ich schau nochmal ein wenig über den Code ...

Ganz genau, genau das war meine Denke, mir hat da oben in der Variablen-Abteilung (des Codes) was gefehlt, aber schön das du das noch mal gesagt hast!!!
Wäre die Variabe ein "Byte", also "Dim Menu_homecnt as Byte"?


Der Code ist nun Fehlerfrei und hab den ATmega damit geflasht...
Zwar zeigt mir mein LCD Kauderwelch an, aber durch den Taster1 (Menu) konnte ich sehen wie das mit Case funktioniert :)
Den jedesmal wenn ich auf Taster1 drücke, wechselt er ins nächste Case, also von Case 0 bis Case 8...

Hab ich das richtig verstanden, das die ersten beiden Stellen im Display also 1,1 und 1,2 für die Uhrzeit/Datum Eingabe ist? und ab dem dritten Zeichen steht dann jeweils das was in den einzelnen Cases in LCD steht, stimmt's??


Ok, nun muss ich noch beide Subroutinen Zeit_minus und Zeit_plus in definieren, dann dürfte das gröbste erledigt sein...
Ok, jetzt ist der Motor angesprungen, mich kann keiner aufhalten, nur die weibaz :)))

(Kennste des Lied?? Wenn nicht, gib ma in Youtube "nur die weibaz" ein. Ist ein Aso-Lied aber ganz lustisch :))
 
Mooooment mal :)
Spaß nee aber ehrlich jetzt:
Nicht ärgern ich hab da deinen und nen anderen Thread im Kopf etwas verwürfelt (ich lese zu viel)
Ich hab den fehlerhaften Textbereich jetzt zwischen die Strichel-Linien gesetzt und noch was unten druntergeschrieben.

Heute werde ich wohl nicht mehr viel im Forum sein ( gibt gleich Kuchen ) Also genug Zeit um mal mit den Befehlen rumzuspielen.

Gruß
Dino


Mach dir keine Sorgen, ich ärgere mich schon nicht im Gegenteil! Ich hab viel Faxen im Kopf und mit Humor geht alles eh super easy ;-)

Kuchen gibts??? Asrchcoole Sache!!
Mein absoluter Favorit, der Klassiker Marmorkuchen mit einem Glas kühle (nicht eiskalte!) Milch, der Hammmer!!!!!!!!! ;-)

Ja genieß dein Sonntag und fühle dich frei, aber lass mich bitte net im Stich :)
Und ja ich guck mir auf jjjeden Fall nochmal unsere Posts ganz genau an...


Vielen Dank Dino, wirklich! Ich weiß das zu schätzen!
Bis denne...

mohi
 
Hi,

Hab ich das richtig verstanden, das die ersten beiden Stellen im Display also 1,1 und 1,2 für die Uhrzeit/Datum Eingabe ist? und ab dem dritten Zeichen steht dann jeweils das was in den einzelnen Cases in LCD steht, stimmt's??

Ok, nun muss ich noch beide Subroutinen Zeit_minus und Zeit_plus in definieren, dann dürfte das gröbste erledigt sein...
Ok, jetzt ist der Motor angesprungen, mich kann keiner aufhalten, nur die weibaz :)))
nicht ganz. Ich zeige immer nur die aktuelle Zeit an. Also mit +/- wird direkt die grade laufende Zeit geändert und sofort angezeigt. Das was geändert werden kann wird über "Min ++ --" , "Std ++ --" , ... angezeigt. Es blinkt nix und es ist nichts unterstrichen. Also ganz einfach gehalten. Du kannst es aber gerne aufhübschen :p :rolleyes:

:offtopic:
Zum Lied ... naja ... bin eher aus der Generation Techno. Ich hab Scooter und MarkOh (wenn du die noch kennst, das waren die bekannteren) noch alleine mit Keyboard rumtingeln gesehen. Hanomag Hannover, All Area Rave :cool: ... Youtube - Hanomag Hannover ...Original>> http://www.youtube.com/watch?v=DecwBxELQ74&feature=related ... Revival >> http://www.youtube.com/watch?v=i_UI_CARlJg das waren noch Zeiten ... :rolleyes:
 
Also die Uhr hat die ganze Zeit quatsch angezeigt.
Hab erstmal den Quarz auf Intern 1MHz umgestellt und auf Pin 9 und 10 des Atmega8 den Uhrenquarz gesteckt.

Irgendwie hat mir dann das LCD zwei mal die Uhrzeit angezeigt, also habe ich "LCD Time$ ; " "...." ausgehochkommat, also mit einem ' davor und siehe da, nun zeigt mir das LCD die korrekte Zeit an, beginnend bei 00:00:00... :)

Inspriert durch den Erfolg, hab ich mich gleich mal ans Datum setzen gemacht und ich hab im Referenzbuch :) nach geschaut wie die Variablen heißen, diese habe ich nun in den Code eingebaut und zwar genau eine Zeile darunter...

Nun Zeigt mir das LCD ab Position 1,1 die Uhrzeit an, mit 00:00:00 und ab Position 2,1 mit 00.00.00 das Datum an.

Und die LED blinkt auch im Sekundentakt an und aus. Wie schön das aussieht... :)


Sag mal, wie kann ich der Uhrzeit/Datum einen Wert zu weisen?
Also mit Min_s = "12" kann man zwar die Minute auf 12 stellen, aber der Wert ist dann statisch, also nach 10 Minuten Laufzeit zeigt die Uhr dann immer noch 12 Minuten an...

Ich werd noch etwas rumexperimentieren und mich dann noch mal melden.
HAb noch nicht jeden Punkt deiner Post durchgearbeitet, aber bis Morgen denke ich schon...

So sieht der Code im Moment 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
Config Lcdbus = 4
Config Lcdmode = Port
Initlcd
Display On
Waitms 400


' ===== 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


'_________________________ Variablen ___________________________________________

Dim Sec_s As String * 2
Dim Min_s As String * 2
Dim Std_s As String * 2
Dim Day_s As String * 2
Dim Mon_s As String * 2
Dim Year_s As String * 2
Dim Menu_homecnt As Byte
Dim Zeit_pos As Integer

'_________________________ Taster: Zeit stellen ________________________________
Config Pind.5 = Input
Portd.5 = 1
Taster1 Alias Pind.5

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

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

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


Cls

Do

' ===== Uhrzeit mit Taster einstellen ==========================================
Debounce Pind.5 , 0 , Zeit_stelle , Sub                     ' Taster 2
Debounce Pind.6 , 0 , Zeit_minus , Sub                      ' Taster 3
Debounce Pind.7 , 0 , Zeit_plus , Sub                       ' Taster 4
' ===== Uhrzeit einstellen Ende ================================================


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

  Sec_s = Str(_sec)                                         ' Sec_s ist nun die Variable für _sec
  Sec_s = Format(sec_s , "00")
  Min_s = Str(_min)
  Min_s = Format(min_s , "00")
  Std_s = Str(_hour)
  Std_s = Format(std_s , "00")

  Day_s = Str(_day)
  Day_s = Format(day_s , "00")
  Mon_s = Str(_month)
  Mon_s = Format(mon_s , "00")
  Year_s = Str(_year)
  Year_s = Format(year_s , "00")

'  Lcd Time$ ; " " ; Std_s ; ":" ; Min_s ; ":" ; Sec_s

End If

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

Locate 1 , 1
Lcd Std_s
Locate 1 , 3
Lcd ":"
Locate 1 , 4
Lcd Min_s
Locate 1 , 6
Lcd ":"
Locate 1 , 7
Lcd Sec_s

Locate 2 , 1
Lcd Day_s
Locate 2 , 3
Lcd "."
Locate 2 , 4
Lcd Mon_s
Locate 2 , 6
Lcd "."
Locate 2 , 7
Lcd Year_s

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 , 1
  Select Case Zeit_pos
    Case 0                                                  ' 0 Ruheposition
      Lcd "Uhr  ..  .. ";
    Case 1                                                  ' 1 Sekunden
      Lcd "Sec  00  30 ";
    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 "RTC  Ld  St ";
    Case 8                                                  ' 8 Initialisieren
      Lcd "Init HCk SCk";
  End Select
Return

Zeit_minus:
Return

Zeit_plus:
Return

Schönen Abend noch...
 
Sag mal, wie kann ich der Uhrzeit/Datum einen Wert zu weisen?
Also mit Min_s = "12" kann man zwar die Minute auf 12 stellen, aber der Wert ist dann statisch, also nach 10 Minuten Laufzeit zeigt die Uhr dann immer noch 12 Minuten an...
warum nimmst du nicht die Variablen der Softclock (_sec, _min, ...) und änderst da die Werte (+/-) ? Die sind doch die Basis für alles (die Wurzel). Alles andere wird aus diesen Variablen berechnet.

Gruß
Dino
 
warum nimmst du nicht die Variablen der Softclock (_sec, _min, ...) und änderst da die Werte (+/-) ? Die sind doch die Basis für alles (die Wurzel). Alles andere wird aus diesen Variablen berechnet.

Gruß
Dino

Weil ich nicht weiß, wie ich das in einen Case ein packen soll...

Also ich muß ja zwischen "Zeit_plus:" und "Return" irgendwas reinschreiben so nach dem Motto: Wenn die Stelle blinkt und Taster1 gedrückt wird, das ein incr statfinden.

Und da mus sich halt mal schauen, wie ich das in einem Code verpacken tue...

Dasselbe spiel dann mit "Zeit_minus:" dann wahrscheinlich mit decr :))


Muss ich ma gucken, wie ich des gebacken kriege...
Meld mich dann nochmal...
 
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)