Forum: PC-Programmierung Uhr Bascom problem


von Matthias Knab (Gast)


Lesenswert?

Servus ich versuche gerade mir einen Wecker zu basteln hänge aber 
bereits an der uhr. hier erst mal mein code:

$regfile = "m8def.dat"
$crystal = 1000000
$baud = 19200
$hwstack = 32
$swstack = 10
$framesize = 40



Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , 
Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Config Lcdbus = 4
Cursor Off
Ddrb = &B11111111
Ddrd = &B00000000
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Enable Interrupts
Config Clock = Soft
Config Portd = Input

Cls

Time$ = "00:00:00"

Do
   Locate 1 , 1
   Lcd Time$ ; "  " ;
   If Pind.2 = 0 Then Gosub Stunde
   If Pind.4 = 0 Then Gosub Minute
Loop
End

'Stunde
Stunde:
Waitms 200
Cls
Do
Locate 1 , 1
Lcd "Stunde"
Locate 1 , 10
Lcd _hour
If Pind.3 = 0 Then
Incr _hour
Locate 1 , 10
Lcd _hour
End If
If _hour > 23 Then
_hour = 00
End If
Loop Until Pind.2 = 0
Waitms 200

'Minute
Minute:
Waitms 200
Cls
Do
Locate 1 , 1
Lcd "Minute"
Locate 1 , 10
Lcd _min
If Pind.3 = 0 Then
Incr _min
Locate 1 , 10
Lcd _min
End If
If _min > 59 Then
_min = 00
End If
Loop Until Pind.4 = 0
Waitms 200

Return




wenn ich das ganze nun aufspiele und pind.2 betätige springt er ins menü 
minute stellen und nicht stunde. woraan kann das liegen. ebenso komme 
ich aus dem menü bei erneutem tastendruck von pind.2 nicht mehr heraus.

kann mir da jemand helfen?

von Matthias Knab (Gast)


Lesenswert?

achso und die uhr startet gar nicht.

von Z. Z. (Gast)


Lesenswert?

das du nicht mehr aus dem "menue" herauskommst hängt vermutlich daran 
das du mit einer unglaublichen Geschwindigkeit dein Programm abarbeitest 
du das Tastenprellen usw. nicht beachtet hast...

versuche debounce!

schreibs um und schaue was passiert.

Quarz an prozessor nicht vergessen!

von Matthias Knab (Gast)


Lesenswert?

ja wo du das gerade ansprichst. ich bin anfänger und habe ehrlich gesagt 
noch keine ahnung wie ich mit dem debounce befehl umgehen muss. die 
hilfe in bascom macht mich auch nicht schlauer. kannst du mir dass mal 
erklären?

von Z. Z. (Gast)


Lesenswert?

die hilfe ist doch eindeutig!

DEBOUNCE Px.y , state , label [ , SUB]


debounce check ob der pin gedrückt wurde den du mit Px.y angibst

--> Px.y A port pin like PINB.0 , to examine.

dann ob high oder low aktiv

State 0 for jumping when PINx.y is low , 1 for jumping when PINx.y is 
high

dann wohin dein hauptprogramm dann springen soll

Label The label to GOTO when the specified state is detected

und zu schluss noch ,SUB damit definiert ist das du wieder aus der SUB 
zurück springen möchtest.

SUB The label to GOSUB when the specified state is detected



das könnte dann in kurzform so aussehen
1
do
2
'das ist mein Hauptrogramm
3
   debounce pind.1, 0, stunde,sub
4
5
loop
6
7
sub stunde
8
'hier steht dein Text
9
end sub

du musst dir am besten das Buch von Rowalt reinziehen, dann geht dir 
sicherlich wie butter runter!

von Matthias Knab (Gast)


Lesenswert?

du wirst lachen dieses buch liegt vor mir und da blick ich noch weniger 
durch. das ganze was ich hier geschrieben habe habe ich mir aus dem 
internet angeeignet. das buch hat mir 0 gebracht.

von Z. Z. (Gast)


Lesenswert?

also das buch ist wirklich top! nur das mit den ganzen Registern ist 
natürlich etwas schwierig zu verstehen am Anfgang...

BASCOM ist aber sehr gut für solche Dinge geeignet und ist gibt auch 
viele Befehle um das setzen der Register per Hand zu umgehen.

schau dir die Befehle declare sub und debounce in der Hilfe nochmals 
an...

bzw. in Beispieltexten hier in Foren... debounce entprellt softwaremäßig 
deinen Taster ... man kann sogar die zeiten der entprellung mit config 
debounce einstellen (nur falls man es braucht) und mit subs zu arbeiten 
ist wie ich finde sowieso übersichtlicher als sein programm komplett mir 
labels aufzubauen!

von Matthias Knab (Gast)


Lesenswert?

also dass mit debounce will einfach nicht. ich habs jetzt so geschrieben 
wie du gesagt hast:

$regfile = "m8def.dat"
$crystal = 1000000
$baud = 19200
$hwstack = 32
$swstack = 10
$framesize = 40



Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 ,
Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Config Lcdbus = 4
Cursor Off
Ddrb = &B11111111
Ddrd = &B00000000
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Enable Interrupts
Config Clock = Soft
Config Portd = Input

Cls

Time$ = "00:00:00"

Do
   Locate 1 , 1
   Lcd Time$ ; "  " ;
   debounce pind.2 , 0 , Stunde , sub
   debounce pind.4 , 0 , Minute , sub
Loop
End

'Stunde
sub Stunde
Waitms 200
Cls
Do
Locate 1 , 1
Lcd "Stunde"
Locate 1 , 10
Lcd _hour
If Pind.3 = 0 Then
Incr _hour
Locate 1 , 10
Lcd _hour
End If
If _hour > 23 Then
_hour = 00
End If
Loop Until Pind.2 = 0
Waitms 200
end sub

'Minute
sub Minute
Waitms 200
Cls
Do
Locate 1 , 1
Lcd "Minute"
Locate 1 , 10
Lcd _min
If Pind.3 = 0 Then
Incr _min
Locate 1 , 10
Lcd _min
End If
If _min > 59 Then
_min = 00
End If
Loop Until Pind.4 = 0
Waitms 200
end sub

Return


nur kommt dann immer der fehler:
sub or function must be declared first [Stunde] was heißt dass nun?

von Matthias Knab (Gast)


Lesenswert?

