PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom Uhr Problem



xbgamer
30.06.2010, 15:20
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

kalletronic
30.06.2010, 15:45
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

Kampi
30.06.2010, 15:56
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.

xbgamer
30.06.2010, 16:05
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?

Kampi
30.06.2010, 16:16
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:



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.

xbgamer
30.06.2010, 16:49
dass hab ich auch als erstes so gemacht hat aber zur folge gehabt dass die unteren zeilen dann weg waren.

habs nun so gemacht:


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.

xbgamer
30.06.2010, 16:58
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?

Kampi
30.06.2010, 16:59
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:)

xbgamer
30.06.2010, 17:04
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.

Kampi
30.06.2010, 17:40
Ich habe so die Befürchtung das es daran liegt:

Config Pinc.0 = Input

mach das mal weg und probier es erneut.

xbgamer
30.06.2010, 18:07
habs gefunden Reference = AVCC hat gefehlt bzw war in dem beispiel welches ich durchgelesen habe nicht drinn.

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

peterfido
30.06.2010, 19:44
Die Stunde kann nicht gleichzeitig >20 und <8 sein. Da muß auch ein or rein.

xbgamer
30.06.2010, 21:25
danke so funktioniert es nur will ich auch wenn ich den sensor betätige dass das licht 5 sekunden an bleibt wenn ich allerdings:

Messung = Getadc (0)
If Messung > 300 OR _hour > 20 or _hour < 8 then
Portb.5 = 1
wait 5
else
Portb.5 = 0
End If

schreibe frisst es irgendwie die gesamte rechenleistung. da geht dann gar nix mehr. kann nix mehr bedienen. weiß da jemand rat?

Kampi
30.06.2010, 22:13
Eventuell hast du damit unbewusst sowas wie eine Endlosschleife programmiert wo der Controller nicht raus kommt.

xbgamer
01.07.2010, 07:53
naja sie läuft schon los aber extrem langsam. so sprunghaft.

Kampi
01.07.2010, 08:18
mmh was ich eigentlich schon gestern Fragen wollte aber wo ich nicht zu gekommen bin......
Wofür hast du das Sub in Zeilen dieser Art?

Debounce Pind.0 , 0 , Stellenmenue , Sub

xbgamer
01.07.2010, 09:00
ach danke hab ich wohl vergessen rauszunehmen. dieser code war früher mal in einem anderen projekt von mir drinn den hab ich dann einfach editiert und hab dass dann wohl vergessen rauszunehmen.

for_ro
01.07.2010, 12:40
ach danke hab ich wohl vergessen rauszunehmen.
Ne, lass die mal besser drin.
Stellenmenue ist eine Sub, die mit einem Return abgeschlossen ist. Nach Ende der Sub macht das Programm mit dem nächsten Befehl hinter dem Debounce weiter. Damit diese Adresse im Stack liegt, muss das SUB dahinten dran. Ansonsten springt das Programm irgendwo anders hin.

Kampi
01.07.2010, 12:44
mmmh ist das nicht so das die Sachen wie "Stellenmenue" nur Pointer zu diesem Punkt sind? Weil damit der "Sub" Befehlt richtig funktioniert, muss hinter dem Sub doch noch ein Name für das Unterprogramm.
Oder werf ich da was durcheinander?

xbgamer
01.07.2010, 15:39
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?

peterfido
01.07.2010, 17:26
Wait 5 ist ganz schlecht. Das hält das Programm 5 Sekunden lang an.

Ich rufe in meinen Programmen im sectic solche Aufgaben. sectic wird bei Bascom sekündlich angesprungen, wenn in der config dcf77 oder config clock angegeben.


dim Lichtzeit as byte
Licht alias portb.5
.
.
.
do
if messung >300 then
lichtzeit=5
set licht
end if


loop
end

sectic:
if lichtzeit>0 then
decr lichtzeit
end if
if lichtzeit=0 then reset licht
return

...

Die Sekunden bekommst du weg, indem du hinter dem lcd date$ noch ein


lcd " "

einsetzt

xbgamer
01.07.2010, 18:23
jo das mit dem date habe ich schon hinbekommen. nur wie schreibe ich nun ein programm welches das datum ausgibt?

xbgamer
01.07.2010, 18:35
habs mal so mit sectic rein gemacht allerdings passiert da nichts. das licht schaltet zwar ein aber geht sofort wieder aus. also bleibt keine 5 sekunden eingeschaltet.

