Probleme mit Bascom Wecker mit LCD-Display mit einem ATmega8

Status
Für weitere Antworten geschlossen.
Zeit_pos ist doch die Variable, die die entsprechende Stelle editierbar macht, oder?

Wenn ja, dann müsste ich doch sowas wie "If taster = 1 then incr zeit_pos" oder "If Taster = 1 then Zeit_pos = Zeit_pos + 1" in einen Case packen.

Und wenn ZEit_pos nicht für die editierbare Stelle steht, dann müsste ich eine solche Variable erstellen, gell?
 
Hi,

Zeit_pos ist doch die Variable, die die entsprechende Stelle editierbar macht, oder?

Wenn ja, dann müsste ich doch sowas wie "If taster = 1 then incr zeit_pos" oder "If Taster = 1 then Zeit_pos = Zeit_pos + 1" in einen Case packen.
ich hab was fallen gehört ... :cool: muß nen Groschen gewesen sein ;) (hoffe ich jetzt mal)

Du rufst mit dem Debounce vom Plus-Taster ja eine Subroutine auf. Da ist nen Select/Case mit der Zeit_pos drin. Der Wert dieser Variable sagt dir dann was zu ändern ist. In dem entsprechenden Case-Abschnitt wird dann die entsprechende Stelle +1 gemacht und auf Überlauf getestet. Also bei Stunden zB bei über 23 auf 0 setzen.

Beim Debounce vom Minus-Taster wird vergleichbares gemacht. Nur da wird dann runtergezählt.

Gruß
Dino
 
Ja der Groschen ist zwar gefallen aber noch nicht so richtig...
Nach dem was du aber sagst, scheine ich ja schonmal auf dem richtigen Weg zu sein, juhuuu :)


Ok, die Subroutine für den Plustaster lautet bei mir: Debounce Taster_p , 0 , Zeit_plus , Sub, also Zeit_plus und mit Taster_p rufe ich die Subroutine Zeit_plus ab.
Also wenn ich auf Taster_p drücke, dann geht er runter zu dem Abschnitt:

Code:
Zeit_plus:
Return

und dazwischen muss ich dann reinschreiben:

Code:
Zeit_plus:
Select Case Zeit_pos
   Case 0
   If Taster_p = 1 Then
   Incr Zeit_pos
   End If
   End Select
Return

Also so geht es schonmal nicht! Obwohl ich ja schon damit gerechnet habe, das es funktioniert... einfach den Wert von Zeit_pos um eins erhöhen je Tastdruck...

Muss ich nochmal gucken...
Also eins kann ich dir sagen, soooo einfach ist das alles nicht...






Hier nochmal der ganze Code.
Ist dieser Code so ok, ich meine siehst du irgendwo schwere Fehler?

Code:
'_________________________ CONTROLLER-KONFIG ___________________________________

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


'_________________________ LCD-Display Einstellungen ___________________________

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


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

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


'_________________________ Variablen ___________________________________________

Dim Menu_homecnt As Byte
Dim Zeit_pos As Integer


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

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

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

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


Time$ = "23:59:55"                                          'Setzen auf Startwert
Date$ = "29.02.12"                                          'Setzen auf Startwert

Do

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


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


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

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

Cursor Off Noblink
Waitms 50

Loop

End


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


' =============================================================================
' ===== Stelle waehlen ========================================================
' =============================================================================
Zeit_stelle:
  Menu_homecnt = 10                                         ' Auto-Home auf 10 Sekunden setzen
  Incr Zeit_pos                                             ' Position +1
  If Zeit_pos > 8 Then
    Zeit_pos = 0
  End If
  Locate 2 , 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_plus:
Return


Zeit_minus:
Return
 
Hi,

Ja der Groschen ist zwar gefallen aber noch nicht so richtig...
Nach dem was du aber sagst, scheine ich ja schonmal auf dem richtigen Weg zu sein, juhuuu :)
er klemmt noch ein wenig ;)

Ok, die Subroutine für den Plustaster lautet bei mir: Debounce Taster_p , 0 , Zeit_plus , Sub, also Zeit_plus und mit Taster_p rufe ich die Subroutine Zeit_plus ab.
Also wenn ich auf Taster_p drücke, dann geht er runter zu dem Abschnitt:

Code:
Zeit_plus:
Return

und dazwischen muss ich dann reinschreiben:

Code:
Zeit_plus:
Select Case Zeit_pos
   Case 0
     [B]If Taster_p = 1 Then
       Incr Zeit_pos
     End If[/B]
   End Select
Return
warum machst du das ?


Also so geht es schonmal nicht! Obwohl ich ja schon damit gerechnet habe, das es funktioniert... einfach den Wert von Zeit_pos um eins erhöhen je Tastdruck...

Muss ich nochmal gucken...
Also eins kann ich dir sagen, soooo einfach ist das alles nicht...
das es nicht gehen kann sehe ich schon an der Routine Zeit_plus.
Aber es ist sooo einfach ;)

Also deine Routine für die zu stellende Position paßt ja und funktioniert auch ;)
- Du drückst auf Taster_s (Pind.5) und rufst damit die Subroutine Zeit_stelle auf
- In der Subroutine wird bei jedem Aufruf (Tastendruck) die zu stellende Position um eins weitergerückt.
- Die Routine liefert dir in Zeit_pos die Position die du ändern möchtest.

Deine Routine Zeit_plus soll die Zeit/Datum verändern. Warum veränderst du dann nicht die Zeit/Datum ?
- Du drückst auf Taster_p (Pind.6) und rufst damit die Subroutine Zeit_plus auf (OK)
(du willst dem Atmel mit dem Tastendruck sagen : mach mal zu den Minuten, Stunden, ... ein dazu)
- Die zu stellende Position wird durch die Variable Zeit_pos geliefert. (OK)
- Wenn die Routine aufgerufen wird dann muß ja der Taster gedrückt worden sein. Warum nochmal prüfen ?
- In der Subroutine wird bei jedem Aufruf (Tastendruck) die entsprechende Stelle der Zeit/Datum +1 gemacht. Warum änderst du die nicht ?
- Die entsprechende Stelle prüfen ob da nicht auf einmal 61 Minuten oder 25 Stunden drinstehen (Überlauf bearbeiten)


Denk das fette nochmal durch und dann aber los ...
Wenn ich noch mehr Tips gebe dann muß ich dir fertigen Code liefern :rolleyes: Zwischenschritte gibts da eigentlich nicht mehr. Das ist jetzt der Wink mit dem Balken ;)

Gruß
Dino
 
dino03 schrieb:
Hi,
mohi schrieb:
Ja der Groschen ist zwar gefallen aber noch nicht so richtig...
Nach dem was du aber sagst, scheine ich ja schonmal auf dem richtigen Weg zu sein, juhuuu :)
er klemmt noch ein wenig ;)
Aber frag nicht wie!
Sehr cool von dir, das du das wenigstens mit Humor siehst! :)
Hättest mich ja auch fertig machen können, wie es in unzähligen anderen Foren üblich ist...

Aber wie heißt es so schön:
Humor und Geduld sind zwei Kamele, mit denen du durch jede Wüste kommst... :D

Vielen Dank Dino, ganz ehrlich, ich weiß deine Geduld mit mir zu schätzen!!




dino03 schrieb:
mohi schrieb:
mohi Beitrag anzeigen
Ok, die Subroutine für den Plustaster lautet bei mir: Debounce Taster_p , 0 , Zeit_plus , Sub, also Zeit_plus und mit Taster_p rufe ich die Subroutine Zeit_plus ab.
Also wenn ich auf Taster_p drücke, dann geht er runter zu dem Abschnitt:

Code:
Zeit_plus:
Return
und dazwischen muss ich dann reinschreiben:

Code:
Zeit_plus:
Select Case Zeit_pos
   Case 0
     If Taster_p = 1 Then
       Incr Zeit_pos
     End If
   End Select
Return
warum machst du das ?

Ich mache das, damit wenn ich auf Taster_p (also für Plus) drücke, die Routine Zeit_plus abgerufen wird.
Und in der Routine Zeit_plus steht, das wenn ich auf Taster_p drücke (also = 1), der Inhalt von Zeit_pos um eins erhöht werden soll...

Das passt ja offensichtlich nicht :(
Aber komm gib's zu, es klingt schon logisch, oder? :D



dino03 schrieb:
Also deine Routine für die zu stellende Position paßt ja und funktioniert auch ;)
- Du drückst auf Taster_s (Pind.5) und rufst damit die Subroutine Zeit_stelle auf
- In der Subroutine wird bei jedem Aufruf (Tastendruck) die zu stellende Position um eins weitergerückt.
- Die Routine liefert dir in Zeit_pos die Position die du ändern möchtest.

