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
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.
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
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.
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
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 :-)
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
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
> 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.
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
>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...
>>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.
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'
@ 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 ...
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).
@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
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
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