PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mega8 als Uhr über LCD?



CapSob
22.04.2007, 09:39
Servus!

Ich will mir für mein Terrarium eine einstellbare Zeitschaltuhr basteln, die mehrere Verbraucher ein/aus schaltet.

Folgendes Problem - die Uhr.

Ich will keine DCF77-Dekodierung machen, da aufwändig + Speicherintensiv (Bascom-Beispiel aus RNWissen belegte ca. 48 % des AVR). Jetzt hab ich mal ganz simpel eine Do Loop (Wait 1) Schleife programmiert, die mir jede Sekunde die Sek.-Var. um 1 erhöht, dann bei 59 die Min.-Var. um ein erhöht, usw.
Ich hab die Schaltung um 19.30h gestartet. Als es auf meiner Uhr dann 21.50h war, hat die "AVR-Uhr" 21.42h angezeigt. Also ein Zeitunterschied von ca. 8 min.

Wie könnte ich das Problem lösen, das ich zwar eine genaue Uhr haben will, aber nicht über DCF77 gehen muss?
Ich hab mir schon überlegt, ich könnte einen Uhrenbaustein holen, den dann über den INT0 vom Mega8 laufen lassen. Bei jeden INT0 (also jede Sekunde) soll er mir dann die Sek.-Var. um 1 erhöhen, usw. Wenn diese Idee laut eurem ermessen gut ist, welchen Uhrenbaustein sollte ich nehmen? Oder hat jemand noch eine bessere Idee?

mfg,
CapSob.

Razer
22.04.2007, 10:02
Schau mal hier: http://www.mikrocontroller.net/articles/AVR_-_Die_genaue_Sekunde_/_RTC

Andree-HB
22.04.2007, 11:43
Einfach und gut :
http://www.pixelklecks.de/1f40e2973f0cb3607/84889198d914b9c07/index.html

CapSob
22.04.2007, 16:10
das mit der softclock hört sich meines erachtens nach sehr interessant an. muss ich aber dann eine 32.xx kHz quarz oder kann ich auch den internen 1MHz / externen 16 MHz quarz nehmen? hättest du eine bsp.-schaltung?

Vitis
22.04.2007, 17:51
der Quaz 32,768KHz kommt zusätzlich zum Quarz für die CPU dran.
Du kannst auch die Takterzeugung intern mit RC auf 1MHz laufen lassen, das juckt
die Softclock mit dem 32,768KHz nicht weiter.

Andree-HB
22.04.2007, 18:38
kommt zusätzlich zum Quarz für die CPU


...nein, das stimmt nicht - er kommt stattdessen an die Pins XTAL1/2

Razer
22.04.2007, 19:21
Schau mal in meinem Link, der braucht keinen zusätzlichen Quarz....

Vitis
22.04.2007, 20:09
halt Moment, stimmt, wir sind ja bei Mega8, ich war gerade beim
Mega16. Beim Mega8 kommt der Uhrenquarz an
TOSC1 / TOSC2, die pinidentisch mit XTAL1 und XTAL2 sind,
nur dann halt ohne externe Kapazitäten.

Datenblatt:

For AVR microcontrollers with Timer/Counter Oscillator pins (TOSC1 and TOSC2), the
crystal is connected directly between the pins. By programming the CKOPT Fuse, the
user can enable internal capacitors on XTAL1 and XTAL2, thereby removing the need
for external capacitors. The Oscillator is optimized for use with a 32.768 kHz watch crystal.
Applying an external clock source to TOSC1 is not recommended.

In dem Fall geht halt der Systemtakt nur noch mit RC-Osz bis 8MHz

CapSob
22.04.2007, 21:52
also sozusagen klemm ich den uhrenquarz (32.768 kHz) ohne kondensatoren zwischen xtal1 und xtal2, lass den uC mit 1 MHz laufen (ist bei der anwendung kein prob) und hab dann mit der softclock eine genaue uhr? hört sich sehr gut an! muss jetzt bloß mal schauen, wo ich so nen "uhrenquarz" herbekomme.

@Razer: sorry, aber die rechnung ist mir um die zeit irgendwie zu kompliziert, und von c hab ich keine ahnung, deswegen fällt mir auch die interpretation sehr schwer. trotzdem danke für deinen post.

edit: uhrenquarz, reichelt, best.nr. 0,032768, preis: 0,14 euro.

CapSob
02.05.2007, 22:23
gut, die schaltung ist soweit aufgebaut.

- mega8 in auslieferungszustand
- ein 20*4 lcd ist erfolgreich angeschloseen
- ein uhrenquarz (32, 7... kHz) ist an xtal angeschlossen ohne externe kondensatoren

hier mein code:

