Servus ich habe ein kleines Problem mit meiner Uhr bzw dem Menü.
und zwar will ich einmal wenn die Weckzeit mit der Uhrzeit übereinstimmt
das Radio einschalten und das andere mal wenn ich per hand auf das radio
schalte.
nun scheint es eine überlagerung zu geben. das relais bekommt keine
sichere haltestellung sondern klackert immer.
da der letzte befehl else 0 ist und der erste setzten auf 1 nehme ich an
dass da der fehler begraben liegt. wie kann ich das am geschicktesten
lösen?
$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.0 = 1
Portd.1 = 1
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 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.0 , 0 , Menue , Sub
If Modus = 0 Then
Locate 2 , 1
Lcd "aus "
End If
If Modus = 1 Then
Locate 2 , 1
Lcd "MP3 "
Portb.0 = 1
Else
Portb.0 = 0
End If
If Modus = 2 Then
Locate 2 , 1
Lcd "Radio"
Portb.1 = 1
Else
Portb.1 = 0
End If
If Modus = 3 Then
Locate 2 , 1
Lcd "AUX "
Portb.2 = 1
Else
Portb.2 = 0
End If
Debounce Pind.1 , 0 , Stellenmenue , Sub
If Konfiguration = 1 Then 'Wecker
stellen
Debounce Pind.2 , 0 , Stundew , Sub
Debounce Pind.3 , 0 , Minutew , Sub
End If
If Konfiguration = 2 Then 'Uhr stellen
Debounce Pind.2 , 0 , Stunde , Sub
Debounce Pind.3 , 0 , Minute , Sub
End If
Debounce Pind.4 , 0 , Onoff , Sub
If Konfiguration = 0 Then 'Wecker
an/aus
If Anaus = 0 Then
Locate 2 , 11
Lcd " aus"
End If
If Anaus = 1 Then
Locate 2 , 11
Lcd " an"
End If
End If
If Stellenstunde = _hour And Stellenminute = _min And Anaus = 1 And
Modus = 0 Then
Portb.1 = 1
Else
Portb.1 = 0
End If
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
Lcd "Wecker"
End If
If Konfiguration = 2 Then
Locate 2 , 11
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
achja und noch ein problem die uhr läuft nicht los muss ich crystal noch auf den uhrenquarz ändern?
kann ich das problem mit dem relais nicht einfach so lösen dass ich einen anderen ausgang für den wecker schalten lasse und den einfach auch auf das relais anschließe? sollte ja eigentlich gehen is nur nicht so ellegant wie wenn ichs mit der software mache. nur muss ich dann 2 dioden einbauen die jeweils gegen den anderen port sperren?
Ich habe Probleme die Taste zu finden, mit der du manuell das Radio ein/aus schalten willst. Für mich wäre es hilfreich, wenn du die Bedienelemente wie in einer Bedienungsanleitung beschreibst. Ich habe mir ausgedacht, dass du eine Taste Modus hast, die den Alarmgeber vorgibt (Aus, MP3, Radio, Aux). Und dass du eine Taste Anaus hast, die manuell das Radio ein/ausschaltet. Wecken tut der Code eine Minute lang, wenn nicht manuell eingeschaltet ist und wenn ein Alarmgeber vorhanden ist und wenn Weckzeit und Uhrzeit übereinstimmen. Eine Minute Wecken wäre mir übrigens deutlich zu kurz, da lacht mein Schnarchheimer nur drüber :)
1 minute weckzeit passt bei mir hab keinen tiefen schlaf wach meistens vor dem wecker auf. anaus is zum an oder ausschalten des weckers. dann habe ich einen taster mit dem ich das menü durchtippe. also aus, mp3, radio und aux dann habe ich einen taster mit dem ich das menü der uhr durchdrücke also: aus, wecker, uhr und zum schluss noch 2 taster mit denen ich diw weck- bzw die uhrzeit einstellen kann.
> anaus is zum an oder ausschalten des weckers.
Ah des Weckers, das passt dann nicht zum Code oben. Im Code oben ist
anaus das manuelle Einschalten/Ausschalten des Radios. Wenn in der 1
Min. Weckphase der Alarm mit anaus ausgeschaltet werden soll, geht das
im Code oben noch nicht.
warum soll das nicht gehen? der wecker klingelt nur wenn minute und stunde übereinstimmen und anaus=1 und modus =1 somit wird der wecker auch ausgeschaltet wenn eben anaus = 0
Oh sorry, muss ich klarstellen: Gemeint ist bei meiner Anmerkung der von
mir geänderte Code in obigem Anhang!
Zur Logik deines Codes bin ich ohne Beschreibung nicht komplett
durchgestiegen u.a. weil ich die folgenden Zeilen irritierend fand.
Statt deine Beschreibung abzuwarten, bin ich zu schnell mit einer
Codeänderung vorgeprescht, sorry!
If Stellenstunde = _hour And Stellenminute = _min
And Anaus = 1 And Modus = 0 Then
Portb.1 = 1
Else
Portb.1 = 0
End If
Dazu deine Beschreibung
> warum soll das nicht gehen? der wecker klingelt nur wenn minute und
> stunde übereinstimmen und anaus=1 und modus =1 somit wird der wecker
> auch ausgeschaltet wenn eben anaus = 0
Ich sehe dann einen Fehler bei der Abfrage "Modus = 0". Dein Wecker
klingelt mit einem stummen Alarmgeber (Modus = 0).
Jetzt der Fall manuelles EIN/AUS des Radios: Das Radio (Modus = 2) wird
in obigem Block immer abgeschaltet. Und das Radio wird bei jeder Runde
DO LOOP an anderer Stelle (s.u.) eingeschaltet.
If Modus = 2 Then
Locate 2 , 1
Lcd "Radio"
Portb.1 = 1
Else
Portb.1 = 0
End If
Das ist dein Klackern.
Jetzt nicht missverstehen, es soll nicht überheblich sein: Insgesamt
bist du an den Punkt gelangt, wo zu viele Features im bisherigen Code
ineinander greifen und eine gewollte Änderung hier ungewollte Änderungen
verursachen.
Es wäre jetzt sinnvoll Version 2 des Programms zu schreiben und dazu
eine Technik zu benutzen, die diese Verzahnung in eine saubere Logik
quetscht. In der IT verwendet man dafür z.B. Zustandsmaschinen. Es gibt
auch einen Artikel dazu: Statemachine.
Zeichne (hier z.B. ein Bild von meinem Suppentimer:
http://www.mikrocontroller.net/articles/Datei:PFA_Suppentimer_Zustand0.png)
dir auf, in welchem Zustand sich dein Wecker befinden kann und durch
welche Aktionen er in einen anderen Zustand kommen soll. Dieses
Grundgerüst setzt du dann in Code um. Das Diagramm als Dokumentation
hilft dann auch bei der Fehlersuche durch dich selbst oder durch Dritte
und es hilft bei der Erweiterung.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.