Ist es möglich bspw. Über Timerinterrupt eine (auch ziemlich ungenaue) Uhr (mit Datum) in Bascom zu programmieren???
(Quarz 16 MHz)
Ich spiele jeden 2. Tag die Uhrzeit neu via RS in das Modul ein.
Mfg
Tobi
Druckbare Version
Ist es möglich bspw. Über Timerinterrupt eine (auch ziemlich ungenaue) Uhr (mit Datum) in Bascom zu programmieren???
(Quarz 16 MHz)
Ich spiele jeden 2. Tag die Uhrzeit neu via RS in das Modul ein.
Mfg
Tobi
Hallo!
Jup, Das ist möglich... Nur wird das mit nem 16MHz Quarz schwierig.
Ich verwende zB ein 14,7456 MHz-Quarz.
das ist im binärsystem eine gerade Zal´l..
14745600 / 1024 = 14400.
Dann muss der Timer bis 143 Zählen und dann den Interrupt auslösen.
In diesem lasse ich dann diese Funktion ausführen:
Ich programmiere zwar nicht in Basic, aber ich denke dieser kurzeCode:// -=> Timer Uhr <=-
void TIMER_clock( void ){
TIMER_percent++;
if( TIMER_percent >= 100 ){
TIMER_percent = 0;
TIMER_second++;
}
if( TIMER_second >= 60 ){
TIMER_second = 0;
TIMER_minute++;
}
if( TIMER_minute >= 60 ){
TIMER_minute = 0;
TIMER_hour++;
}
if( TIMER_hour >= 24 ){
TIMER_hour = 0;
}
}
C-Code ist durchaus zu verstehen. Wenn nicht, sag bescheid...
Also
16000000 / 1024 = 15625
leider kenn ich mich mit dem Basic nur so gut aus:
Variablen deklarieren, Pórts deklariern, if, for, while...
(Das Buch kommt erst noch :lol:)
Mfg
Tobi
nagut.. wenn du den 16bit Timer nimmst, dann kannst du ihn jetzt bis 15624 laufen lassen (immmer 1 weniger, weil er ja bei 0 beginnt).
kommt aber dann im sekundentakt.
Achja, und wenn du wirklich eine genaue zeit brauchst, dann würd ich am eingang für das zweite quarz ein Uhrenquarz einbauen.
Quarze, mit solch komischen werten wie 7,372800MHz sind im binärsystem eine gerade zahl. deshalb kommt auch bei mir 14400 raus. und mir stehen hundertstelsekunden zur verfügung.
Aber uhrenquarze sind wesentlich besser geeignet....
die haben auch 32768 Hz.
PS: Wenn du schon anfängst zu programmieren, würd ich gleich mit C anfangen...
Also mir reicht eine relativ ungenaue Urzeit +-5 Minuten würde ich sogar noch aushalten. Mein Chip ist ein ATmega128 auf einer fertigen Platine.
Zu PS: Mit Basic kenn ich mich halt schon ein bissel aus und C kann dann ja immer noch kommen. Ich mach ja das Atmel zeugs nicht Tag-täglich sondern nur bei speziellen Projekten. (Bin eigentlich für die PC Software Win 32 via Delphi zuständig ;-) )
Mfg
Tobi
Wenn ich mal kurz pushen darf ;-)
Ich benötige nur den Source der den Timer so initialisiert das er jede Sekunde einen Interrupt auslöst. Das was in dem Interrup passiert schreib ich selber.
Mfg
Tobi
Im Wiki steht schon der passende Code dafür:
https://www.roboternetz.de/wissen/in...scom_und_Timer
also ich hab jetzt mal folgendesZitat:
Zitat von uwegw
Code:Config Timer1 = Timer, Prescale= 15624 ‘die 15624 müssen doch in den Prescaler oder?!?
Enable Timer1
On Timer1 AddSecond
Enable Interrupts
Do
Loop
End
AddSecond:
second = second + 1
Return
Nee, der Prescaler kann nur ganze Vielfache von 2 annehmen. Er bestimmt, wie weit der Quarztakt runtergeteilt wird, bevor er den Timer hochzählt. Deine 15000nochwas müssen entweder in ein Compare-Register [dann könntest du aber z.B. niicht mehr alle PWM-Ports nutzen], oder du lädst damit bei jedem Überlauf das Zählregister neu. Datenblatt lesen empfohlen!
Ich greif noch mal auf diesen beitrag zurück den ich versteh nur Bahnhof:
Zitat:
nagut.. wenn du den 16bit Timer nimmst, dann kannst du ihn jetzt bis 15624 laufen lassen (immmer 1 weniger, weil er ja bei 0 beginnt).
kommt aber dann im sekundentakt.
Achja, und wenn du wirklich eine genaue zeit brauchst, dann würd ich am eingang für das zweite quarz ein Uhrenquarz einbauen.
Quarze, mit solch komischen werten wie 7,372800MHz sind im binärsystem eine gerade zahl. deshalb kommt auch bei mir 14400 raus. und mir stehen hundertstelsekunden zur verfügung.
Aber uhrenquarze sind wesentlich besser geeignet....
die haben auch 32768 Hz.
PS: Wenn du schon anfängst zu programmieren, würd ich gleich mit C anfangen...