mikrocontroller.net

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


Autor: q-stkr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: micha b (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo genau ist dein Problem?
Welcher µPC?

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: q-stkr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: micha b (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: q-stkr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: micha b (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: q-stkr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: der inoffizielle WM-Rahul (Gast)
Datum:

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

Autor: Digi Clock (Gast)
Datum:
Angehängte Dateien:
  • uhr.zip (403 Bytes, 277 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
hier mal ein ganz simples Beispiel für Bascom.

Autor: q-stkr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: q-stkr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: der inoffizielle WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Digi Clock (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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'

Autor: Digi Clock (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: der inoffizielle WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Paul Baumann (Gast)
Datum:

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

MfG Paul

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg B. (joerg-sh)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.