ok hab den fehler hab sub nicht declariert

von Matthias Knab (Gast)


Lesenswert?

jetzt will ich aber pind.3 auch noch entprellen nun erstelle ich wieder 
ne sub nur muss ich ja von der sub dann in sub Minute oder sub Stunde 
reinspringen wie bewerkstellige ich dass denn?

von Z. Z. (Gast)


Lesenswert?

du hast do loop in deinen Subs.. --> macht man nicht!

eine SUB (wie ein Interrupt) ist zum bearbeiten von nebenprogrammen 
welche angesprochen werden wenn ein Ereignis (z.B. Tastendrücken) 
eintritt.

heißt: dein Hauptprogramm checkt konstant eine Taste. Taste gedrückt? 
Taste gedrückt? Taste gedrückt? Taste gedrückt? Taste gedrückt?

falls ja, dann führe die SUB XY aus.. in der SUB verweilst du nicht 
sondern bearbeitest du etwas und springst so schnell es geht wieder 
zurück.

(könnte ja sein das du nicht nur einen Taster sondern mehrere checken 
möchtest und dann wäre es doof wenn die dann nicht mehr ausgewertet 
werden.

deine SUB sieht also beispielmäßig so aus:

sub stunde
   incr stunde
end sub stunde

somit würde jeder tastendruck die Stunde um eins erhöhen....

der Rest kommt aus deiner Fantasie bzw. deinem Ziel welches du dir vor 
Projektbegin setzen mußt ...

von Matthias Knab (Gast)


Lesenswert?

alles klar also subs sind in etwa wie bei ner sps die netzwerke. nun 
stehe ich noch vor einem weiteren problem und zwar wie starte ich den 
timer und wie kann ich 2 timer miteinander vergleichen. siehe hier mein 
programm eines is die uhr das andere die weckzeit. da ich aber nur time$ 
verwendet habe nehme ich an dass beide loslaufen würden.

kann mir dabei noch jemand helfen?

$regfile = "m8def.dat"
$crystal = 1000000
$baud = 19200
$hwstack = 32
$swstack = 10
$framesize = 40



Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , 
Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Config Lcdbus = 4
Cursor Off
Ddrb = &B11111111
Ddrd = &B00000000
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1
Portd.7 = 1

Enable Interrupts
Config Clock = Soft
Config Portd = Input
Declare Sub Stunde
Declare Sub Minute
Declare Sub Ausgabe
Declare Sub Menue
Declare Sub Minutewecker
Declare Sub Stundewecker
Dim Weckzeit As Byte
Dim Modus As Byte
Cls

Time$ = "00:00:00"
Time$ = "00:00"

Do
   Locate 1 , 1
   Lcd Time$ ; "  " ;
   Locate 1 , 12
   Lcd Time$ ; "00:00" ;
   Debounce Pind.3 , 0 , Stunde , Sub
   Debounce Pind.4 , 0 , Minute , Sub
   Debounce Pind.2 , 0 , Menue , Sub
   Debounce Pind.5 , 0 , Stundewecker , Sub
   Debounce Pind.6 , 0 , Minutewecker , Sub
Loop






Menue:
Gosub Ausgabe
Return



Ausgabe:
Incr Modus
If Modus = 3 Then Modus = 0
Locate 2 , 1
If Modus = 0 Then
Locate 2 , 1
Wait 1
Lcd "MP3  "
Portb.0 = 1
Else
Portb.0 = 0
End If

If Modus = 1 Then
Locate 2 , 1
Wait 1
Lcd "Radio"
Portb.1 = 1
Else
Portb.1 = 0
End If

If Modus = 2 Then
Locate 2 , 1
Wait 1
Lcd "AUX  "
Portb.2 = 1
Else
Portb.2 = 0
End If
Return



'Stunde
Sub Stunde
Waitms 200
Cls
Waitms 200
Do
Locate 1 , 1
Lcd "Stunde"
Locate 1 , 10
Lcd _hour
If Pind.7 = 0 Then
Incr _hour
Locate 1 , 10
Lcd _hour
End If
If _hour > 23 Then
_hour = 00
End If
Loop Until Pind.3 = 0
Waitms 200
Cls
Waitms 200
End Sub



'Minute
Sub Minute
Waitms 200
Cls
Waitms 200
Do
Locate 1 , 1
Lcd "Minute"
Locate 1 , 10
Lcd _min
If Pind.7 = 0 Then
Incr _min
Locate 1 , 10
Lcd _min
End If
If _min > 59 Then
_min = 00
End If
Loop Until Pind.4 = 0
Waitms 200
Cls
Waitms 200
End Sub

Return


'StundeWecker
Sub Stundewecker
Waitms 200
Cls
Waitms 200
Do
Locate 1 , 1
Lcd "StundeW"
Locate 1 , 10
Lcd _hour
If Pind.7 = 0 Then
Incr _hour
Locate 1 , 10
Lcd _hour
End If
If _hour > 23 Then
_hour = 00
End If
Loop Until Pind.5 = 0
Waitms 200
Cls
Waitms 200
End Sub


'MinuteWecker
Sub Minutewecker
Waitms 200
Cls
Waitms 200
Do
Locate 1 , 1
Lcd "MinuteW"
Locate 1 , 10
Lcd _min
If Pind.7 = 0 Then
Incr _min
Locate 1 , 10
Lcd _min
End If
If _min > 59 Then
_min = 00
End If
Loop Until Pind.6 = 0
Waitms 200
Cls
Waitms 200
End Sub
Return

von Karl H. (kbuchegg)


Lesenswert?

'Minute
Sub Minute
Waitms 200
<pre>
Cls
Waitms 200
Do
Locate 1 , 1
Lcd "Minute"
Locate 1 , 10
Lcd _min
If Pind.7 = 0 Then
Incr _min
Locate 1 , 10
Lcd _min
End If
If _min > 59 Then
_min = 00
End If
Loop Until Pind.4 = 0
Waitms 200
Cls
Waitms 200
End Sub

Return
</pre>

Nein.
Z.Z. hat es dir doch erklärt.
Du sollst eben nicht innerhalb dieser Sub eine neue Logik zum Eingeben 
von Minuten in einer Schleife erfinden!
Der Benutzer hat eine Taste gedrückt. Als Folge davon wird die 
Minutenanzahl um 1 erhöht. Fertig. Mehr soll diese Sub nicht tun!
Den ganzen Humbug mit LCD löschen, Minuten hinschreiben ist doch M...

Mach dir einen Taster als 'Config' Taster. Wird er gedrückt geht die Uhr 
über in 'Stunden stellen' Ein Druck auf + erhäht die Stundenzahl. Ein 
Druck auf - erniedrigt die Stundenzahl. Ein erneuter Druck auf 'Config' 
schaltet um von Stunden einstellen auf Minuten einstellen. Wird + 
gedrückt, erhöhen sich die Minuten, wird - gedrückt erniedrigen sie 
sich. Beim nächsten Druck auf 'Config' ist die Uhr wieder auf normalen 
Zeitmodus und + und - haben keine Funktion mehr.
Sieh dir einfach an, wie ein käuflicher Wecker mit seinen Tasten umgeht. 
Es hat schon seinen Grund, warum sich am dort benutzten Prinzip seit 
Jahren praktisch nichts mehr geändert hat.
Mit deinen Schleifen hast du die ganze Tastenentprellerei innerhalb der 
Sub wieder lahmgelegt.

von Karl H. (kbuchegg)


Lesenswert?

> siehe hier mein
> programm eines is die uhr das andere die weckzeit.

Nö.
Du hast nur 2 verschiedene Sätze von Tasten, die dasselbe bewirken: Die 
aktuelle Uhrzeit zu verändern.

Du wirst wohl nicht umhin kommen, dir für die Weckzeit 2 Variablen zu 
erzeugen. Die eine nimmt die Stunden für die Weckzeit auf, die andere 
die Minuten.

von Matthias Knab (Gast)


Lesenswert?

sorry leute wollte euch nicht nerven nur is es halt mein erstes projekt 
und deshalb frage ich so oft nach. ich habe ja keinen plan wie man sowas 
am besten struckturiert.

von Matthias Knab (Gast)


Lesenswert?

so habs mal abgeändert is so wirklich viel überschaubarer und 
verständlicher:

$regfile = "m8def.dat"
$crystal = 1000000
$baud = 19200
$hwstack = 32
$swstack = 10
$framesize = 40



Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , 
Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Config Lcdbus = 4
Cursor Off
Ddrb = &B11111111
Ddrd = &B00000000
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1
Portd.7 = 1

Enable Interrupts
Config Clock = Soft
Config Portd = Input
Declare Sub Stunde
Declare Sub Minute
Declare Sub Ausgabe
Declare Sub Menue
Dim Modus As Byte
Declare Sub Einstellen
Cls

Time$ = "00:00:00"

Do
   Locate 1 , 1
   Lcd Time$ ; "  " ;
   Debounce Pind.3 , 0 , Stunde , Sub
   Debounce Pind.4 , 0 , Minute , Sub
   Debounce Pind.2 , 0 , Menue , Sub
   Debounce Pind.7 , 0 , Einstellen , Sub
Loop






Menue:
Gosub Ausgabe
Return



Ausgabe:
Incr Modus
If Modus = 3 Then Modus = 0
Locate 2 , 1
If Modus = 0 Then
Locate 2 , 1
Wait 1
Lcd "MP3  "
Portb.0 = 1
Else
Portb.0 = 0
End If

If Modus = 1 Then
Locate 2 , 1
Wait 1
Lcd "Radio"
Portb.1 = 1
Else
Portb.1 = 0
End If

If Modus = 2 Then
Locate 2 , 1
Wait 1
Lcd "AUX  "
Portb.2 = 1
Else
Portb.2 = 0
End If
Return



'Stunde
Sub Stunde
If Pind.3 = 0 Then
Incr _hour
End If
If _hour > 23 Then
_hour = 00
End If
End Sub




'Minute
Sub Minute
If Pind.4 = 0 Then
Incr _min
End If
If _min > 59 Then
_min = 00
End If
End Sub

Return



nur kann mir einer mal erklären wie ich variablen vergleichen kann und 
die dann ausgeben kann für die wekczeit eben?

von Z. Z. (Gast)


Lesenswert?

du brauchst in deiner SUB nicht nochmals zu fragen ob der pin = 0 ist da 
ja nur in die SUB gesprungen wird wenn er 0 ist!


lass die IF dort überall raus!

if a = b then

so vergleicht man z.B.

von Karl H. (kbuchegg)


Lesenswert?

Es wäre noch übersichtlicher, wenn du dir eine Einrückstruktur 
angewöhnen würdest

Vergleich mal
1
Ausgabe:
2
  Incr Modus
3
4
  If Modus = 3 Then Modus = 0
5
  Locate 2 , 1
6
  If Modus = 0 Then
7
    Locate 2 , 1
8
    Wait 1
9
    Lcd "MP3  "
10
    Portb.0 = 1
11
  Else
12
    Portb.0 = 0
13
  End If
14
15
  If Modus = 1 Then
16
    Locate 2 , 1
17
    Wait 1
18
    Lcd "Radio"
19
    Portb.1 = 1
20
  Else
21
    Portb.1 = 0
22
  End If
23
24
  If Modus = 2 Then
25
    Locate 2 , 1
26
    Wait 1
27
    Lcd "AUX  "
28
    Portb.2 = 1
29
  Else
30
    Portb.2 = 0
31
  End If
32
Return
33
34
'Stunde
35
Sub Stunde
36
  Incr _hour
37
38
  If _hour > 23 Then
39
    _hour = 00
40
  End If
41
End Sub

PLötzlich kann man auch optisch erkennen, wo ein if anfängt, wo das 
zugehörige else ist bzw. das abschliessende end if

von Matthias Knab (Gast)


Lesenswert?

so hab hier das ganze mal mit variablen mal noch mit der weckzeit 
gemacht:
$regfile = "m8def.dat"
$crystal = 1000000
$baud = 19200
$hwstack = 32
$swstack = 10
$framesize = 40



Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , 
Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Config Lcdbus = 4
Cursor Off
Ddrb = &B11111111
Ddrd = &B00000000
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1
Portd.7 = 1

Enable Interrupts
Config Clock = Soft
Declare Sub Stunde
Declare Sub Minute
Declare Sub Menue
Declare Sub Stundew
Declare Sub Minutew
Dim Modus As Byte
Dim Stellenminute As Byte
Dim Stellenstunde As Byte
Cls

Time$ = "00:00:00"

Do
   Locate 1 , 1
   Lcd Time$ ; "  " ;
   Locate 1 , 12
   Lcd Stellenstunde
   Locate 1 , 14
   Lcd ":"
   Locate 1 , 15
   Lcd Stellenminute
   Debounce Pind.2 , 0 , Menue , Sub
   Debounce Pind.3 , 0 , Stunde , Sub
   Debounce Pind.4 , 0 , Minute , Sub
   Debounce Pind.5 , 0 , Stundew , Sub
   Debounce Pind.6 , 0 , Minute W , Sub
Loop





Menue:
Incr Modus
   If Modus = 4 Then Modus = 0
   Locate 2 , 1
   If Modus = 0 Then
      Locate 2 , 1
      Wait 1
      Lcd "Aus  "
   End If


   If Modus = 1 Then
      Locate 2 , 1
      Wait 1
      Lcd "MP3  "
      Portb.0 = 1
   Else
      Portb.0 = 0
   End If



   If Modus = 2 Then
      Locate 2 , 1
      Wait 1
      Lcd "Radio"
      Portb.1 = 1
   Else
      Portb.1 = 0
   End If



   If Modus = 3 Then
      Locate 2 , 1
      Wait 1
      Lcd "AUX  "
      Portb.2 = 1
   Else
      Portb.2 = 0
   End If
Return



'Stunde
Sub Stunde
   Incr _hour
   If _hour > 23 Then
      _hour = 00
   End If
End Sub




'Minute
Sub Minute
   Incr _min
   If _min > 59 Then
      _min = 00
   End If
End Sub

Return

'MinuteW
Sub Minutew
Incr Stellenminute
   If Stellenminute > 59 Then
   Stellenminute = 00
   End If
End Sub
Return


'Stundew
Sub Stundew
Incr Stellenstunde
   If Stellenstunde > 23 Then
   Stellenstunde = 00
   End If
End Sub
Return



nun habe ich dazu noch ne frage. wie bekomme ich es hin dass stellen 
minute und stellenstunde mit 00 anzeigen. so wird mir nur eine 0 
angezeigt wo dann beim überlauf die letzte ziffer immer stehen bleibt.

dann noch ne frage ich habe das ganze mit der anzeige so gelöst:

   Locate 1 , 12
   Lcd Stellenstunde
   Locate 1 , 14
   Lcd ":"
   Locate 1 , 15
   Lcd Stellenminute
gibt es da ne elegantere möglichkeit?

von Matthias Knab (Gast)


Lesenswert?

bin jetzt mal auf den befehl format gekommen nur wenn ich den so anwende 
zeigt er mir nicht 00:00 an sondern 48:48 woran liegt dass?


$regfile = "m8def.dat"
$crystal = 1000000
$baud = 19200
$hwstack = 32
$swstack = 10
$framesize = 40



Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , 
Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Config Lcdbus = 4
Cursor Off
Ddrb = &B11111111
Ddrd = &B00000000
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1
Portd.7 = 1

Enable Interrupts
Config Clock = Soft
Declare Sub Stunde
Declare Sub Minute
Declare Sub Menue
Declare Sub Stundew
Declare Sub Minutew
Dim Modus As Byte
Dim Stellenstunde As Byte
Dim Stellenminute As Byte
Dim Konfiguration As Byte
Declare Sub Stellenmenue

Dim S As String * 2
Dim I As String * 2


Stellenstunde = Format(s , "00")
Stellenminute = Format(i , "00")
Cls

Time$ = "00:00:00"

Do
   Locate 1 , 1
   Lcd Time$ ; "  " ;
   Locate 1 , 12
   Lcd Stellenstunde ; ":" ; Stellenminute
   Debounce Pind.2 , 0 , Menue , Sub
   Debounce Pind.3 , 0 , Stellenmenue , Sub
   If Konfiguration = 1 Then
   Debounce Pind.4 , 0 , Stundew , Sub
   Debounce Pind.5 , 0 , Minutew , Sub
   End If
   If Konfiguration = 2 Then
   Debounce Pind.4 , 0 , Stunde , Sub
   Debounce Pind.5 , 0 , Minute , Sub
   End If

Loop



'Stellenmenue
Sub Stellenmenue
Incr Konfiguration
   If Konfiguration = 3 Then Konfiguration = 0
   Locate 2 , 10
   If Konfiguration = 0 Then
      Locate 2 , 10
      Wait 1
      Lcd "      "
   End If


   If Konfiguration = 1 Then
      Locate 2 , 10
      Wait 1
      Lcd "Wecker"
   End If



   If Konfiguration = 2 Then
      Locate 2 , 10
      Wait 1
      Lcd "   Uhr"
   End If
   End Sub
Return







Menue:
Incr Modus
   If Modus = 4 Then Modus = 0
   Locate 2 , 1
   If Modus = 0 Then
      Locate 2 , 1
      Wait 1
      Lcd "Aus  "
   End If


   If Modus = 1 Then
      Locate 2 , 1
      Wait 1
      Lcd "MP3  "
      Portb.0 = 1
   Else
      Portb.0 = 0
   End If



   If Modus = 2 Then
      Locate 2 , 1
      Wait 1
      Lcd "Radio"
      Portb.1 = 1
   Else
      Portb.1 = 0
   End If



   If Modus = 3 Then
      Locate 2 , 1
      Wait 1
      Lcd "AUX  "
      Portb.2 = 1
   Else
      Portb.2 = 0
   End If
Return



'Stunde
Sub Stunde
   Incr _hour
   If _hour > 23 Then
      _hour = 00
   End If
End Sub




'Minute
Sub Minute
   Incr _min
   If _min > 59 Then
      _min = 00
   End If
End Sub

Return

'MinuteW
Sub Minutew
Incr Stellenminute
   If Stellenminute > 59 Then
   Stellenminute = 0
   End If
End Sub
Return


'Stundew
Sub Stundew
Incr Stellenstunde
   If Stellenstunde > 23 Then
   Stellenstunde = 0
   End If
End Sub
Return

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Beitrag "Re: Format-Fehler bei Bascom LCD-Ausgabe??"

1
' ...
2
3
' Stellenstunde = Format(s , "00")
4
' Stellenminute = Format(i , "00")
5
Cls
6
7
Time$ = "00:00:00"
8
9
Do
10
   Locate 1 , 1
11
   Lcd Time$ ; "  " ;
12
   Locate 1 , 12
13
14
   I = Format(str(Stellenminute), "00")
15
   S = Format(str(Stellenstunde), "00")
16
   Lcd S ; ":" ; I
17
18
' ...

von Matthias Knab (Gast)


Lesenswert?

war ich schon hab ich auch so gemacht kommen dann immer die fehler:

error 242 source variable does not match the target variable [0]

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Dann gehe dem Fehler nach...
http://avrhelp.mcselec.com/index.html

Leider fehlen bei deiner Fehlermeldung die Zeilennummern.

mein Tipp:
Die Targetstrings S und I sind zu klein dimensioniert für die 
Sourcevariablen Stellenminute und Stellenstunde und die Umwandlung mit 
STR() scheitert.
1
Dim S As String * 3 ' Platz für 0..255 
2
Dim I As String * 3 ' Platz für 0..255
3
4
'...
5
6
   I = STR(Stellenminute)
7
   I = FORMAT(I, "00")
8
   S = STR(Stellenstunde)
9
   S = FORMAT(S, "00")

von Matthias Knab (Gast)


Lesenswert?

mit deiner methode wird mir es angezeigt nur eben aber immer 00:00 ich 
kann es nicht mehr verändern durch meine tastendrücke es bleibt einfach 
bei 00:00

von Matthias Knab (Gast)


Lesenswert?

warum kann ich das mit der weckzeit nicht so schreiben:

If Stellenstunde = _hour And
      Stellenminute = _min And
      Anaus = 1 Then

      Portc.5 = 1
      Else
      Portc.5 = 0
   End If


sobald die eingestellte stunde = der gängigen stunde und die 
eingestellte minute = der gängigen minute und Anaus=1 soll portc.5 
gesetzt werden.


wie gesagt dass mit den 00 hab ich immernoch nicht.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Matthias Knab schrieb:

>> mit deiner methode wird mir es angezeigt nur eben aber immer 00:00 ich
>> kann es nicht mehr verändern durch meine tastendrücke es bleibt einfach
>> bei 00:00
> wie gesagt dass mit den 00 hab ich immernoch nicht.

Welche Tasten drückst du denn?

Und wie sieht jeweils die Anzeige auf dem LCD aus? Steht bei Pos. 2 , 10 
"Wecker"?

D.h. hast du im Stellenmenue die Konfiguration eingestellt in der du 
überhaupt Stellenminute und Stellenstunde verändern kannst?

Du kannst mit

   I = STR(Stellenminute)
'   I = FORMAT(I, "00")
   S = STR(Stellenstunde)
'   S = FORMAT(S, "00")

versuchen, Probleme mit FORMAT() auszuschliessen. Die Ausgabe sieht 
nicht schön aus, aber bei der Fehlersuche ist das egal. Man will ja nur 
sehen, ob FORMAT() stört oder nicht.

> warum kann ich das mit der weckzeit nicht so schreiben:

Kannst du nicht? Was passiert denn, wenn du es versuchst?

von Matthias Knab (Gast)


Lesenswert?

ja klar habe ich wecker oder stunde eingestellt jedoch kann ich nicht 
hochzählen es bleibt immer 00:00 stehen.


>Kannst du nicht? Was passiert denn, wenn du es versuchst?

es kommt:

error 35: 3 parameters expected
error 46: assignment error ]stellenstunde]:0 [_hour] and:0]