peterfido
01.07.2010, 20:18
den ganzen code mal posten...

xbgamer
01.07.2010, 21:33
so hier der code.

vermute allerdings dass es mit dem set befehl was zu tun hat da ich eine 0 zum einschalten des lichts brauche und set macht ja ne 1. habe aber auch schon versucht set und reset zu tauschen hat aber nix gebracht.


$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
dim Lichtzeit as byte
Licht alias portb.5

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

Messung = Getadc (0)
If _hour > 20 or _hour < 8 then
Portb.5 = 1
If Messung > 300 then
lichtzeit = 5
set licht
end if
else
Portb.5 = 0
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

sectic:
if lichtzeit>0 then
decr lichtzeit
end if
if lichtzeit=0 then reset licht
return

Rone
01.07.2010, 22:36
Hallo!

In einem anderen Forum wurde Dir ja schon geraten,
daß Du Dich eventuell um ein anderes Hobby umschauen sollst.

Du läßt Dir jedes kleines Problemchen von anderen lösen.
Ist selber nachdenken so schwer?
Und vorallem der alte Spruch "Lesen bildet" gilt auch noch heute. Wenn Du in die Bascom Help unter "Config Clock" schaust
und natürlich auch liest was denn da steht, wirds vielleicht
ein wenig heller werden mit Sectic.

MfG
Rone

xbgamer
02.07.2010, 08:05
was denkst du wohl warum ich dort nix mehr poste? weil solche leute wie du ankommen und einem das ganze madig machen.

wenn du nix konstruktives dazu beitragen kannst bitte ich dich im anderen forum in meinen post zu schreiben der is ja dort zugemüllt genug. einmal mehr müll abladen is dort egal.

ich hab zick mal gesagt dass ich anfänger bin. aber irgendwie blickt das keiner. woher soll ich bitte wissen wie man ein programm struckturell aufbaut und wo man welche befehle nimmt? du bist wieder so einer der die weisheit mit dem löffel gegessen hat.

Vitis
02.07.2010, 12:57
nun, es gibt nen Grund warum im µC-net keiner mehr gepostet hat.
Irgendwann haben's die Forenmitglieder leid einem die Arbeit zu machen. Dort wie auch hier im Forum wird es sehr gerne gesehen wenn sich die Leute erstmal Gedanken machen und bei Problemen dann fragen.
Meist wird dann Hilfe zur Selbsthilfe gegeben.
Die Taktik mit "sag mir wie's geht" geht dort wie hier nicht auf.

Wer mir den Cde mal anschaun, vielleicht fällt mir ja was dazu ein.

xbgamer
02.07.2010, 13:18
ja dass ist mir auch klar. aber hier rennen leute rumm die meinen ich hätte wirklich gar nix gemacht dabei habe ich ja nur mit kleinigkeiten probleme und dass halt nur weil ich sie zum ersten mal mache. zb dass mit dem adc oder so.

peterfido
02.07.2010, 17:31
config clock = soft, gosub = sectic

Du schaltest das Licht aber bei der nächsten Gelegenheit wieder ab. Da muss natürlich abgefangen werden, ob die Lichtzeit noch läuft.

Rone
02.07.2010, 18:22
Hallo!

Ich selber bin auch nur Hobbyist und beschäftige mich ca.1 1/2 Jahre
mit µC.
Ich für meinen Teil suche, wenn ein Problem auftaucht, nach einer Lösung
und lese sehr viel und auch in vielen Foren mit.
Da ist es geradezu unwahrscheinlich das die auftauchenden Probleme
noch nirgendwo anders aufgetaucht waren.
Also: Lesen bildet!

Das Du lesefaul bist tut mir leid für dich.

Übrigens: Wenn Du meinen Beitrag gelesen hättest, wäre Dir bestimmt
der Hinweis auf die Bascom Hilfe und Sectic aufgefallen.


Rone

xbgamer
03.07.2010, 11:18
is mir aufgefallen hab ich auch eingegeben nur mein technisches english ist eben nicht so gut. tut mir leid dass wir nicht alle götter sind wie du.

Richard
03.07.2010, 11:38
Mein Bascom kennt anscheinend kein segtic oder ich bin zu
Unbedarft zum Suchen.

Gruß Richard

xbgamer
03.07.2010, 12:11
du musst config clock eingeben da steht es dann drinn. aber is egal von mir aus kann der thread geclosed werden. habs satt dass immer alle meinen nur weil sies blicken müssens andere auch gleich blicken.

also bitte thread closen.