www.mikrocontroller.net

Forum: PC-Programmierung Uhr Bascom problem


Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso und die uhr startet gar nicht.

Autor: Z. Z. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Z. Z. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
do
'das ist mein Hauptrogramm
   debounce pind.1, 0, stunde,sub

loop

sub stunde
'hier steht dein Text
end sub 


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

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Z. Z. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok hab den fehler hab sub nicht declariert

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Z. Z. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Z. Z. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Vergleich mal
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
  Incr _hour

  If _hour > 23 Then
    _hour = 00
  End If
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

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beitrag "Re: Format-Fehler bei Bascom LCD-Ausgabe??"

' ...

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

Time$ = "00:00:00"

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

   I = Format(str(Stellenminute), "00")
   S = Format(str(Stellenstunde), "00")
   Lcd S ; ":" ; I

' ...

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
Dim S As String * 3 ' Platz für 0..255 
Dim I As String * 3 ' Platz für 0..255

'...

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

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Knab (Gast)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach es halt von Hand
   Lcd Stellenstunde/10 ; Stellenstunde-Stellenstunde/10 ; ":" ; Stellenminute/10 ; Stellenminute-Stellenminute/10 ;

Autor: Matthias Knab (Gast)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gott hilf!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bin jetzt soweit fertig nur mit welchem befehl startet man denn die uhr?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
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

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
  If Konfiguration = 0 Then
      Locate 2 , 11
   End If
genommen wird, dann ist es völlig sinnlos, danach abzufragen, ob 
Konfiguration gleich 1 ist ...
   If Konfiguration = 1 Then
      Locate 2 , 11
      Wait 1
      Lcd "Wecker"
   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

Autor: Z. Z. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Knab (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.