sind die letzten kleinigkeiten die mir noch fehlen. sobald alles fertig 
is werde ich ein tutorial erstellen.

von Matthias Knab (Gast)


Lesenswert?

so habe es fast geschafft. habe aber eben noch 3 probleme.

1. das vergleichen der gestellten und der tatsächlichen zeit 
funktioniert wunderbar nur sobald die led einmal eingeschaltet is geht 
se nicht mehr ab.

mit und verknüpfungen habe ich es nicht hinbekommen habe es so dann 
geschrieben:

If Stellenstunde = _hour Then
         If Stellenminute = _min Then
            If Anaus = 1 Then
               Portb.5 = 1
               Else
               Portb.5 = 0
            End If
         End If
   End If


dann habe ich ein weiteres problem und zwar will ich dass wenn bei 
konfiguration der status 0 ist dass es mir anaus auf dem display 
anzeigt.

ich werde mich ganz am schluss nochmal mit format beschäftigen.

von Matthias Knab (Gast)


Lesenswert?

$regfile = "m8def.dat"
$crystal = 1000000
$baud = 19200
$hwstack = 32
$swstack = 10
$framesize = 40



Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , 
Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Config Lcdbus = 4
Cursor Off
Ddrb = &B11111111
Ddrd = &B00000000
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1
Portd.7 = 1

