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.
$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
> 2. Problem ist wenn ich mit der Uhr durchtappe duch mein Menü und ich> will den Wecker stellen
Schreib einfach noch ein paar Leerzeichen hinter die Weckzeit...
Yamaharacer schrieb:> 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.
1
....
2
Dim Stellenstunde As Byte
3
Dim Stellenminute As Byte
4
Dim Konfiguration As Byte
5
Dim Anaus As Byte
6
Dim Messung As Word
7
Messung = Getadc(0) ; <------ hier wird der ADC abgefragt
8
; soll so sein. Aber innerhalb der Schleife dann
9
; nicht mehr
10
11
Cls
12
13
Time$ = "00:00:00"
14
Date$ = "01/01/00"
15
16
Do
17
If Konfiguration = 1 Then
18
Locate 1 , 1
19
If Stellenstunde < 10 Then Lcd "0"
20
...
Solange du den ADC nur einmal ausserhalb der Hauptschleife abfragst,
wird das wohl nichts mit einer laufenden Messung.
ja und wenn ich das
Lothar Miller schrieb:> Schreib einfach noch ein paar Leerzeichen hinter die Weckzeit...
hab ich schon versucht dann werden die nuller der minute meiner weckzeit
einfach um die leerzeichen nach rechts verschoben.
Karl heinz Buchegger schrieb:> Solange du den ADC nur einmal ausserhalb der Hauptschleife abfragst,> wird das wohl nichts mit einer laufenden Messung.
und wenn ich das ganze in die do schleife einbinde wird er dann die
ganze zeit überwacht? stimmt denn meine angabe unten mit 500? kommt mir
nämlich komisch vor da ich messung als word deklariere und unten dann
500 also quasi integer schreibe.
hab das mit der analogwertverarbeitung aus dem internet also nicht mein
werk. frag nur mal nach.
Yamaharacer schrieb:> hab das mit der analogwertverarbeitung aus dem internet also nicht mein> werk. frag nur mal nach.
Ähm.
Das ist auch nicht anders, als wie wenn du einen digitalen Eingang
abfragst. Nur dass du die getadc Funktion aufrufen musst um einen
Messwert zu bekommen.
Warum probierst du den nicht einfach ein Testprogramm, mit dem du den
Sensor ausprobierst?
1
In einer Schleife ständig
2
3
ADC Abfragen
4
Messwert ausgeben
Dann weißt du, welche Werte du bekommst und kannst auch mit der Hand
probieren ob und wie sich die Werte verändern.
Als Bascom Spezi hast du das in 2 Minuten geschrieben und dann weißt du
was Sache ist.
Yamaharacer schrieb:> hab ich schon versucht dann werden die nuller der minute meiner weckzeit> einfach um die leerzeichen nach rechts verschoben.
Was genau hast du geändert?
Sag mal.
Ist dein Programm im BASCOM Editor genauso sinnentstellend eingerückt
wie hier im Forum?
Dann wundert es mich nicht, dass du keine Fehler siehst oder
Modifikationen korrekt durchführen kannst.
Karl heinz Buchegger schrieb:> Warum probierst du den nicht einfach ein Testprogramm, mit dem du den> Sensor ausprobierst?> In einer Schleife ständig>> ADC Abfragen> Messwert ausgeben>> Dann weißt du, welche Werte du bekommst und kannst auch mit der Hand> probieren ob und wie sich die Werte verändern.>> Als Bascom Spezi hast du das in 2 Minuten geschrieben und dann weißt du> was Sache ist.
und wie sehe ich das? gibts da programme wie ich das ganze am pc
sichtbar machen kann?
Karl heinz Buchegger schrieb:> Was genau hast du geändert?
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
hier habe ich bei ":" leerzeichen eingefügt ": "
So wie das End If geschrieben ist suggeriert das auf die Schnelle, dass
es zum If 2 Zeilen darüber gehört.
Das
1
Lcd Stellenstunde ; ":"
suggeriert durch seine Einrückung, dass es in Abhängigkeit vom If genau
darüber steht. Pustekuchen, das ist nicht der Fall. Die LCD Ausgabe
hängt von gar nichts ab.
Mit korrekter Einrückung sieht das so aus
1
Do
2
If Konfiguration = 1 Then
3
Locate 1 , 1
4
5
If Stellenstunde < 10 Then Lcd "0"
6
Lcd Stellenstunde; ":"
7
8
If Stellenminute < 10 Then Lcd "0"
9
Lcd Stellenminute
10
11
End If
12
13
Locate 2 , 9
Und wenn der vorgeschlagene 'Fix' darin besteht, einfach nach der
Weckzeit noch 2 Leerzeichen auszugeben, dann kann das nur so sein ....
1
Do
2
If Konfiguration = 1 Then
3
Locate 1 , 1
4
5
If Stellenstunde < 10 Then Lcd "0"
6
Lcd Stellenstunde; ":"
7
8
If Stellenminute < 10 Then Lcd "0"
9
Lcd Stellenminute; " "
10
11
End If
12
13
Locate 2 , 9
.... denn jetzt wird nach den Stunden, dem ':' und den Minuten noch 2
Leerzeichen ausgegeben. Nachdem die Weckzeit komplett ausgegeben
wurde. Und komplett bedeutet Stunden UND Minuten. Da können die Minuten
nicht um 2 Stellen nach rechts rutschen.
Yamaharacer schrieb:> Karl heinz Buchegger schrieb:>> Warum probierst du den nicht einfach ein Testprogramm, mit dem du den>> Sensor ausprobierst?>> In einer Schleife ständig>>>> ADC Abfragen>> Messwert ausgeben>>>> Dann weißt du, welche Werte du bekommst und kannst auch mit der Hand>> probieren ob und wie sich die Werte verändern.>>>> Als Bascom Spezi hast du das in 2 Minuten geschrieben und dann weißt du>> was Sache ist.>> und wie sehe ich das?
Ähm.
Du hast ein LCD zur Verfügung!
Da kann man was drauf schreiben lassen. Zb Werte die man vom ADC
bekommt.
>> Was genau hast du geändert?>> 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>> hier habe ich bei ":" leerzeichen eingefügt ": "
Und warum machst du die Leerzeichen vor der Ausgabe der Minuten?
Die komplette Weckzeit besteht aus Stunden UND Minuten! Wenn du die
Leerzeichen hinter der Weckzeit haben willst, dann musst du schon die
Minuten auch ausgeben und erst dann 2 Leerzeichen dahinter setzen!
<Kopfschüttel>
Irgendwie habe ich das Gefühl, du denkst du brauchst nur irgendwas
hinschreiben und der µC sucht sich dann schon selbst zusammen, in
welcher Reihenfolge die Dinge gemacht werden müssen, damit das
rauskommt, was dir vorschwebt.
Dem ist nicht so! Ein BASCOM Programm ist nicht Excel, bei dem ein
ausgefuchster Algorithmus rausfindet in welcher Reihenfolge die Zellen
zu aktualisieren sind.
(Alle anderen: nicht lachen. Das gibts wirklich, dass notorische Excel
Benutzer das als gegeben voraussetzen)
Yamaharacer schrieb:> hat nix gebracht. jetzt wird die sekunden zahl einfach nach rechts> hinter die minutenzahl der weckzeit geschoben.
Das kann nicht sein.
Denn bei der Ausgabe der aktuellen Zeit hier
1
If Konfiguration = 0 Or Konfiguration = 2 Or Konfiguration = 3 Then
2
Locate 1 , 1
3
Lcd Time$
4
End If
positionierst du den Cursor neu an die Position 1,1 ehe die Normalzeit
ausgegeben wird.
Zudem sind die if so gestaltet, dass entweder
die Normalzeit
oder
die Weckzeit ausgegeben wird
Wird die Weckzeit nicht ausgegeben, dann wird die Normalzeit ausgegeben
und umgekehrt. Die Ausgabe der Weckzeit beeinflusst daher die Ausgabe
der Normalzeit überhaupt nicht. Mann muss nur dafür sorgen, dass bei der
Ausgabe der Weckzeit eventuelle Überbleibsel der Normalzeit (wie zb die
Sekunden) durch Leerzeichen überschrieben werden. Und genau das machen
die 2 Leerzeichen.
Wahrscheinlich sollten es 3 Leerzeichen sein, denn die Zeit wird meines
Wissens so dargestellt
10:12.45
Ob das jetzt vor den Sekunden ein . ist oder ein : kann ich nicht sagen
(ist auch egal, es ist einfach nur ein Zeichen), aber auf jeden Fall ist
die Differenz von
09:45 <- Weckzeit
und 10:12:45
3 Zeichen, die mit Leerzeichen übermalt werden müssen.
Steht am LCD die aktuelle Anzeige
10:12:45
und will man die durch
09:45
austauschen, dann müssen nach Ausgabe der Minuten noch 3 Zeichen mit
Leerzeichen übermalt werden.
10:12:45
09:45
^^^
|||
||+----- das 3te Zeichen, das übermalt werden muss
||
|+------ das 2te Zeichen, das übermalt werden muss
|
+------- das 1te Zeichen, das übermalt werden muss
Tust du das nicht, dann wird aus
10:12:45
durch Übermalen mit "09:45" auf dem LCD
09:45:45
Übermalst du bei einer Normalzeit
10:12:45
nur mit 2 Leerzeichen bei der Weckzeit, dann wird daraus
09:45 5
Also: Ein bischen besser beobachten was sich auf dem LCD tut und daraus
dann Schlüsse ziehen.
Yamaharacer schrieb:> och logisch. danke schon mal.>> nur das mit der analogwertverarbeitung wie kann ich diese nun auslesen?
Hast du doch schon!
GetADC macht doch genau das!
Den Wert von GetADC holst du dir in die Variable Messung. So wie du das
bisher auch gemacht hast. Nur halt innerhalb der Schleife. Sobald du den
Wert in der Variablen Messung vorliegen hast, ist das einfach nur noch
ein Wert in einer Variablen. So wie StellenStunde auch nur ein Wert in
einer Variablen ist.
Wie hast du denn Stellenstunde ausgegeben?
Und genau das gleiche machst du auch mit der Variablen Messung nachdem
du dir vom ADC den neuen Wert geholt hast.
Such dir einen Platz auf dem LCD, schick den Cursor mit Locate dort hin
und gib die Variable aus. Das ist doch Kinderkram, mit welchen Problemen
du dich da herumschlägst! Man könnte meinen, du verstehst von deinem
eigenen Programm noch nicht einmal die Funktionsweise von weniger als
10% des Codes. Und selbst die auch nur holprig.
Yamaharacer schrieb:> tja sieht wohl so aus. und ist auch so. is ja schließlich nicht mein> beruf sondern hobby.
Ich kann mich daran erinnern, dass du vor ein paar Wochen schon mit
deinem Wecker gekommen bist.
Ganz ehrlich.
Such dir ein anderes Hobby. Programmieren ist nichts für dich.
Das ist keine Schande und du kannst auch nichts dafür. Aber für dich
wird das immer ein Buch mit 7 Siegeln bleiben, das du nicht knacken
kannst, wenn das was du heute gezeigt hast, deine ganzen Fortschritte in
der Zwischenzeit sind.
Yamaharacer schrieb:> habs nun so gemacht wie du sagtest. auf dem lcd display steht nun> dauerhaft 1023.
Das bedeutet, dass der ADC ständig seinen Maximalwert liefert.
Der ADC liefert Werte von 0 bis 1023
Also schnapp dir ein Voltmeter und miss einmal nach, ob sich die
Ausgangsspannung vom Sensor überhaupt ändert, wenn du mit der Hand davor
rumfuchtelst
(von welcher Website hast du die ADC Initialisierung gestohlen?)
Dieses Programm dreht sich einzig und alleine darum, den ADC am Kanal 0
auszulesen und das gelesene am LCD anzuzeigen.
So probiert man Dinge aus, die man zum ersten mal macht. Losgelöst von
allem anderen. Konzentration auf das Neue.
Config Adc = Single , Prescaler = Auto , Reference = AVCC
Ich bin mir nicht sicher, welche Referenz beim Mega8 standardmässig
hergenommen wird. Sicher ist sicher, also selbst angeben und nicht auf
den Compiler verlasssen.
Karl heinz Buchegger schrieb:> Reference = AVCC
ohh man das hab ich vorhin noch rausgenommen weils in nem beispiel
welches ich angeschaut habe nicht drinn war. jetzt geht das ganze zwar
nur von 0-600 aber es geht.
danke an alle. auch für die geduld vielen dank.
Yamaharacer schrieb:> Karl heinz Buchegger schrieb:>> Reference = AVCC>> ohh man das hab ich vorhin noch rausgenommen weils in nem beispiel> welches ich angeschaut habe nicht drinn war. jetzt geht das ganze zwar> nur von 0-600 aber es geht.
Das klingt plausibel.
Laut Datenblatt vom Sensor liefert der Spannungen von 0 bis ~2.6 Volt.
5 V ...... 1024
2.6 V ..... x
----------------------
2.6 * 1024
x = ------------ = ungefähr 600
5
jo habs auch so errechnet.
nun habe ich jedoch ein weiteres problem das einschalten des lichts
klappt nun wunderbar nur wenn ich das licht einschalte bleibt die uhr
stehen und läuft nachdem das licht aus ist erst weiter.
ebenso funktioniert mein vorhaben nicht dass das licht zwischen 20 und 8
uhr ausgeschaltet bleiben soll.
hier mein ansatz:
Messung = Getadc (0)
If Messung > 300 OR _hour > 20 and _hour < 8 then
Portb.5 = 0
wait 5
else
Portb.5 = 1
End If
sobald ich die uhr stelle bleibt das licht dauernd ab wenn ich die uhr
nicht stelle geht wenigstens die funktion mit dem sensor dass das licht
5 sekunden an bleibt und dann aus geht.
habs rausgefunden:
statt:
If Messung > 300 OR _hour > 20 and _hour < 8 then
dieses:
If Messung > 300 OR _hour > 20 or _hour < 8 then
jetzt funktioniert das ganze nur will ich dass das licht wenn ich den
sensor betätige 4 sekunden an bleibt. werd mich vll morgen nochmal drann
setzten.
so hab das ganze nun gelöst mit dem licht. hier mein weg:
Messung = Getadc (0)
If _hour > 20 or _hour < 8 then
Portb.5 = 1
If Messung > 300 then
portb.5 = 1
wait 5
end if
else
Portb.5 = 0
End If
weiß zufällig jemand wie ich das mit dem datum einfach realisieren kann?