PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Uhr mit Uhrenquarz 32768 Hz an den Pins TOSC1/2



TobiasBlome
03.12.2008, 21:38
Hallo,
ich möchte eine Uhr mit Uhrenquarz (32768 Hz) programmieren und bin auch im Forum fündig geworden. Leider bekommen ich ein paar Fehlermeldungen:

Nomore Space for Bit [__LCDNO] und Syntax error... in Zeile 32

Kann mir einer einen Tip geben wo der Fehler liegt?

Wenn ich den Code aus der Bascomhilfe nehme habe ich zufällig die gleichen Fehler.... da stimmt doch etwas nicht....?



'Uhr mit Uhrenquarz 32768 Hz an den Pins TOSC1/2


$regfile = "m32def.dat" 'AT-Mega32
'$crystal = 1000000 'Quarz: 1 MHz - interner Takt
$crystal = 14745600 'Quarz: 14,7456 MHz - Quarz auf Platine
$baud = 9600 'RS232 Baudrate definieren


'-------------------------------------------------------------------------------
'LCD konfiguration:
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
Config Lcd = 20 * 4



Config Date = Dmy , Separator = .
Config Clock = Soft
Date$ = "21/12/08"
Time$ = "19:15:00"
dim Secalt as byte
cls
Do
Gosub Uhr
Loop



Uhr:
if secalt <> _sec then
Locate 1 , 5
Lcd Date$

Locate 2 , 1
Lcd Time$
secalt = _sec
end if
Return

Jaecko
04.12.2008, 07:02
Wie viele Quarze hängen da dran?
Falls es nur einer ist, ist mir das erste, was auffällt, das hier:
Der Uhrenquarz hat ~32kHz, im Programm wird aber "$crystal = 14745600" angegeben. Aber das dürfte eigentlich nicht der Fehler sein.
Welche der Zeilen ist denn diese Zeile 32? (Nachzählen im Code haut nicht hin, rauskopieren auch nicht, da da blöderweise noch Leerzeilen mit drin sind, wo man nicht weiss, ob die noch dazugehören oder nicht.)

Ansonsten seh ich da auf die schnelle keinen Fehler. Habs auch grad mal kompiliert und da gehts bei mir ohne Probleme.

TobiasBlome
04.12.2008, 16:00
Hallo,
der Quarz(14745600) ist an Pin 12/13(XTAL1/2). Der UhrenQuarz(~32kHz) ist an Pin 28/29(Tosc1/2).

Bei allen Fehlern wird immer bis zum Return Befehl gesprungen...also fehlt vielleicht ein Befehl oder so(?).

Jaecko
04.12.2008, 16:22
Ah so rum *g*

Wirf mal das, was zwischen "Uhr:" und "Return" steht einfach in die Do-Loop-Schleife rein; ob der Fehler dann auch kommt. Also ich kanns mit beiden Möglichkeiten Fehlerfrei kompilieren.

TobiasBlome
04.12.2008, 16:38
..........der Fehler ist weg............ :lol:

waren das zuviele / zu schnelle aufrufe in der Do...Loop?

TobiasBlome
04.12.2008, 16:49
tja...also keine Fehler mehr aber die Uhr Läuft nicht...

Hab die Anweisung: if secalt <> _sec then erstmal rausgenommen, damit immer aktualisiert wird. Datum und Uhrzeit stehen auf dem LCD und flackern ;-) (wird ja jetzt zuoft aufgerufen und gelöscht) Das Fusebit
für den 14MHz Quarz habe ich gesetzt, muss man da noch Fusebits setzen(für den kleinen Quarz)?

Tobias

TobiasBlome
04.12.2008, 17:03
Habe gerade mal an beiden Beinen vom Quarz gemessen: 30µS/Wellen =33khz?
Kommt also ungefähr hin.

Jaecko
04.12.2008, 17:05
Komisch... aber dass das zu schnell war, kann ich mir nicht vorstellen.
Du kannst ja mal ne echte Sub zusammenbauen (Also mit Declare etc.) und so mal testen, obs dann auch (nicht) geht.

Wenns dort dann wieder nicht geht, bleibt die Vermutung, dass evtl. die Werte für HWStack, Softwstack, Framesize etwas zu klein sind.
Die mal verdoppeln, wenns dann geht, müsste es mit der o.g. Lösung (per Gosub) eigentlich auch wieder gehen.

Nen extra Uhrenquarz hab ich nie verwendet. (nie benötigt bisher). Weiss deshalb nicht, wie/ob man die Fuses da setzen muss.

TobiasBlome
04.12.2008, 17:30
HWStack, Softwstack, Framesize habe ich noch gar nicht definiert....
Also mit diesen Einstellungen funktioniert es nicht:
$hwstack = 80
$swstack = 128
$framesize = 80

wie meinst du das mit declare Sub? Habe damit noch nichts programmiert.



'Uhr mit Uhrenquarz 32768 Hz an den Pins TOSC1/2


