mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fragen zum tutorial: AVR - Die genaue Sekunde / RTC


Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hab mir heute nochmal, den Code von peter Dannegger und den 
Verbesserungsvorschlag zu Gemüte genommen.

link: AVR - Die genaue Sekunde / RTC

Bei dem Erstgenannten, sehe ich soweit durch, bis auf folgendes.
define DEBOUNCE  256L    // debounce clock (256Hz = 4msec)

Wofür steht das L ? Ich hab immer gedacht, dass  aus DEBOUNCE long 
signed int wird und somit 4byte groß ist. Passt aber irgendwie zu der 
Erklärung im Tutorial nicht:

"Der Softwareteiler wird mit 256 gewählt, d.h. 256 Timerinterrupts pro 
Sekunde, und kann somit nur mit einem einzigen Byte realisiert werden."

1. 256 -> ist doch 2byte groß (9 bit), also kann ich es doch nicht mit 
einem einzigen byte realisieren
prescaler = (uchar)DEBOUNCE; 

2. Wird bei dem cast, nur die unteren 8 bits verwendet und der rest 
abgeschnitten?

3.
Dann zudem Verbesserungsvorschlag:
 if( --prescaler == 0 ){ 
    prescaler = (uchar) DEBOUNCE;
    second++;      // exact one second over  
  }  
#if XTAL % DEBOUNCE
  if (prescaler <= XTAL % DEBOUNCE) {
    OCR1A += XTAL / DEBOUNCE +1;   /* um 1 Takt längere Periode um 
              den Rest abzutragen */
  } else {
#endif
    OCR1A += XTAL / DEBOUNCE;   /* kurze Periode */
#if XTAL % DEBOUNCE    
  }
#endif
}

Die Zeilen kann ich nicht nachvollziehen, wie der rest bei der 
Geschichte gleichmäßig abgetragen werden soll.
if (prescaler <= XTAL % DEBOUNCE) {
    OCR1A += XTAL / DEBOUNCE +1;   /* um 1 Takt längere Periode um 
              den Rest abzutragen */

xtal = 11059008 debounce = 256

11059008 / 256 = 43199,25 -> Bedingung wird immer ausgeführt, wenn der 
prescaler <= 25 ist -> d.h. dass das Vergleichsregister OCR1A für die 
nächsten Timer Interrupts( 25 noch) mit OCR1A = 43199  + 43199  + 1 
geladen. Der Wert ist doch viel zu hoch? Wie soll ich den auf den rest 
von 64 / s kommen? Ich weiß einfach nicht, wo hier der Denkfehler ist.

Gruß und Dank

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dirk wrote:
> Hallo,
>
> hab mir heute nochmal, den Code von peter Dannegger und den
> Verbesserungsvorschlag zu Gemüte genommen.
>
> link: AVR - Die genaue Sekunde / RTC
>
> Bei dem Erstgenannten, sehe ich soweit durch, bis auf folgendes.
>
>
define DEBOUNCE  256L    // debounce clock (256Hz = 4msec)
>
> Wofür steht das L ? Ich hab immer gedacht, dass  aus DEBOUNCE long
> signed int wird und somit 4byte groß ist.

An der Stelle soll dem C-Präprozessor mitgeteilt werden, dass an allen 
Stellen bei denen er mit DEBOUNCE rechnet, mit der Präzission LONG 
gerechnet werden soll. Das soll Ungenauigkeiten aufgrund von 
Überlaufffehlern verhindern.

> Passt aber irgendwie zu der
> Erklärung im Tutorial nicht:
>
> "Der Softwareteiler wird mit 256 gewählt, d.h. 256 Timerinterrupts pro
> Sekunde, und kann somit nur mit einem einzigen Byte realisiert werden."
>
> 1. 256 -> ist doch 2byte groß (9 bit), also kann ich es doch nicht mit
> einem einzigen byte realisieren
>
>
prescaler = (uchar)DEBOUNCE; 
>

Es fehlt der Datentyp von prescaler, aber an der Stelle wird vermutlich 
eine Variable prescaler angelegt. Hier reicht für 256 Stufen tatsächlich 
ein Byte. ein Byte kann die Werte 0 bis 255 aufnehmen, d.h. 256 Stufen. 
Wenn man hier 256 speichert, wird durch den Überlauf eine 0 gespeichert, 
also die erste Stufe.

> 2. Wird bei dem cast, nur die unteren 8 bits verwendet und der rest
> abgeschnitten?
>

Ja.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort.

prescaler wird vorher vom Typ uchar angelegt und somit deckt sich das 
mit deiner Aussage.

Hast du vielleicht noch eine Idee für den Verbesserungsvorschlag?

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.