Deine Routine Zeit_plus soll die Zeit/Datum verändern. Warum veränderst du dann nicht die Zeit/Datum ?
- Du drückst auf Taster_p (Pind.6) und rufst damit die Subroutine Zeit_plus auf (OK)
(du willst dem Atmel mit dem Tastendruck sagen : mach mal zu den Minuten, Stunden, ... ein dazu)
- Die zu stellende Position wird durch die Variable Zeit_pos geliefert. (OK)
- Wenn die Routine aufgerufen wird dann muß ja der Taster gedrückt worden sein. Warum nochmal prüfen ?
- In der Subroutine wird bei jedem Aufruf (Tastendruck) die entsprechende Stelle der Zeit/Datum +1 gemacht. Warum änderst du die nicht ?
- Die entsprechende Stelle prüfen ob da nicht auf einmal 61 Minuten oder 25 Stunden drinstehen (Überlauf bearbeiten)


Denk das fette nochmal durch und dann aber los ...
Wenn ich noch mehr Tips gebe dann muß ich dir fertigen Code liefern :rolleyes: Zwischenschritte gibts da eigentlich nicht mehr. Das ist jetzt der Wink mit dem Balken ;)

Gruß
Dino


Bitte denke nicht, das ich will, das du den Code komplett für mich schreibst!
Du sagst ja selber, das es nur ein paar Zeilen noch sind! Und sooo faul bin ich auch nun wieder nicht ein paar Zeilen zu tippen, aber ich hab da echt ne lange Leitung.
Edison hat ma gesagt: Jedes gelöste Problem ist einfach.

Ich bin mir sicher, wenn ich den Code fertig habe, das ich mich in Grund und Boden schämen würde, weils halt doch super einfach ist, so wie du es gesagt hast :)


Ok, kommen wir nochmal aufs wesentliche zurück:

Mit der Routine Zeit_stelle, schiebe ich doch jede Stelle (je nach Tastendruck von PD.5) in die Variable Zeit_pos, richtig?
Das bedeutet, jedesmal, wenn ich auf Taster_s drücke, wird der Inhalt der Variable um einen Case verschoben, nämlich um die Case's die in der Routine Zeit_stelle: hinterlegt sind.

Also muss ich doch schreiben, If Taster_p = 1 Then Incr Zeit_pos, dass muß so einfach funktionieren! Es muß...

Ich muß also die Routine Zeit_plus: folgendes schreiben:
Code:
Zeit_plus:                             ' Wenn ich auf Taster_p jumpt er zu der "Zeit_stelle:"-Routine
Select Case Zeit_pos                   ' Hier wird die Variable ins Case geschoben 
Case 3                                 ' Case 3 da wurde durch das 3malige drücken auf Taster_s die Variable Zeit_pos 
If Taster_p = 1 Then                   ' Hier wird der Wert der gerade in Zeit_pos drinne ist um eins increased, also erhöht
Incr Zeit_pos                          ' Bei Minus nehme ich glas klar Decr
End if
End select
Return

Du schreibst: - Wenn die Routine aufgerufen wird dann muß ja der Taster gedrückt worden sein. Warum nochmal prüfen ?
Wo überprüfe ich den was? Ich überprüfe doch nix, zumindest nicht bewusst...


Den Überlauf zu programmieren, ist das kleiner Problem bei mir, habe ich es erst mal geschafft mit Taster_p den Jeweiligen Wert zu ändern, dann schaff ich den überlauf auch ganz alleine (mein Wort in Gottes Ohr :))

Nochmal ne doofe Frage: Was macht Menu_homecnt eigentlich? Du hast den Wert auf 10 gesetzt... Auto-Home alle 10 Sekunden, was bedeutet das?


Schade, das es in der Volkshochschule keinen Bascom-Kurs gibt!
Programmierung nur durch lesen zu erlernen ist wesentlich schwieriger, als zwischendurch auch mal darüber zu reden...
 
Wie sind die Taster eigentlich angeschlossen? Wie wertest Du sie aus? Irgendwo weiter oben war Code in etwa in der Form:
-setze Bein als Eingang
-setze Bein auf "high" - da eingang über Pullup
somit liest Du immer eine 1 es sei denn, Du schließt einen Taster etc. gegen Gnd.

