-
Bascom Uhr Problem
Servus
ich bin gerade dabei eine Uhr mit Wecker und Datum zu programmieren. Das
ganze mache ich mit Bascom.
Nun habe ich hier zwei Probleme und zwar
1. Ich will das Licht mittels eines Distanzsensors einschalten welcher
an dem Analog Eingang Pinc.0 angeschlossen ist. Hierfür verwende ich
einen Sharp GP2D12.
Im bereich Analogwertverarbeitung bin ich nicht so fit deshalb wollte
ich fragen ob in meinem Programm jemand einen Fehler findet warum mein
Licht sich nicht einschaltet.
Bereich des Sensors sind 10-80cm. Ich will ungefähr 20-30cm haben muss
also nicht genau sein.
2. Problem ist wenn ich mit der Uhr durchtappe duch mein Menü und ich
will den Wecker stellen bleiben immer die Sekunden der Uhr rechts neben
dem Wecker stehen. Weiß jemand wie ich das hinbekomme damit die Sekunden
weg sind?
Hier mein Code. Ich weiß dass die Datumsverarbeitung fehlt. Seit bitte
nachsichtig.
Code:
$regfile = "m8def.dat"
$crystal = 1000000
$baud = 19200
$hwstack = 32
$swstack = 10
$framesize = 40
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 ,
Db7 = Portb.4 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Config Lcdbus = 4
Cursor Off
Config Portb.0 = Output
Config Portb.5 = Output
Config Portb.1 = Output
Config Pind.0 = Input
Config Pind.1 = Input
Config Pind.2 = Input
Config Pind.3 = Input
Config Pinc.0 = Input
Const Adc_multi = 0.00244140625
Config Adc = Single , Prescaler = Auto
Start Adc
Portd.0 = 1
Portd.1 = 1
Portd.2 = 1
Portd.3 = 1
Enable Interrupts
Config Clock = Soft
Config Date = Mdy , Separator = /
Declare Sub Stunde
Declare Sub Minute
Declare Sub Stundew
Declare Sub Minutew
Declare Sub Onoff
Declare Sub Licht
Declare Sub Stellenmenue
Dim Stellenstunde As Byte
Dim Stellenminute As Byte
Dim Konfiguration As Byte
Dim Anaus As Byte
Dim Messung As Word
Messung = Getadc(0)
Cls
Time$ = "00:00:00"
Date$ = "01/01/00"
Do
If Konfiguration = 1 Then
Locate 1 , 1
If Stellenstunde < 10 Then Lcd "0"
Lcd Stellenstunde ; ":"
If Stellenminute < 10 Then Lcd "0"
Lcd Stellenminute
End If
Locate 2 , 9
Lcd Date$
Debounce Pind.0 , 0 , Stellenmenue , Sub
If Konfiguration = 0 Or Konfiguration = 2 Or Konfiguration = 3 Then
Locate 1 , 1
Lcd Time$
End If
If Konfiguration = 1 Then 'Wecker
stellen
Debounce Pind.1 , 0 , Stundew , Sub
Debounce Pind.2 , 0 , Minutew , Sub
End If
If Konfiguration = 2 Then 'Uhr stellen
Debounce Pind.1 , 0 , Stunde , Sub
Debounce Pind.2 , 0 , Minute , Sub
End If
Debounce Pind.3 , 0 , Onoff , Sub
If Konfiguration = 0 And Anaus = 0 Then 'Wecker
an/aus
Locate 2 , 1
Lcd "aus "
End If
If Konfiguration = 0 And Anaus = 1 Then
Locate 2 , 1
Lcd "an "
End If
If Stellenstunde = _hour And Stellenminute = _min And Anaus = 1 Then
Portb.1 = 1
Else
Portb.1 = 0
End If
If Messung < 500 Then
Portb.5 = 0
Else
Portb.5 = 1
End If
Loop
'Stellenmenü 'Menü zum
einstellen Wecker/Uhr/Datum
Stellenmenue:
Incr Konfiguration
If Konfiguration = 4 Then Konfiguration = 0
If Konfiguration = 1 Then
Locate 2 , 1
Lcd "Wecker"
End If
If Konfiguration = 2 Then
Locate 2 , 1
Lcd "Uhr "
End If
If Konfiguration = 3 Then
Locate 2 , 1
Lcd "Datum "
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
Return
-
Hi, soweit ich das auf die schnelle erkennen konnte wird die Messung des ADC Wertes nur einmal bei Programmbeginn gestartet aber in deiner Hauptschleife dann nicht mehr, versuch mal " Messung = Getadc(0)" in die Schleife, also nach das " Do" zu setzen.
Gruß Kalle
-
Ja du musst die Messung des ADC Wertes in jedem Schleifendurchlauf machen. Sonst macht er die Messung nur 1x und behält den Wert dann immer.
Und mir ist nochwas aufgefallen. In der Bascom-Hilfe steht unter "Config Clock" das hier
Notice that you need to connect a 32768 Hz crystal in order to use the timer in async mode, the mode that is used for the clock timer.
Und du schreibst in deinem Programm das du die Uhr mit 1MHz betreibst. Das stört die funktion des Programmes zwar nicht aber die Uhr läuft dann nicht genau.
Edit: Hab den Befehl "Messung = Getadc(0)" mal direkt hinter das Loop gesetzt und eine Simulation gemacht und nun funktioniert es. Sobald der ADC-Wert 499 übersteigt wird das Licht ausgemacht.
-
das mit der uhr hab ich nun schon sehr oft gehört. einer sagt das der andere dies.
mittlerweile hab ich mal im buch von roland walter nachgelesen und da steht was drinn von wegen dass man den internen oscilator verwenden muss und dann einen uhrenquarz verwenden muss.
das hat sich meines erachtens auch bestätigt. nämlich wenn der quarz nicht angeschlossen ist läuft die uhr nicht los.
habe nun die analogwertabfrage in die do schleife gemacht. nur tut sich immernoch nix. ich vermute dass die angaben (welche ich aus einem tutorial habe) nicht stimmen.
oben deklariere ich Messung als Word und unten fragen ich ab ob es 500 ist, was ja integer ist oder?
somit passt das ja nicht liege ich da richtig?
-
Ja aber theoretisch (bitte korrigieren wenn falsch!) stellste am Controller ja einen festen Teiler ein sobald du die Uhr da aktivierst. Und dieser Teiler ist ja auf 32768kHz ausgelegt (ähnlich wie bei einer I²C RTC) und wenn du dann einen anderen Takt nimmst ist 1 Sekunde im Controller nicht mehr 1 Sekunde wie sie sein soll, sondern vielleicht 3 Sekunden oder so.
Aber wie gesagt ist nur ein theoretischer Gedankengang.
Und wegend einen Sekunden beim Wecker
Ich hab das mal so gemacht:
Code:
If Konfiguration = 1 Then
Cls
Locate 2 , 1
Lcd "Wecker"
End If
Dann wird jedesmal die Anzeige gelöscht, weil es wohl so ist das er die Stellen von der Option "Uhr" übernimmt, weil du im Endeffekt nur die Stellen "Stunden" und "Minuten" überschreibst. Aber da du mit der Stelle "Sekunden" nichts macht bleibt das natürlich gesetzt. Durch das löschen löscht du den Inhalt und schreibst die neuen Sachen auf das Display. Kleiner Nachteil: Es "blinkt" einmal kurz.
-
dass hab ich auch als erstes so gemacht hat aber zur folge gehabt dass die unteren zeilen dann weg waren.
habs nun so gemacht:
Code:
Do
If Konfiguration = 1 Then
Locate 1 , 1
If Stellenstunde < 10 Then Lcd "0"
Lcd Stellenstunde; ":"
If Stellenminute < 10 Then Lcd "0"
Lcd Stellenminute; " "
End If
nur dass mit dem sensor funktioniert immernoch nicht obwohl es mittlerweile in der do schleife drinn ist.
-
hab mir nun den analogwert am display ausgeben lassen der bleibt aber dauernd bei 1023 stehen. da verändert sich nix. woran kann das liegen?
-
HAst du mal geguckt ob der Sensor überhaupt eine Spannung ausgibt? Wenn ja liegts noch an dem Programm. Und wie meinst du das mit den untersten Zeilen weg? Kann das halt nur simulieren da ich deinen genauen Aufbau nicht kenne. Wäre für mich ganz interessant welcher Teil dann komplett weg ist, weil die Simulation hat eigtl alles richtig gemacht, aber ist halt nur eine Simulation O:)
-
also mit unterste zeile weg meine ich dass zwar die weckzeit dann da ist. aber der rest halt eben nicht mehr.
spannung ist vorhanden rotes licht ist zu erkennen. spannung ändert sich auch gerade nachgemessen.
-
Ich habe so die Befürchtung das es daran liegt:
Config Pinc.0 = Input
mach das mal weg und probier es erneut.