Enable Interrupts
Config Clock = Soft
Declare Sub Stunde
Declare Sub Minute
Declare Sub Menue
Declare Sub Stundew
Declare Sub Minutew
Declare Sub Onoff
Declare Sub Licht
Declare Sub Stellenmenue

Dim Modus As Byte
Dim Stellenstunde As Byte
Dim Stellenminute As Byte
Dim Konfiguration As Byte
Dim Anaus As Byte



Cls

Time$ = "00:00:00"

Do
   Locate 1 , 1
   Lcd Time$ ; "  " ;
   Locate 1 , 12
   Lcd Stellenstunde ; ":" ; Stellenminute
   Debounce Pind.2 , 0 , Menue , Sub
   Debounce Pind.3 , 0 , Stellenmenue , Sub

   If Konfiguration = 1 Then
      Debounce Pind.4 , 0 , Stundew , Sub
      Debounce Pind.5 , 0 , Minutew , Sub
   End If

   If Konfiguration = 2 Then
      Debounce Pind.4 , 0 , Stunde , Sub
      Debounce Pind.5 , 0 , Minute , Sub
   End If

   If Konfiguration = 0 Then
   Debounce Pind.6 , 0 , Onoff , Sub
   End If


   If Stellenstunde = _hour Then
         If Stellenminute = _min Then
            If Anaus = 1 Then
               Portb.5 = 1
               Else
               Portb.5 = 0
            End If
         End If
   End If

   Debounce Pind.7 , 0 , Licht , Sub