P.S.: vielleicht hast Du die Möglichkeit, beim Stammtisch vorbeizuschauen...?
 
Also die Taster sind wie folgt angeschloßen:

PD.5 --> Taster --> GND
PD.6 --> Taster --> GND
PD.7 --> Taster --> GND

PD.5 funktioniert ja auch bei mir, also drücke ich drauf, wird in der zweite Zeile immer das ausgegegeben, was in den einzelnen Cases der Routine Zeit_stelle: hinterlegt ist. Z.B. "Min -- ++"


Hier nochmal der Code-Teil, der die Taster betrifft:
Code:
'_________________________ 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

Do

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


Stammtisch?
Hmmm, eher nicht, ist ja da oben bei Hannover, von mir aus gute 350 Km entfernt :(
 
Moin,

so ... Kaffe für Frühstück läuft noch durch ... ;)

Ich mache das, damit wenn ich auf Taster_p (also für Plus) drücke, die Routine Zeit_plus abgerufen wird.
Und in der Routine Zeit_plus steht, das wenn ich auf Taster_p drücke (also = 1), der Inhalt von Zeit_pos um eins erhöht werden soll...

Das passt ja offensichtlich nicht :(
Aber komm gib's zu, es klingt schon logisch, oder? :D
nein. Es ist nicht logisch ...

Debounce prüft den Taster und verzweigt wenn er gedrückt wurde in die entsprechende Routine. Er MUSS also gedrückt worden sein wenn du in der Routine landest. Das ist so als wenn du ne Kerze anzündest und ne Minute später nochmal die Hand drüberhälst ob sie wirklich an ist. Wenn du sie leuchten siehst und selbst angezündet hast dann mußt du das nicht nochmal mit der Hand prüfen.


Ich bin mir sicher, wenn ich den Code fertig habe, das ich mich in Grund und Boden schämen würde, weils halt doch super einfach ist, so wie du es gesagt hast :)
glaube ich auch :p :rolleyes:


Ok, kommen wir nochmal aufs wesentliche zurück:

Mit der Routine Zeit_stelle, schiebe ich doch jede Stelle (je nach Tastendruck von PD.5) in die Variable Zeit_pos, richtig?
Das bedeutet, jedesmal, wenn ich auf Taster_s drücke, wird der Inhalt der Variable um einen Case verschoben, nämlich um die Case's die in der Routine Zeit_stelle: hinterlegt sind.
du verschiebst nichts. In der Routine Zeit_pos hast du sozusagen nen Stapel Blätter (Minuten,Stunden,Tag,Monat,Jahr) die du durchzählst (mit dem Increment). Der Rest ist nur als Anzeige damit du weißt welche Stelle du gewählt hast.


Also muss ich doch schreiben, If Taster_p = 1 Then Incr Zeit_pos, dass muß so einfach funktionieren! Es muß...
Das If/Then mit dem Taster_p (für plus) prüft doch nur nochmal ob du den Taster auch wirklich wirklich gedrückt hast wo du doch schon in der Routine Zeit_plus gelandet bist weil Debounce erkannt hat DAS du den Taster gedrückt hast und auch darum in diese Routine verzweigt hat. Ohne Tastendruck würdest du doch überhaupt nicht in der Routine landen. Also warum nochmal abprüfen ?

Ich muß also die Routine Zeit_plus: folgendes schreiben:
Code:
Zeit_plus:                             ' Wenn ich auf Taster_p jumpt er zu der "Zeit_stelle:"-Routine
Select Case Zeit_pos                   ' Hier wird die Variable ins Case geschoben 
Case 3                                 ' Case 3 da wurde durch das 3malige drücken auf Taster_s die Variable Zeit_pos 
[B][COLOR="#FF0000"]If Taster_p = 1 Then[/COLOR][/B]                   ' Hier wird der Wert der gerade in Zeit_pos drinne ist um eins increased, also erhöht
[B][COLOR="#800080"]Incr Zeit_pos[/COLOR][/B]                          ' Bei Minus nehme ich glas klar Decr
[B][COLOR="#FF0000"]End if[/COLOR][/B]
End select
Return

Du schreibst: - Wenn die Routine aufgerufen wird dann muß ja der Taster gedrückt worden sein. Warum nochmal prüfen ?
Wo überprüfe ich den was? Ich überprüfe doch nix, zumindest nicht bewusst...
An der roten Stelle prüfst du das.
Und warum stellst du deine Stelle die du erhöhen möchstest (zB die Minuten) an der violetten Zeile weiter (zB auf Stunde) ? Du hast doch in der Routine Zeit_stelle ausgesucht das du zB die Minuten um eins erhöhen möchtest.


