Forum: Mikrocontroller und Digitale Elektronik Uhr Bascom problem


von Matthias Knab (Gast)


Lesenswert?

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
von Matthias Knab (Gast)


Lesenswert?

achja und noch ein problem die uhr läuft nicht los muss ich crystal noch 
auf den uhrenquarz ändern?

von Matthias Knab (Gast)


Lesenswert?

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?

von Matthias Knab (Gast)


Lesenswert?

uhr läuft mittlerweile nur habe ich immernoch das problem mit dem 
relais.

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

Lesenswert?

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 :)

von Matthias Knab (Gast)


Lesenswert?

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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> 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.

von Matthias Knab (Gast)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.