Loop



'Stellenmenue
Sub Stellenmenue
Incr Konfiguration
   If Konfiguration = 3 Then Konfiguration = 0
   Locate 2 , 11
   If Konfiguration = 0 Then
      Locate 2 , 11
      Wait 1
      Lcd "      "
   End If


   If Konfiguration = 1 Then
      Locate 2 , 11
      Wait 1
      Lcd "Wecker"
   End If



   If Konfiguration = 2 Then
      Locate 2 , 11
      Wait 1
      Lcd "   Uhr"
   End If
   End Sub
Return



Menue:
Incr Modus
   If Modus = 4 Then Modus = 0
   Locate 2 , 1
   If Modus = 0 Then
      Locate 2 , 1
      Wait 1
      Lcd "Aus  "
   End If


   If Modus = 1 Then
      Locate 2 , 1
      Wait 1
      Lcd "MP3  "
      Portb.0 = 1
   Else
      Portb.0 = 0
   End If



   If Modus = 2 Then
      Locate 2 , 1
      Wait 1
      Lcd "Radio"
      Portb.1 = 1
   Else
      Portb.1 = 0
   End If



   If Modus = 3 Then
      Locate 2 , 1
      Wait 1
      Lcd "AUX  "
      Portb.2 = 1
   Else
      Portb.2 = 0
   End If
