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
:
Verschoben durch User
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.