Den Überlauf zu programmieren, ist das kleiner Problem bei mir, habe ich es erst mal geschafft mit Taster_p den Jeweiligen Wert zu ändern, dann schaff ich den überlauf auch ganz alleine (mein Wort in Gottes Ohr :))

Nochmal ne doofe Frage: Was macht Menu_homecnt eigentlich? Du hast den Wert auf 10 gesetzt... Auto-Home alle 10 Sekunden, was bedeutet das?
Das ist eigentlich nur nen Zähler der jede Sekunde (über SecTic) um eins erniedrigt wird. Wenn du irgendeine Taste drückst dann wird der Wert auf 10 gesetzt. Wenn du nun nichts drückst wird er also jede Sekunde um eins erniedrigt. Wenn er Null erreicht wird wieder von Stellen auf Normalbetrieb zurückgeschaltet (also Zeit_pos wieder auf 0 gesetzt). Damit die Uhr nicht dauernd auf "Minuten stellen" stehen bleibt wenn man nichts mehr drückt.


Programmierung nur durch lesen zu erlernen ist wesentlich schwieriger, als zwischendurch auch mal darüber zu reden...
Du kannst programmieren eigentlich nur durch selber tippen richtig lernen. Alles andere (nur lesen oder abkupfern) bringt dich nur sehr kurzfristig weiter. Man muß die Logik in den Zeilen erkennen.

Also wenn es bei der Routine Zeit_plus jetzt nicht klick macht dann muß ich mit nem Hammer das Brett vor dem Kopf entfernen und dir mit dem Zaunpfahl ins Auge pieksen :p :aetsch: Dann tippe ich dir das für die Minuten als Beispielzeile rein.

Gruß
Dino
 
...Das If/Then mit dem Taster_p (für plus) prüft doch nur nochmal ob du den Taster auch wirklich wirklich gedrückt hast wo du doch schon in der Routine Zeit_plus gelandet bist weil Debounce erkannt hat DAS du den Taster gedrückt hast und auch darum in diese Routine verzweigt hat. Ohne Tastendruck würdest du doch überhaupt nicht in der Routine landen. Also warum nochmal abprüfen ?


An der roten Stelle prüfst du das. ...
eben nicht - der Pin liefert doch wegen dem pullup immer 1, wenn die Taste nicht gedrückt ist.
(deswegen "debounc't" Ihr doch bei"0")
 
Ich bin jetzt etwas verwirrt, weil ich dachte, das die if/then Anweisung bedeutet, das wenn (if) auf Taster_p Strom (= 1) anliegt, er dann (then) eine Erhöhung (Incr) der Variable (Zeit_pos) stattfindet.

Dino, pack bitte noch nicht Hammer aus :eek:
Ich geb mir deinen Post noch mal in alller Ruhe, bin gleich wieder da...
 
Hi,

eben nicht - der Pin liefert doch wegen dem pullup immer 1, wenn die Taste nicht gedrückt ist.
(deswegen "debounc't" Ihr doch bei"0")
hast du irgendwie recht ;) Hab ich aber jetzt nicht wirklich nach gesehen weil die Zeile da so oder so überflüssig ist.
 
mMn redet Ihr etwas aneinander vorbei. Du gehst bei jedem Druck auf den "setze Zeit Taster" eine Stelle weiter, und kannst mit "+","-" diese Stelle verändern. Nach 10 sek ohne Tastendruck gehts zurück ins HP. Er will mit der "setze Zeit Taste" quasi ins Einstellmnü, und dort erstmal die zu stellende Position mit +/- auswählen, oder?
 
Ich hab drei Taster, PD.5 (alias Taster_s), PD.6 (alias Taster_p) und PD.7 (alias Taster_m)

Mit Taster_s kann ich von Minute zu Stunde zu Tag zu Monat zu Jahr durch drücken.
Bin ich bei Minute, kann ich mit Taster_p die Minute um 1 erhöhen, oder mit Taster_m die Minute um 1 veringern, dasselbe Spiel mit Stunde, Tag, Monat und Jahr...

So stelle ich mir das vor, hoffentlich seht ihr das auch so...
 
