Forum: Mikrocontroller und Digitale Elektronik Uhr mit Bascom, Mega8 und 3,6MHz Quarz?


von q-stkr (Gast)


Lesenswert?

Hallo zusammen,

ich bin gerade dabei mit meinen Mikrocontroller eine Schaltung zu
realisieren, die auf Basis einer Uhrzeit und analogen Wert
(A/D-Wandler) einen Ausgang schaltet.
Leider muss ich einen 3,6MHz Quarz verwenden. Geht leider nicht anders.
Deswegen ist dieser Ansatz der falsche.

Kennt jemand eine Möglichkeit, oder hat jemand sogar einen
Quelltestansatz, wo man mit o.g. Vorraussetzungen eine Uhr zu
programmieren? Die Genauigkeit spielt hier weniger eine Rolle.

Würde mich über Hilfe sehr freuen!

Gruß
q-stkr

von micha b (Gast)


Lesenswert?

Wo genau ist dein Problem?
Welcher µPC?

von Karl heinz B. (kbucheg)


Lesenswert?

Eine Uhr ist letztendlich auch nichts anderes
als ein Zähler der in regelmäßigen Abständen
hochzählt.

Also: Timer aufsetzen und eine Zeitbasis erzeugen
zb. alle 1ms kommt ein Overflow Interrupt. Die
Anzahl der Overflows zählst du mit. Sind
1000 erreicht (wegen 1ms), ist 1 Sekunde vergangen
und du zählst eine Variable 'Sekunden' hoch. Nach
60 Sekunden kommt 1 Minute mehr, nach 60 Minuten
werden die Stunden um 1 hochgezählt, usw.

von q-stkr (Gast)


Lesenswert?

Hallo,

mein Problem ist das bei dem ATMega8 und Bascom es fertige Routinen
gibt um eine Uhr zu programmieren. (Config Clock) Diese funktioniert
aber nur mit einem 3,2KHz Quarz. Ich habe es getstet und auch schon in
Foren gelesen das es mit meinem 3,6MHz Quarz nicht geht. Deswegen war
die Frage ob jemand eine Möglichkeit kennt eine Uhr mit einem 3,6MHz
Quarz zu programmieren.

Gruß
q-stkr

von micha b (Gast)


Lesenswert?

Du brauchst keinen externen Quarz!

Enable Interrupts
config clock = soft

Date$ = "18.07.06"
Time$ = "10:00:00"

sollte funktionieren....

Deinen Sekundentakt kannst du dann bei der automatisch generiereten
_sec abgreifen.

von q-stkr (Gast)


Lesenswert?

Hallo,

die Idee von Karl Heinz ist nicht schlecht, ich bin nur neu in dem
Metier und bin deswgen nicht so fit in sachen Interrupt aber ich glaube
das werde ich mal versuchen.

Micha, genau das habe ich versucht geht aber leider nicht wegen dem
Quarz. Warum auch immer. Ich kann auf meinen 3,6 MHz Quarz leider nicht
verzichten. In einigen Dokus ist erwähnt das es nur mit einem 3,2 KHz
Quarz geht.

Gruß
q-stkr

von micha b (Gast)


Lesenswert?

Kannst du die Quelle dieser "geht nicht mit 3,6MHz"-Aussage mal
posten?
Man will ja immer noch was dazu lernen... g

Betreibe übrigens den ATM seit 1/2 Jahr durchgehend ohne zusätzlichen
Quarz :-)

von q-stkr (Gast)


Lesenswert?

Hallo,
bevor mich alle korrigieren, man muss einen ca. 32KHz Quarz nutzen, ich
hatte oben mich um eine Dezimalstelle vertan sorry.

Für alle die es interressiert:
http://www.mikrocontroller.net/forum/read-1-103678.html

Gruß
q-stkr

von der inoffizielle WM-Rahul (Gast)


Lesenswert?

Eigentlich sollte es doch auch in Bascom möglich sein, eine Uhr zu Fuß
zu programmieren. (hat Karl-Heinz ja scon angesprochen)

von Digi Clock (Gast)


Angehängte Dateien:

Lesenswert?

hier mal ein ganz simples Beispiel für Bascom.

von q-stkr (Gast)


Lesenswert?

Hallo,

vielen Dank für den Dateianhang. Habe die Uhr schon in mein Programm
integriert. besten Dank dafür.

Ich habe jetzt noch zusätzlich vor die Uhr über einen vom PC gesendeten
Sting zu aktualisieren, wenn PC-Kontakt beteht. Dabei habe ich aber 2
Probleme mit Lösungsansätzen.

Über die serielle Schnittstelle kommt alles in Bitform an. Eine 1 hat
dann zum Beispiel den Wert 49.
Lösungsansatz dazu wäre eine "Tabelle" in Bascom zu erstellen wo das
ganze umgesetzt wird.
Das andere ist ich kann nur Werte von 0 bis 9 schicken, was zum
Beispiel bei der Uhr ab 10 schwierig wird. Auch hier kann ich eine
Tabelle erstellen.

Tavellen sind umfangreich und umstänlich. Gibt es eine elegantere
Lösung wie ich Bytes/Strings aus 2 Werten zusammen setzten kann und wie
ich Werte in einem String auch als wirkliche werte und nicht Ascii-mäßig
ausgegeben bekomme?

