www.mikrocontroller.net

Forum: GCC C code für Uhrenquarz

Autor: Hax Sowieso (hellfire)
Datum: 05.05.2008 14:56

Hallo!

Ich bin relativ unerfahren mit Mikrocontroller und dessen
Programmierung.. Paar Sachen kann ich schon aber naja..

Mein Problem:
Ich hab einen Uhrenquarz an den TOSC1 und TOSC2 von einem AtMega128
angeschlossen.. soweit so gut, nur habe ich jetzt absolut keinen Plan
wie ich davon was nützliches kriege mit C, z.B. ein Sekundenzähler oder
sowas ähnliches

Wäre sehr dankbar, wenn sich wer kurz Zeit nimmt und ein Beispiel Code
machen könnte, damit sogar ich mal kapiere ;)

Danke!
Autor: Peter Dannegger (peda)
Datum: 05.05.2008 15:33

Z.B.:

Beitrag "Die genaue Sekunde / RTC"

Arbeitet mit dem HF-Quarz und T1.

Kannst Du so nehmen oder an den NF-Quarz an T2 anpassen.


Peter
Autor: Martin Thomas (mthomas) Benutzerseite
Datum: 05.05.2008 22:59

Falls man einen Timer im Async-Mode verwenden will, also getrieben vom
32kHz Quarz an TOSCx, kann man sich im Beispielcode zum AVR Butterfly
die erforderlichen Schritte zur Initialierung und für die
Interrupt-Routine abschauen. Code zum BF ist für ATmega169, sind also
ein paar kleinere Änderungen für ATmega128 erforderlich, aber kein
Hexenwerk, Prinzip ist gleich. Datenblatt gibt eine
"Schitt-für-Schritt-Liste", wie man den Async-Mode aktiviert.
Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum: 06.05.2008 08:27

Nicht vergessen: diese Quarze brauchen sehr lange zum Anschwingen,
bis sie in Frequenz und Amplitude stabil sind.  Man sollte 1 s dafür
einplanen.
Autor: Hax Sowieso (hellfire)
Datum: 07.05.2008 19:17

Also ich hab mich mal versucht durch das Datenblatt zu hangeln und auch
im Netz recheriert...

Ich bin jetzt mal zu folgenden Schlüssen gekommen:

also, ich will/hab:
-ATmega128
-ein 32768khz quarz auf TOSC1/TOSC2 mit dem ich die Uhr steuern will

Was ich jetzt, denke ich, machen soll damit ich jede Sekunde einen
Interrupt habe:

-ASSR: AS0 auf 1 damit die Frequenz vom externen Quarz übernommen wird
-TCCR0: CS02 auf 1, CS01 auf 0, CS00 auf 1, damit der Vorteiler auf 128
ist
-TCNT0: auf 0x00, also Startwert auf 0
-OCR0: auf 0xFF, Vergleichswert auf 255
-TIMSK: OCIE0 auf 1 vergleicht OCR0 und macht Interrupt sobald 255
erreicht ist

Vorallem beim letzten Punkt bin ich nicht sicher ob ich das richtig
verstanden habe.. also das es einen Interrupt gibt sobald der 255
erreicht hat oder auf 0 zurück setzt...

Auch weiss ich nicht wie ich denn Interrupt konkret in C umsetze.. also
Pseudocode: if Interrupt mach sekundenzähler 1 hoch

Könnt ihr mir kurz sagen wie ich das in echtes C übersetze?

Danke!
Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum: 07.05.2008 21:00

Hax Sowieso wrote:

> -ASSR: AS0 auf 1 damit die Frequenz vom externen Quarz übernommen wird

OK.

> -TCCR0: CS02 auf 1, CS01 auf 0, CS00 auf 1, damit der Vorteiler auf 128
> ist

OK, das gibt einen Takt von 256 Hz.

> -TCNT0: auf 0x00, also Startwert auf 0