Return



'Stunde
Sub Stunde
   Incr _hour
   If _hour > 23 Then
      _hour = 00
   End If
End Sub



'Minute
Sub Minute
   Incr _min
   If _min > 59 Then
      _min = 00
   End If
End Sub

Return



'MinuteW
Sub Minutew
Incr Stellenminute
   If Stellenminute > 59 Then
   Stellenminute = 0
   End If
End Sub
Return



'Stundew
Sub Stundew
Incr Stellenstunde
   If Stellenstunde > 23 Then
   Stellenstunde = 0
   End If
End Sub
Return



'onoff
Sub Onoff
Incr Anaus
   If Anaus = 2 Then Anaus = 0
   Locate 2 , 13
   If Anaus = 0 Then
      Locate 2 , 14
      Wait 1
      Lcd "aus"
   End If

   If Anaus = 1 Then
      Locate 2 , 14
      Wait 1
      Lcd " an"
   End If
End Sub
Return




'Licht
Sub Licht

   Portc.5 = 1
   Wait 4

End Sub
Return

von Karl H. (kbuchegg)


Lesenswert?

Matthias Knab schrieb:

> 1. das vergleichen der gestellten und der tatsächlichen zeit
> funktioniert wunderbar nur sobald die led einmal eingeschaltet is geht
> se nicht mehr ab.

Das ist klar.
Wenn die Minuten nicht mehr übereinstimmen, geht es dann gar nicht mehr 
zu der Abfrage ob Anaus gleich 1 ist und damit kommst du auch nie wieder 
in den else Zweig, der den Portb.5 auf 0 schalten würde. Denn der wird 
ja nur ausgeführt, wenn Anaus überhaupt getestet werden würde.

Ich würde trptzdem danach trachten, die Sache mit den AND Verknüpfungen 
hinzukriegen. Die brauchst du immer wieder.

Aber mit BASCOM hab ich noch nicht wirklich gearbeitet, von daher kann 
ich auch nicht sagen, warum der COmpiler das nicht frisst. Probier mal 
alles auf eine Zeile zu schreiben, Klammern einzufügen, etc. BASCOM ist 
bei manchen Dingen recht eigen, wie zb arithmetische Ausdrücke, die man 
selbst aufdröseln muss.

von Matthias Knab (Gast)


Lesenswert?

alles klar passt nun alles auf eine zeile und es funktioniert wunderbar.
nur noch das problem mit anaus und eben format.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Mach es halt von Hand
1
   Lcd Stellenstunde/10 ; Stellenstunde-Stellenstunde/10 ; ":" ; Stellenminute/10 ; Stellenminute-Stellenminute/10 ;

von Matthias Knab (Gast)


Lesenswert?

hätte ich aber der befehl wäre zu lang für eine zeile.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Gott hilf!

von Karl H. (kbuchegg)


Lesenswert?

Matthias Knab schrieb:
> hätte ich aber der befehl wäre zu lang für eine zeile.

Dann teile halt die Ausgabe auf 2 Ausgaben auf
Manchmal kann die Welt so einfach sein

von Matthias Knab (Gast)


Lesenswert?

$regfile = "m8def.dat"
$crystal = 1000000
$baud = 19200
$hwstack = 32
$swstack = 10
$framesize = 40



Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , 
Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Config Lcdbus = 4
Cursor Off
Ddrb = &B11111111
Ddrd = &B00000000
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1
Portd.7 = 1

Enable Interrupts
Config Clock = Soft
Declare Sub Stunde
Declare Sub Minute
Declare Sub Menue
Declare Sub Stundew
Declare Sub Minutew
Declare Sub Onoff
Declare Sub Licht
Declare Sub Stellenmenue

Dim Modus As Byte
Dim Stellenstunde As Byte
Dim Stellenminute As Byte
Dim Konfiguration As Byte
Dim Anaus As Byte


Cls

Time$ = "00:00:00"

Do
   Locate 1 , 1
   Lcd Time$ ; "  " ;
   Locate 1 , 12


   If Stellenstunde < 10 Then Lcd "0"
   Lcd Stellenstunde ; ":"
         If Stellenminute < 10 Then Lcd "0"
         Lcd Stellenminute


   Debounce Pind.2 , 0 , Menue , Sub
   Debounce Pind.3 , 0 , Stellenmenue , Sub


   If Konfiguration = 1 Then                                'Wecker 
stellen
      Debounce Pind.4 , 0 , Stundew , Sub
      Debounce Pind.5 , 0 , Minutew , Sub
   End If


   If Konfiguration = 2 Then                                'Uhr stellen
      Debounce Pind.4 , 0 , Stunde , Sub
      Debounce Pind.5 , 0 , Minute , Sub
   End If


   If Konfiguration = 0 Then                                'Wecker 
an/aus
   Debounce Pind.6 , 0 , Onoff , Sub
   End If


   If Stellenstunde = _hour And Stellenminute = _min And Anaus = 1 Then
               Portb.5 = 1
               Else
               Portb.5 = 0
   End If


   Debounce Pind.7 , 0 , Licht , Sub

Loop



