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?
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!
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?
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!
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.
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!
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?
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?
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 ...
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
'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.
> 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.
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.
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?
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.
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?
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
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.
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
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.
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?
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.
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.
$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
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.
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
$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?
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
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
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.
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.
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.