$regfile = "m32def.dat" 'AT-Mega32
'$crystal = 1000000 'Quarz: 1 MHz - interner Takt
$crystal = 14745600 'Quarz: 14,7456 MHz - Quarz auf Platine
'$baud = 9600 'RS232 Baudrate definieren

$hwstack = 80
$swstack = 128
$framesize = 80

'-------------------------------------------------------------------------------
'LCD konfiguration:
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
Config Lcd = 20 * 2
Cursor Off Noblink


Config Date = Dmy , Separator = .
Config Clock = Soft
Date$ = "21/12/08"
Time$ = "19:15:01"

Dim Secalt As Byte
Dim Test As Single

Do

'If Secalt <> _sec Then
Cls
Locate 1 , 1
Lcd Date$

Locate 2 , 1
Lcd Time$
Secalt = _sec
'End If

'nur zum testen
Incr Test
Locate 1 , 10
Lcd Test

Waitms 250

Loop

StevieL
04.12.2008, 17:45
Hallo Tobias,

da wird ja ein Timer benutzt. Schon mal ein "Enable Interrupts" probiert?

TobiasBlome
04.12.2008, 19:50
:oops:
mmmhhh ja da hätte ich auch drauf kommen können.....

DANKE!
Ja, wenn man Timer benutzt sollte man die dem µC auch erlauben...

Ich habe das Bascom Beispiel kopiert und die Confi. für den µC und das LCD weggelassen und durch meine Confi ersetzt. Dazwischen WAR das Enable Interrupts

Danke, jetzt läuft die Uhr einwandfrei ;-)

Tobias

StevieL
04.12.2008, 20:29
Kleine Ursache - Große Wirkung :lol:

Hast du die Option zu Config Clock "Gosub Sectic" schon mal angeschaut? Da wird automatisch jede Sekunde das Label "Sectic" angesprungen. Vielleicht kannst du das ja gebrauchen.

TobiasBlome
04.12.2008, 20:48
klingt interessant ;-)
ich möchte einen Datenlogger bauen, der jede sekunde werte auf einem USB-Stick speichert. Besser wäre alle 0,5 sec... aber das geht damit wohl nicht oder?

Tobias

TobiasBlome
05.12.2008, 06:31
Hallo,
ich habe eine Abweichung von 2 Sekunden auf 10 Stunden im Vergleich zu meinem Funkwecker. Der µC machts z.Z. im Programm nichts anderes als die Uhr auf dem LCD ausgeben. Kann man die Abweichung noch verkleinern? (natürlich ohne Funkmodul:-))

Tobias

Jaecko
05.12.2008, 07:04
Die Abweichung lässt sich per Software korrigieren. Also mal messen, wie viel Sekunden pro Stunde die Uhr vor/nachgeht. Und dann einfach jede Stunde die entsprechende Anzahl Sekunden warten oder dazuzählen.

In dem Fall also alle 5 Stunden entweder mal INCR _sec oder DECR _sec.

Nur 2 Sekunden pro 10 Stunden... könnte mich täuschen, aber wird da dann schon der Uhrenquarz für die Uhr verwendet? Gut, ich kenn jetzt die Genauigkeit des Quarzes nicht. Für ne Abweichung von 1 Minute bräuchte man 12,5 Tage; glaub des is noch ok.

TobiasBlome
05.12.2008, 11:52
So, habe nochmal abgelesen:
nach 15Std lief die Uhr 4sec zu langsam.
Für ne Abweichung von 1 Minute bräuchte man 3,75 Tage! oder?

nachdem ich den 32khz Quarz abgezoge habe, blieb die Uhr stehen: Ja die Uhr arbeitet mit dem richtigen Quarz ;-)

Jaecko
05.12.2008, 15:25
Ich hab 9,375 Tage für ne Minute (bei 4sec/15h)
Einfach mal versuchen, so alle 3 Stunden 45 min ne Sekunde dazuzuzählen.
Dann müsste zumindest diese Abweichung weg sein. Kann aber sein, dass dann immer noch ein Rest bleibt, der sich dann erst nach Tagen bemerkbar macht.

TobiasBlome
05.12.2008, 19:27
ja, du hast Recht 9,375 Tage - weiß nicht was ich da gerechnet habe...

Aber ich denke mal, wenn ich die Uhr für meinen Datenlogger nehme und 1 Wert / sec. aufschreibe, ist es besser die Zeitdifferenz zu haben, als wenn ich beim Kurvenauswerten plötzlich doppelte Werte habe.

Ich möchte 1-2 Werte pro sekunde, damit ich auch "kurze Impulse" mit aufzeichnen. Wann die nun genau gekommen sind oder da waren, ist glaub ich nicht ganz so wichtig. Da ich 8 analoge Kanäle aufzeichnen will, möchte ich nicht unbedingt mehrere Messungen / sec. machen um den höchsten Wert dann aufzuzeichnen.

Tobias