'Stellenmenü                                                'Menü zum 
einstellen Wecker/Uhr
Stellenmenue:
Incr Konfiguration
   If Konfiguration = 3 Then Konfiguration = 0
   Locate 2 , 11

   If Konfiguration = 0 Then
      Locate 2 , 11
      Wait 1
      Lcd "      "
   End If


   If Konfiguration = 1 Then
      Locate 2 , 11
      Wait 1
      Lcd "Wecker"
   End If



   If Konfiguration = 2 Then
      Locate 2 , 11
      Wait 1
      Lcd "   Uhr"
   End If
Return


'Menü                                                       'Menü MP3, 
Radio, Aux
Menue:
Incr Modus
   If Modus = 4 Then Modus = 0
   Locate 2 , 1
   If Modus = 0 Then
      Locate 2 , 1
      Wait 1
      Lcd "Aus  "
   End If


   If Modus = 1 Then
      Locate 2 , 1
      Wait 1
      Lcd "MP3  "
      Portb.0 = 1
   Else
      Portb.0 = 0
   End If



   If Modus = 2 Then
      Locate 2 , 1
      Wait 1
      Lcd "Radio"
      Portb.1 = 1
   Else
      Portb.1 = 0
   End If



   If Modus = 3 Then
      Locate 2 , 1
      Wait 1
      Lcd "AUX  "
      Portb.2 = 1
   Else
      Portb.2 = 0
   End If
Return



'Stunde                                                    'Hier wird 
die Stunde der Uhr hochgezählt
Stunde:
   Incr _hour
   If _hour > 23 Then
      _hour = 00
   End If
Return



'Minute                                                     'Hier wird 
die Minute der Uhr hochgezählt
Minute:
   Incr _min
   If _min > 59 Then
      _min = 00
   End If

Return



'MinuteW                                                    'Hier wird 
die Minute des Weckers hochgezählt
Minutew:
Incr Stellenminute
   If Stellenminute > 59 Then
   Stellenminute = 0
   End If
Return



'Stundew                                                    'Hier wird 
die Stunde des Weckers hochgezählt
Stundew:
Incr Stellenstunde
   If Stellenstunde > 23 Then
   Stellenstunde = 0
   End If
Return



'onoff                                                      'Hier wird 
der Wecker ein- und ausgeschaltet
Onoff:
Incr Anaus
   If Anaus = 2 Then Anaus = 0
   Locate 2 , 13
   If Anaus = 0 Then
      Locate 2 , 14
      Wait 1
      Lcd "aus"
   End If

   If Anaus = 1 Then
      Locate 2 , 14
      Wait 1
      Lcd " an"
   End If
Return




'Licht                                                      'Hier wird 
das Licht für 4 Sekunden eingeschaltet
Licht:

   Portc.5 = 1
   Wait 4

Return



so habs jetzt. letztes problem. wenn konfiguration = 0 dann soll mir am 
display die onoff schleife stehen also auch in welchem zustand sie ist.

so zeigt es mir ja immer die leeren zeilen an und erst wenn ich pind.6 
drücke erscheint an bzw aus. das soll aber immer da stehen wenn 
konfiguration =0.
wie mach ich das am besten?

von Matthias Knab (Gast)


Lesenswert?

bin jetzt soweit fertig nur mit welchem befehl startet man denn die uhr?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Die startet sich als SOFT Clock konfiguriert selbst, wenn du einen 
32768 Hz crystal angeschlossen hast und die BASCOM Routine auch mit 
dem Atmega8 kann. Die Doku von BASCOM ist da ziemlich unausführlich 
(hüstel).
http://avrhelp.mcselec.com/config_clock.htm

Anscheinend klappt es mit dem Uhrenquarz an Pin 9/10 beim Atmega8
http://frickelfritze.de/bsz/index.html

Pin 9/10 beim Atmega8 ist XTAL1/XTAL2
http://www.datasheetdir.com/ATMEGA8+AVR-microcontrollers

AVR Fuses beachten, damit XTAL1/XTAL2 befeuert werden.

von Matthias Knab (Gast)


Lesenswert?

alles klar nun habe ich aber bei meinem programm ein problem mit den 
tastern und zwar muss ich jetzt längere zeit auf nen taster drücken dass 
sich der zustand ändert. ich vermute mal dass meine do schleife 
überfüllt ist wusste aber nicht wie ich es ändern muss. eventuell hat 
von euch nochmal schnell jemand nen tipp.

$regfile = "m8def.dat"
$crystal = 1000000
$baud = 19200
$hwstack = 32
$swstack = 10
$framesize = 40



Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , 
Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Config Lcdbus = 4
Cursor Off
Ddrb = &B11111111
Ddrd = &B00000000
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1
Portd.7 = 1

Enable Interrupts
Config Clock = Soft
Declare Sub Stunde
Declare Sub Minute
Declare Sub Menue
Declare Sub Stundew
Declare Sub Minutew
Declare Sub Onoff
Declare Sub Licht
Declare Sub Stellenmenue

Dim Modus As Byte
Dim Stellenstunde As Byte
Dim Stellenminute As Byte
Dim Konfiguration As Byte
Dim Anaus As Byte


Cls

Time$ = "00:00:00"

Do
   Locate 1 , 1
   Lcd Time$ ; "  " ;
   Locate 1 , 12
   If Stellenstunde < 10 Then Lcd "0"
   Lcd Stellenstunde ; ":"
         If Stellenminute < 10 Then Lcd "0"
         Lcd Stellenminute


   Debounce Pind.2 , 0 , Menue , Sub
      If Modus = 0 Then
         Locate 2 , 1
         Wait 1
         Lcd "Aus  "
      End If


      If Modus = 1 Then
         Locate 2 , 1
         Wait 1
         Lcd "MP3  "
         Portb.0 = 1
      Else
         Portb.0 = 0
      End If

      If Modus = 2 Then
         Locate 2 , 1
         Wait 1
         Lcd "Radio"
         Portb.1 = 1
      Else
         Portb.1 = 0
      End If

      If Modus = 3 Then
         Locate 2 , 1
         Wait 1
         Lcd "AUX  "
         Portb.2 = 1
      Else
         Portb.2 = 0
      End If

   Debounce Pind.3 , 0 , Stellenmenue , Sub


   If Konfiguration = 1 Then                                'Wecker 
stellen
      Debounce Pind.4 , 0 , Stundew , Sub
      Debounce Pind.5 , 0 , Minutew , Sub
   End If


   If Konfiguration = 2 Then                                'Uhr stellen
      Debounce Pind.4 , 0 , Stunde , Sub
      Debounce Pind.5 , 0 , Minute , Sub
   End If

   Debounce Pind.6 , 0 , Onoff , Sub

   If Konfiguration = 0 Then                                'Wecker 