Ist die Voreinstellung, ist aber auch egal: nur der erste Tick
ändert sich damit.  Da der Quarz ja sowieso ,,irgendwann'' losläuft,
hat das keine wirkliche Relevanz.

> -OCR0: auf 0xFF, Vergleichswert auf 255
> -TIMSK: OCIE0 auf 1 vergleicht OCR0 und macht Interrupt sobald 255
> erreicht ist

Damit teilst du die 256 Hz durch 255.  Du willst aber durch 256
teilen, damit du 1 Hz bekommst.  Nichts einfacher als das: lass den
Zähler ganz normal durchlaufen und benutze den Overflow-Interrupt.
Autor: Hax Sowieso (hellfire)
Datum: 07.05.2008 21:12

Vielen Dank!
>
>> -TCNT0: auf 0x00, also Startwert auf 0
>
> Ist die Voreinstellung, ist aber auch egal: nur der erste Tick
> ändert sich damit.  Da der Quarz ja sowieso ,,irgendwann'' losläuft,
> hat das keine wirkliche Relevanz.

also könnt ich die Zeile einfach weglassen?


>> -OCR0: auf 0xFF, Vergleichswert auf 255
>> -TIMSK: OCIE0 auf 1 vergleicht OCR0 und macht Interrupt sobald 255
>> erreicht ist
>
> Damit teilst du die 256 Hz durch 255.  Du willst aber durch 256
> teilen, damit du 1 Hz bekommst.  Nichts einfacher als das: lass den
> Zähler ganz normal durchlaufen und benutze den Overflow-Interrupt.

Das heisst bei TIMSK TOIE0 auf 1 zu ändern? Und OCIE0 auch einfach
weglassen?

Juhu ich komm der Sache immer näher =)
Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum: 07.05.2008 22:22

Hax Sowieso wrote:

[TCNT0 auf 0 setzen]
> also könnt ich die Zeile einfach weglassen?

Ja.

> Das heisst bei TIMSK TOIE0 auf 1 zu ändern?

Ja, und natürlich die zugehörige ISR schreiben.  Ungefähr so:
#include <stdbool.h>

#include <avr/io.h>
#include <avr/interrupt.h>

volatile bool ticked_1Hz;

ISR(TIMER0_OVF_vect)
{
  ticked_1Hz = true;
}
...
Autor: Hax Sowieso (hellfire)
Datum: 07.05.2008 22:58
Dateianhang: UHR.c (2,3 KB, 37 Downloads) | formatierter Code

Jawohl ich habs geschafft der zählt nun Sekunden :D

Vielen Dank Leute ohne euch wäre ich in 2 Jahren noch dran!

Ich häng den Code an
(Vergesst nicht in bin relativ neu auf dem Gebiet was Stil fragen
betrifft :P)
Autor: Matthias Lipinsky (lippy)
Datum: 08.05.2008 06:33

Kleiner Tip:
So sparst du Rechenzeit, da ja die Sekundenazeige nur bei Änderung
aktualisiert werden muss:
volatile uint08_t seconds;  // 8Bit reichen für 0..59Sekunden

void main (void)
{
  uint8_t  _u8SecLast = 255;
  ...


  while (1)
  {
    if ( _u8SecLast != seconds )
    {
      _u8SecLast = seconds;
      LCD_Print("Nichts los....", 1, 60, 1, 1, 1, white, black);
      sprintf(str,"sekunde %d ",(int) seconds);
      LCD_Print(str, 0, 20, 1, 1, 1, white, black);
    }
  }
}
Autor: Timmo H. (masterfx)
Datum: 08.05.2008 12:43

Schau dir einfach die Application Note 134 von Atmel an. Das ist genau
das was du suchst.
http://www.atmel.com/dyn/resources/prod_documents/...
und der entsprechende Quellcode
http://www.atmel.com/dyn/resources/prod_documents/Avr134.zip

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net