Würde mich über Hilfe sehr freuen.

Gruß
q-stkr

von Karl H. (kbuchegg)


Lesenswert?

> Lösungsansatz dazu wäre eine "Tabelle" in Bascom zu erstellen wo
das
> ganze umgesetzt wird.

So'n Quatsch.
Zieh einfach vom Zahlenwert (also den 49) 48 ab und
du hast deine Zahl. Im ASCII Code sind die Codes
für die Zeichen '0' bis '9' schön aufsteigend angeordnet.

> Das andere ist ich kann nur Werte von 0 bis 9 schicken, was zum
> Beispiel bei der Uhr ab 10 schwierig wird. Auch hier kann ich eine
> Tabelle erstellen.

Was ist da schwierig daran.
Du weist wie du eine Ziffer umwandeln kannst.
Wenn du also '2' '8' empfängst (für 28), dann rechnest
du
   '2' - 48  -> 2   --+
   '8' - 48  -> 8   -------------+
                      |          |
                      v          v
                      2 * 10  +  8  -> 28

Deshalb nennt man unser gewohntes System auch das
Zehnersystem: Weil jede Stelle nach links immer den
Zehnfachen Wert hat.

von q-stkr (Gast)


Lesenswert?

Hallo,

vielen Dank für den Tipp.

Ich glaube ich denke immer zu kompliziert. Ich denke nur immer dafür
gibt es bestimmt Funktionen in Bascom aber an einfache Mathematik ...

Ich werde es mal ausprobieren!

Gruß
q-stkr

von der inoffizielle WM-Rahul (Gast)


Lesenswert?

>Ich denke nur immer dafür
>gibt es bestimmt Funktionen in Bascom aber an einfache Mathematik ...

Man natürlich auch das BASCOM-Handbuch auswendig lernen...

von Digi Clock (Gast)


Lesenswert?

>>Zieh einfach vom Zahlenwert (also den 49) 48 ab

oder schreib einfach in Bascom "Chr(Zahlenwert)"
Gesamtzahl = Chr(Zahlenwert1) + Chr(Zahlenwert2)
wobei Zahlenwert1 die Zehnerstelle ist und Gesamtzahl ein String sein
muss.

von Karl heinz B. (kbucheg)


Lesenswert?

chr ist bei der gegebenen Aufgabenstellung
nutzlos. Er hat ja schon einen String.

@q-stkr
Allerdings hat Bascom eine Funktion, die die Umwandlung
ganz von alleine macht: Val.
Nur mal soviel zum Thema 'Handbuchstudium'

von Digi Clock (Gast)


Lesenswert?

@ Karl Heinz
das war wohl nichts !!!

Er empfängt seriell, ein Byte (00110001 = 49), also den ASCII - Code.
Chr(49) macht daraus den String "1".

schönen Gruss vom Handbuch ...

von der inoffizielle WM-Rahul (Gast)


Lesenswert?

ja, das ist aber völlig irrelevant, wenn man statt der "1" eine 1
haben will.
Und wenn man aus den Strings/Charactern "1" und "2" 12 machen will,
bringt einem deine Methode eher auch nicht weiter.
val() ist wohl inzwischen Basic-Standard (sofern man von
Basic-Standards reden kann).
Es geht ja um die Umwandlung von einzelnen Zeichen in Zahlen (mit denen
man dann auch rechnen kann).

von Paul Baumann (Gast)


Lesenswert?

Mit Val () und Mid$, Left$ und Right$ kann man sich doch aus einem
String den benötigten Wert "heraussägen" ?!

MfG Paul

von Karl H. (kbuchegg)


Lesenswert?

@Digi Clock

Aha

Und du denkst also, dass

Gesamtzahl = Chr(Zahlenwert1) + Chr(Zahlenwert2)
Zahl = Val( Gesamtzahl )

einfacher ist und schneller ausgeführt wird als

Zahl = ( Zahlenwert1 - 48 ) * 10 + ( Zahlenwert2 )

Es ist relativ sinnfrei sich zunächst einen String
zusammenzubasteln, nur damit man danach den kompletten
String wieder in eine Zahl umwandelt

von Jörg B. (joerg-sh)


Lesenswert?

Ich versuch hier auch grade eine Uhr zum laufen zu bekommen.
Warum steht meine UHR ???

$regfile = "m8def.dat"
$crystal = 4000000

$hwstack = 32
$swstack = 10
$framesize = 40

Enable Interrupts
Config Clock = Soft

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , 
Db7 = Portd.7 , Rs = Portd.2 , E = Portd.3


Config Lcd = 16 * 1a

Date$ = "18.07.06"
Time$ = "10:20:00"

Do

 Cls

   Lcd Time$

  Waitms 500

Loop


End

Eiegntlich sollte die Uhr doch so laufen. (Abgesehen davon das Sie nicht 
die korrekte Zeit zählt weil nicht der richtige Quarz drin ist)

Grüße

Jörg

von Paul Baumann (Gast)


Lesenswert?

Nimm mal das "Wait500ms" raus. Wenn Du einen anderen Quarz drin hast, 
mußt Du das natürlich auch dem Kompiler "erzählen", sonst vergehen 
vielleicht Stunden, ehe eine Sekunde rum ist. ;-)


MfG Paul

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.