' +-------------------------------------------------------------------------------+
' | Projektname: Terrarium Kontroll Einheit |
' | Projektbeschreibung: Steuereinheit mit Temperaturmessung und Relaissteuerung. |
' | Zeitsteuerung über Softclock und Uhrenquarz |
' | |
' | Dateiname: tke.bas |
' | Version: 0.2 |
' | |
' | Author: René Brixel |
' | Kontakt: rbrixel@capsob.de |
' | |
' | Start des Projekts: 27.04.2007 |
' | Ende des Projekts: --.--.---- |
' +-------------------------------------------------------------------------------+

'--------------- AVR Einstellungen ---------------
$regfile = "m8def.dat" 'AVR ATMega 8...
$crystal = 1000000 '...mit internen 1 MHz
Config Date = Mdy , Separator = /
Config Clock = Soft
Enable Interrupts

'--------------- PORT Einstellungen ---------------
Ddrb = &B00000000 '1 = Ausgang; 0 = Eingang
Portb = &B00000001 'Wenn Eingang, dann 1 = PullUp aktiviert

Ddrd = &B01111111 '1 = Ausgang; 0 = Eingang
Portd = &B10000000 'Wenn Eingang, dann 1 = PullUp aktiviert

Taster_enter Alias Pind.7 'Taster Enter / Set
Taster_menu Alias Pinb.0 'Taster Setup / Menu

'--------------- LCD Einstellungen ---------------
Config Lcd = 20 * 4 'Ein 20 * 4 Zeilen LCD
Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.4 , Rs = Portd.6
Config Lcdbus = 4 '4 Bit Modus
Cursor Off 'Cursor des LCDs ausschalten

'--------------- Variablen Deklaration ---------------
Time$ = "00:00:00" 'Setzen auf Startwert
Date$ = "00/00/00" 'Setzen auf Startwert

'--------------- HAUPTPROGRAMM ---------------
Do
Locate 1 , 1
Lcd Time$ 'Zeige Zeit in Zeile1
Locate 2 , 1
Lcd _day ; "/" ; _month ; "/0" ; _year 'Zeige Datum in Form DD/MM/YY in Zeile2

If Taster_menu = 0 Then Gosub Time 'wiederhole Anzeige bis Taster 1 zum Stellen gedrückt, springe nach Sub "Time"
Waitms 200
Loop
End

'Stunde
Time:
Waitms 200
Cls 'lösche Zeilen
Do
Locate 1 , 1
Lcd "Stunde einstellen:" 'Stunden setzen
Locate 2 , 1
Lcd _hour
If Taster_enter = 0 Then 'Mit Taster 2
Incr _hour 'hochzählen
Locate 2 , 1
Lcd _hour
Waitms 200
End If
If _hour > 23 Then 'Zählt bis Max, danach wieder ab 0
Cls
_hour = 00
End If 'solange, bis Taster 1 gedrückt
Loop Until Taster_menu = 0
Waitms 200

'Minute
Cls
Do
Locate 1 , 1
Lcd "Minute einstellen:"
Locate 2 , 1
Lcd _min
If Taster_enter = 0 Then
Incr _min
Locate 2 , 1
Lcd _min
Waitms 200
End If
If _min > 59 Then
Cls
_min = 00
End If
Loop Until Taster_menu = 0
Waitms 200
Cls

'Tag
Cls
Do
Locate 1 , 1
Lcd "Tag einstellen:"
Locate 2 , 1
Lcd _day
If Taster_enter = 0 Then
Incr _day
Locate 2 , 1
Lcd _day
Waitms 200
End If
If _day > 31 Then
Cls
_day = 01
End If
Loop Until Taster_menu = 0
Waitms 200
Cls

'Monat
Cls
Do
Locate 1 , 1
Lcd "Monat einstellen:"
Locate 2 , 1
Lcd _month
If Taster_enter = 0 Then
Incr _month
Locate 2 , 1
Lcd _month
Waitms 200
End If
If _month > 12 Then
Cls
_month = 01
End If
Loop Until Taster_menu = 0
Waitms 200
Cls

'Jahr
Cls
Do
Locate 1 , 1
Lcd "Jahr einstellen:"
Locate 2 , 1
Lcd _year
If Taster_enter = 0 Then
Incr _year
Locate 2 , 1
Lcd _year
Waitms 200
End If
If _year > 10 Then
Cls
_year = 00
End If
Loop Until Taster_menu = 0
Waitms 200
Cls

_sec = 00 'Springe Nach Setzen Von Zeit / Datum Wieder Zurueck
Return

thx an andree-hb.

PROBLEM: die uhr lässt sich zwar einstellen, aber die zeit wird nich hochgezählt. sozusagen - die uhr steht. hat jemand eine idee?

cap.

Andree-HB
03.05.2007, 08:24
hat jemand eine idee?


...hast Du evtl. vorher an dem Fusebit für den Takt herumgestellt ?
Muss natürlich auf interner Takt stehen. Sonst einfach mal das Demo aus der Hilfe benutzen, spätestens dies muss einwandfrei hochzählen.