an/aus
          If Anaus = 0 Then
            Locate 2 , 11
            Wait 1
            Lcd "   aus"
          End If

         If Anaus = 1 Then
            Locate 2 , 11
            Wait 1
            Lcd "    an"
         End If
   End If


   If Stellenstunde = _hour And Stellenminute = _min And Anaus = 1 Then
               Portb.5 = 1
               Else
               Portb.5 = 0
   End If


   Debounce Pind.7 , 0 , Licht , Sub

Loop



'Stellenmenü                                                'Menü zum 
einstellen Wecker/Uhr
Stellenmenue:
Incr Konfiguration
   If Konfiguration = 3 Then Konfiguration = 0
   Locate 2 , 11

   If Konfiguration = 0 Then
      Locate 2 , 11
   End If


   If Konfiguration = 1 Then
      Locate 2 , 11
      Wait 1
      Lcd "Wecker"
   End If



   If Konfiguration = 2 Then
      Locate 2 , 11
      Wait 1
      Lcd "   Uhr"
   End If
Return


'Menü                                                       'Menü MP3, 
Radio, Aux
Menue:
Incr Modus
   If Modus = 4 Then Modus = 0
Return



'Stunde                                                    'Hier wird 
die Stunde der Uhr hochgezählt
Stunde:
   Incr _hour
   If _hour > 23 Then
      _hour = 00
   End If
Return



'Minute                                                     'Hier wird 
die Minute der Uhr hochgezählt
Minute:
   Incr _min
   If _min > 59 Then
      _min = 00
   End If

Return



'MinuteW                                                    'Hier wird 
die Minute des Weckers hochgezählt
Minutew:
Incr Stellenminute
   If Stellenminute > 59 Then
   Stellenminute = 0
   End If
Return



'Stundew                                                    'Hier wird 
die Stunde des Weckers hochgezählt
Stundew:
Incr Stellenstunde
   If Stellenstunde > 23 Then
   Stellenstunde = 0
   End If
Return



'onoff                                                      'Hier wird 
der Wecker ein- und ausgeschaltet
Onoff:
Incr Anaus
   If Anaus = 2 Then Anaus = 0
Return




'Licht                                                      'Hier wird 
das Licht für 4 Sekunden eingeschaltet
Licht:

   Portc.5 = 1
   Wait 4

Return

von Karl H. (kbuchegg)


Lesenswert?

Das Hinschreiben auf das LCD dauert schon seine Zeit.
Es ist daher sinnvoll dieses Hinpinseln nur dann zu machen, wenn es auch 
tatsächlich notwendig ist.

Zum Beispiel wird sich ja die Weckzeit nicht so oft verändern. Wenn sie 
also bereits auf dem LCD sichtbar ist, dann ist es in 99.9% aller Fälle 
nur ein Zeitfresser, sie erneut hinzupinseln.
Selbiges mit dem Modus und im Grunde auch mit der Zeit, allerdings ist 
es bei der Zeit nicht mehr ganz so einfach da Gegenmassnahmen zu 
ergreifen :-)

Auch: Kannst du mal erklären, was eigentlich die ganzen Wait, die da 
üerall rumlungern, für einen Sinn haben, ausser Rechenzeit zu 
verbrauchen?

Sieh dir mal diese Funktionalität an
1
Stellenmenue:
2
Incr Konfiguration
3
   If Konfiguration = 3 Then Konfiguration = 0
4
   Locate 2 , 11
5
6
   If Konfiguration = 0 Then
7
      Locate 2 , 11
8
   End If
9
10
11
   If Konfiguration = 1 Then
12
      Locate 2 , 11
13
      Wait 1
14
      Lcd "Wecker"
15
   End If
16
17
18
19
   If Konfiguration = 2 Then
20
      Locate 2 , 11
21
      Wait 1
22
      Lcd "   Uhr"
23
   End If
24
Return

und dann stell dir die Frage, wie oft da eigentlich Locate 2, 11 gemacht 
wird. (Hintergrund: Alle LCD Funktionen sind langsam, ein Locate ist 
eine LCD Funktione, ergo ...)

Aber auch: Wenn die Konfiguration beispielswese 0 ist, so dass dieser if 
hier
1
  If Konfiguration = 0 Then
2
      Locate 2 , 11
3
   End If
genommen wird, dann ist es völlig sinnlos, danach abzufragen, ob 
Konfiguration gleich 1 ist ...
1
   If Konfiguration = 1 Then
2
      Locate 2 , 11
3
      Wait 1
4
      Lcd "Wecker"
5
   End If
..., denn das kann nicht sein. Wir wissen ja bereits, dass Konfiguration 
gleich 0 war und damit kann es nicht gleichzeitig den Wert 1 haben. 
Deine Stichworte dazu:
if  - elseif - else - end if
insbesondere elseif ist an dieser Stelle nützlich

von Z. Z. (Gast)


Lesenswert?

womit wir nun bald an den Punkt kommen den ich ganz oben schon 
angesprochen habe!

du benötigst abfragen ob sich was geändert hat... z.B. die Zeit... ist 
schon eine Sekunde vergangen? nein, dann geh im hauptprogramm weiter und 
check die taster ob vielleicht irgendendeiner gedrückt ist, nein? dann 
check mal ob sich was geändert hat... ja? dann "pinsel" mal die neue 
Sekunde auf das display..... tastencheck? nein? ...usw.

von Matthias Knab (Gast)


Lesenswert?

danke mit dem rausnehmen der waits hat es nun geklappt. war zu anfang 
ein vorgefertigtes programm was letztlich wohl überhaupt keine 
ähnlichkeit mehr hat mit dem hier. deshalb habe ich gedacht die waits 
wären sinnvoll. nur wurde ich jetzt eines besseren belehrt.

danke an alle die mitgeholfen haben mein erstes programm zu schreiben.

von Karl H. (kbuchegg)


Lesenswert?

Matthias Knab schrieb:
> danke mit dem rausnehmen der waits hat es nun geklappt.

Oh. Da ist noch viel mehr Potential!
Verblüfft mich eigentlich, dass das Rausnehmen der Wait einen so 
'durchschlagenden' Erfolg beschert. Hätte ich ehrlich nicht erwartet.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.