mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Genau Jede Sekunde Hochzählen..


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dieses Thema gab es bestimtm schon 1million mal, aber ich finde einfach 
kein lösung.

Ich will eine einfache Uhr mit ein Atmega8 Bauen, mein Programm sieht so 
aus:

$regfile "m8def.dat"
$crystal = 1000000
$baud = 1200
Dim Stunde As Word
Dim Minute As Word
Dim Sekunde As Word
Sekunde = 0
Minute = 0
Stunde = 0
Schleife:
Print Stunde ; ":" ; Minute ; ":" ; Sekunde
Sekunde = Sekunde + 1
Waitms 1000
If Sekunde = 60 Then
Minute = Minute + 1
Sekunde = 0
End If
If Minute = 60 Then
Stunde = Stunde + 1
Minute = 0
End If
If Stunde = 24 Then
Stunde = 0
End If
Goto Schleife

da ich den Internen Quarz benutze geht due Uhr sehr schnell sehr 
falsch^^ ( nach 5 Minuten echtzeit sagt der Chip es sind ca. 4 minuten 
40sekunden vergangen )


wie bekomme ich das ganz genau hin? ich habe hier viele beispiele 
gefunden aber keins in basic und wenn ich das richtig gelesen habe 
benötige ich ein externen quarz, habe hier 4 und 16mhz quarz liegen 
welscher eignet sich besse rund wie schließe ich den an?

Autor: Naja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>dieses Thema gab es bestimtm schon 1million mal, aber ich finde einfach
>kein lösung.

Dann suche bitte nochmal und diesmal gründlich.
Und das nächste Mal tue uns bitte den Gefallen und achte auf 
Rechtschreibung.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Uhrenquarz an TOSC1/2. Timer2 erzeugt dann mit Vorteiler 128 genau jede 
Sekunde eine Overflowinterrupt. Fertig.

MfG Spess

Autor: Denny S. (nightstorm99)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Hi
>
> Uhrenquarz an TOSC1/2. Timer2 erzeugt dann mit Vorteiler 128 genau jede
> Sekunde eine Overflowinterrupt. Fertig.
>
> MfG Spess

Genau, das steht in der Hilfe von Bascom unter Timer2 genau drin.


Gruß

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> da ich den Internen Quarz benutze
Lies das noch mal nach...
Es gibt keinen internen "Quarz"   :-/
Der interne "Taktgenerator" ist ein ziemlich ungenauer RC-Oszillator. 
Den nimmt man, wenn man irgendeinen Takt braucht. Für alle genaueren 
Anforderungen (RS232 oder Zeiten) bruchst du wirklich einen Quarz oder 
aufwendige Kalibrrermöglichkeiten.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> da ich den Internen Quarz benutze

Gibbet nich, is nur ein RC-Generator.

> wenn ich das richtig gelesen habe
> benötige ich ein externen quarz,

Jau, dat stimmt.

> habe hier 4 und 16mhz quarz liegen
> welscher eignet sich besse r

Is wurscht, kannst beide nehmen. Am stabilsten im Full-Swing-Modus.

> und wie schließe ich den an?

Wie im Datenblatt beschrieben.


Peter

Autor: overseer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

volatile int sek=0;
volatile int min=0;
volatile int hou=0;
volatile int out[16];


main()
  {
  lcd_portinit();
  lcd_pwrup();
  
  
  TCCR1A  = 0x00;
  TCCR1B   = 0x03;    //prescaler 64 
  TIMSK   = 1<<OCIE1A;    //output compare match interrupt enable
  OCR1A  = 62497;    //zaehlgrenze bei 4mhz 1sec
  
  sei();
  for(;;)
    {
    sprintf(out,"%02d:%02d:%02d           ",hou,min,sek);
      lcd_sendstring(out);
      lcd_choporder(0x02);
    }

  }

ISR(TIMER1_COMPA_vect)
{
TCNT1=0;
sek++;

if(sek==60)   {sek=0;min++;}
if(min==60)   {min=0;hou++;}
if(hou==24)    {hou=0;}
}




bitte sehr...funktioniert bei mir einwandfrei
statt einem overflow interrupt habe ich mich für einen compare interrupt 
entschieden. das hat den vorteil das man den beliebig verändern kann und 
somit etwaige ungenauigkeiten im quarz ausgleichen kann...
das programm hier muss mit ~4mhz glaube ich betrieben werden. dann 
bekommst du sekündlich einen interrupt

die lcd_**** musst du löschen hab sie nur der vollständigkeitshalber 
drin gelassen

Autor: Jürgen C (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
schau mal in der Bascom-Hilfe unter "CONFIG CLOCK"

Autor: Brigitte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

es geht auch mit dem internen Takt.

Wenn dieser "1MHz! beträgt und die Uhr 5 min nach 4:40 anzeigt werden 
300 Sekunden in 280Sekunden durchlaufen. also ist der Interne Takt 
300/280 = 1,0714 also 7,14% zu schnell.

Gib statt $crystal = 1000000 dann $crystal = 1000000/1,0714 bzw. 
$crystal = 933358 an

Ggf. weiter korrigieren.

B.

Autor: Brigitte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

du kannst auch dein waitms=1000 um ~7% vermindern und anpassen.

Waitus = .... wäre auch möglich.

B.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>es geht auch mit dem internen Takt.

>Wenn dieser "1MHz! beträgt und die Uhr 5 min nach 4:40 anzeigt werden
>300 Sekunden in 280Sekunden durchlaufen. also ist der Interne Takt
>300/280 = 1,0714 also 7,14% zu schnell.

Und dann wundert man sich, dass die Uhr im Winter anders läuft als im 
Sommer.
Wenn man in Toleranzgrenzen etwas genaues als Endprodukt haben will, 
dann müssen die darunter liegenden Toleranzen kleiner sein, da sie sich 
aufsummieren.
Einen RC-Oszillator für den Betrieb einer Uhr zu benutzen ist die 
schlechteste Wahl und ein Quarz kostet auch keine Millionen.

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

Bewertung
0 lesenswert
nicht lesenswert
overseer schrieb:
>
> ISR(TIMER1_COMPA_vect)
> {
> TCNT1=0;
> 
> 
>
> bitte sehr...funktioniert bei mir einwandfrei

Fragt sich nur wie lange :-)
Lass den Timer in Ruhe zählen und fummle nicht am Counter Register rum!

> statt einem overflow interrupt habe ich mich für einen compare interrupt
> entschieden.

Der CTC ist besser geeignet.
Zur Erinnerung: Man will haben, dass der Timer in Ruhe und vor allen 
Dingen gleichmässig ticken kann. Jede Störung, die du am TCNTx Register 
durch dein Programm einbringst führt letztendlich nur dazu, dass er das 
nicht kann und deine Uhr auf lange Sicht gesehen falsch geht.

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.