Hallo,

Ich hab drei Taster, PD.5 (alias Taster_s), PD.6 (alias Taster_p) und PD.7 (alias Taster_m)

Mit Taster_s kann ich von Minute zu Stunde zu Tag zu Monat zu Jahr durch drücken.
Bin ich bei Minute, kann ich mit Taster_p die Minute um 1 erhöhen, oder mit Taster_m die Minute um 1 veringern, dasselbe Spiel mit Stunde, Tag, Monat und Jahr...

So stelle ich mir das vor, hoffentlich seht ihr das auch so...
genau so sehe ich das auch und genau so hab ich das auch bei meinem Mega128 implementiert.

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

Select Case Zeit_pos                   ' Hier wird die Variable IM CASE VERGLICHEN (Schubladendenken) (0=Normal,1=Sec,2=Min,3=Std,...)
  Case 1                                 ' Case 1 da Sekunden
    ' .... hier Sekunden ändern
  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 Stunden
    ' .... hier Stunden ändern
End select
Return

So und nun bist DU an der Reihe.

Gruß
Dino
 
Ok, hatte ich also nur falsch verstanden. Ist bis hier richtig so. Die +/- Tasten werden ebenso mit debounce abgehandelt, " If Taster gedrückt..." oder so brauchst Du dann also nicht mehr. Aber das versucht Dino ja schon die ganze Zeit zu sagen.

Mach weiter so, das wird schon noch...;)
 
Achsooooooooooooooooooo, nicht Zeit_pos muss incrementet werden, sondern die eigentliche Variable, also _min, oder _hour, oder wie???

Warte ma ganz kurz, nur zwei Wörter und die Routine funktioniert?????
Also (vom überlauf mal abgesehen) nur Incr _min?
Der Hammer ehrlich :D

Und ja, es funktioniert...

Oh man, es tut mir echt soo Leid, das ich hier für über 34 Beiträge gebraucht habe!

Aber es funktioniert tatsächlich bei mir, ich könnte heulen vor Rührung , schluchtz... :)

Vielen, vielen Dank, ganz ehrlich!!!


Ok jetzt kommen wir zum Alarm :D Muhahaahaaaa :D
Nein, nein Spaß ;)

Ich werd jetzt erst mal, mit dem Code etwas herum spielen...
 
Ok, hatte ich also nur falsch verstanden. Ist bis hier richtig so. Die +/- Tasten werden ebenso mit debounce abgehandelt, " If Taster gedrückt..." oder so brauchst Du dann also nicht mehr. Aber das versucht Dino ja schon die ganze Zeit zu sagen.

Mach weiter so, das wird schon noch...;)

Ja ich weiß, der arme Kerl muß wegen mir schon echt verzweifelt sein...
Ich hab diese ganze If/Then-Geschichte auch nicht so ganz richtig verstanden, ich dachte, das es auch dazu dient um abzufragen, also If/wenn Taste gedrückt Then/dann mach Licht an, oder sonstwas...

Ich glaube, ich denke auch noch viel zu kompliziert! Tatsächlich müsste ich viel einfacher denken!
Wie gesagt, ich hätte nicht gedacht, das ein einfaches Incr _min langt...

Danke dir :)
 
Hi,

Aber es funktioniert tatsächlich bei mir, ich könnte heulen vor Rührung , schluchtz... :)

Vielen, vielen Dank, ganz ehrlich!!!
das Leben kann so einfach sein :p :rolleyes:

Ok jetzt kommen wir zum Alarm :D Muhahaahaaaa :D
Nein, nein Spaß ;)

Ich werd jetzt erst mal, mit dem Code etwas herum spielen...
Da kannst du nun fröhliches Copy-und-Paste machen. Die anderen Stellen werden genauso abgehandelt.
Beim Alarm hast du ja keine Zeitvariablen aus der Softclock. Du mußt also eigene (zB alarm_min, alarm_std) für deine Alarmzeit benutzen die du um eins erhöhst oder verringerst. Den Variablenwert (zB alarm_min) vergleichst du dann einfach jede Sekunde einmal mit _min und wenn alle Werte (_min, _hour, ...) gleich sind dann ist ALARM !!!!! :hahaha:

Denk bei der Minus-Taste mal nach ... Die Variablen _min, _hour, ... sind Byte-Variablen. Wenn du nun von 0 eins weiter verringerst und dadurch einen Überlauf fabrizierst. Was steht dann in der Variable ? Wie mußt du den Überlauf behandeln ? Auf was mußt du prüfen ? Als Wink ... If _min <0 then ... wird nicht funktionieren ;) (da hab ich glaube ich auch noch nen Bock bei mir im Programm :rolleyes:) Welche Werte kann eine ganzzahhlige Byte-Variable aufnehmen ? ...,0,1,2,3,...,253,254,255,... Ich laß mich mal überraschen. Das wäre deine nächste Aufgabe :to_pick_ones_nose3:

Gruß
Dino
 
Du bist echt der Hammer :D, gerade eben ist mir das aufgefallen, ich denke: Warum zeigt der mir jetzt beim Rückwärts zählen, I5, I4, I3 und so weiter an...
Und du kommst mir zuvor, in dem du mich schonmal daruf hinweist... Echt witzig :)
Aber Variablenwert Byte ist schonmal ein sehr guter Hinweis...

Und mit Datum hab ich auch noch kleine Probleme, aber ich glaube, das kriege ich in den Griff, so Gott will.

Und na klar copy/paste ich viel, aber ich hab auch gelernt, das ich simpler denken muss!

Will ich die Minute erhöhen??
Kein Problem und warum kein Problem, na weil die Minutenzahl in der Variable _min steckt.
Wie erhöhe ich einen Wert um einen Wert? Na mit Incr...
Ich kann aber auch genauso gut schreiben _min = _min + 1, aber wollen wir es mal nicht soo umständlich machen ;)


Lass mich herum experimentieren, wird schon ;)
 
Hi,

Und na klar copy/paste ich viel,
wenn du ein Programm modular aufbaust kannst du sehr schnell Teile in einem neuen Programm verwenden oder irgendwas erweitern oder , oder ... Das meinte ich mit Copy/Paste. Du mußt den Minuten-Kram eigentlich nur für Stunde, Tag, Monat, ... kopieren und leicht anpassen.

aber ich hab auch gelernt, das ich simpler denken muss!
genau das. Verknote dir nicht das Gehirn sondern versuch den direkten Weg zu nehmen.

Wie erhöhe ich einen Wert um einen Wert? Na mit Incr...
Ich kann aber auch genauso gut schreiben _min = _min + 1, aber wollen wir es mal nicht soo umständlich machen ;)
Incr (Increment) gibt es auch als Assemblerbefehl (inc) und ein Byte paßt genau in ein Register. Wenn du _min = _min + 1 machst dann setzt ein nicht optimierender Compiler das in eine normale Addition um die ein vielfaches vom Codeumfang hat. Du blähst dein Programm im Flash des Controllers also auf. Versuche Befehle zu nehmen die der Atmel auch in Assembler hat und versuche möglichst mit Byte-Variablen auszukommen oder maximal Word zu verwenden. Das gibt Geschwindigkeit und spart Code im Flash.

Du kannst zB bei einer Temperaturmessung deine 42,58°C auch als 4258 darstellen. Dann paßt das in eine Word-Variable und du kommst mit Integer-Operationen aus die Code sparen und schneller sind. Du mußt es dann nur für die Anzeige auf dem LCD ganz zum Schluß anpassen.

Außerdem ... versuch möglichst im Raster 1,2,4,8,16,32 ... zu bleiben. Wenn du dann zB Divisionen oder Multiplikationen durchführen mußt dann reicht ein Bitverschieben in den Registern. So zB wenn du Positionen auf nem Touchscreen erkennen willst. Da bekommt man ja die Pixelkoordinaten geliefert wo man draufgepackt hat. Wenn du die dann durch 64 teilst (mit Bitverschiebung weil schneller) dann sind die Flächen groß genug für den Finger (immer 64 Pixel Höhe oder Breite) und du entlastet de Prozessor. Wenn du zB 40 oder 70 nehmen würdest dann ist das außerhalb des Binären Rasters (16,32,64,128) und du hast zusätzlichen Aufwand und Rechenzeit. Ist aber jetzt etwas komplizierter zu erklären. Kommt im XV60D-TFT-Thread über Dirk seine Touch-Displays.

Und nun viel Spaß beim rumspielen mit Bascom :cool:

Gruß
Dino
 
Status
Für weitere Antworten geschlossen.

Über uns

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

User Menu

 Kaffeezeit

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

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


     Spende uns! (Paypal)