Mit Quarz + Timer 1ms erzeugen

Gast #2239493
Lesenswert?
• ▲
▼
Hallo Leute!

Ich möchte gerne mit meinem Mikrocontroller einen 1ms Interrupt 
erzeugen. Jetzt hab ich grad n kleines Problem...

Mein Aufbau ist folgendermaßen:
1
 XT2 3.6864MHz        XT1 32.768kHz
2
      ||                    ||
3
  --------------------------------
4
 |                                |
5
 |            MSP430              |
6
  --------------------------------

Der XT2 ist logischerweise der Systemtakt, der Uhrenquarz soll die Zeit 
zählen. XT2 ist wegen UART usw. ein Baudratenquarz mit dieser krummen 
Frequenz.

Jetzt hab ich zwei Probleme:

1.)
Um eine genaue Zeitbasis von 1ms zu bekommen, bräuchte ich ja nun 
entweder vom XT1 einen Zählwert von 32,768 -> geht nicht, also 32 (zu 
schnell) oder 33 (zu langsam) :-\ ungünstig dafür
Der XT2 eignet sich ebensowenig, da auch aus ihm keine genaue 
1ms-Zeitbasis generiert werden kann. Hier könnte ich jetzt immer bis 
3686,4 zählen, was aber selbiges Problem wie oben ist.

Mir scheint, als ist der Baudratenquarz dafür ungeeignet und man sollte 
lieber eine gerade Zahl nehmen und den UART modulieren.

Eigent sich der Uhrenquarz NUR für ganze Sekunden? Ich raffs nicht so 
ganz - ich muss hier doch nen Denkfehler haben. Wieso dann genau 
32.768kHz und nicht auch eine gerade Zahl - gut vergesst die Frage - 
wegen binärem Teilen.

2.)
Wenn ich den Timer mit 32 oder 33 laufen lasse, um ~1ms zu erhalten, 
dann ist mein uC zumindest in meiner momentanen vorgehensweise nicht in 
der Lage, diesen Timer hochzuzählen, da er zu langsam ist. Konnte ich 
mir irgendwie nicht so wirklich vorstellen, aber kann das sein?

Software:
1
timer_flag;
2

3
main
4
{
5
  ...mach bisschen was;
6
  ...mach noch bisschen was anderes;
7

8
  if( timer_flag )
9
  {
10
    timing_advance_ms_counter();
11
    timer_flag = 0;
12

13
    KONTROLL_LED_TOGGLEN; // HIER MESSE ICH MIT DEM OSZILLOSKOP
14
  }
15

16
  ...
17
}
18

19

20
timer_ISR
21
{
22
  if( 1ms_timer )
23
  {
24
    timer_flag = 1;
25
  }
26
}
27

28

29
void timing_advance_ms_counter( void )
30
{
31
  TIMING.milliseconds++;
32
  
33
  if( TIMING.milliseconds > 999 )
34
  {
35
    TIMING.milliseconds = 0;
36
    TIMING.seconds++;
37
    
38
    if( TIMING.seconds > 59 )
39
    {
40
      TIMING.seconds = 0;
41
      TIMING.minutes++;
42
      
43
      if( TIMING.minutes > 59 )
44
      {
45
        TIMING.minutes = 0;
46
        TIMING.hours++;
47
        
48
        if( TIMING.hours > 23 )
49
        {
50
          TIMING.hours = 0;
51
          TIMING.days++;
52
          
53
          if( TIMING.days > 99 )
54
          {
55
            TIMING.days = 0;
56
          }
57
        }
58
      }
59
    }
60
  }
61
}

Was der Controller sonst noch so gerade macht ist nicht viel - n paar 
Buffer für den UART vorbereiten, paar Integer-Berechnungen.

Jedenfalls bekomme ich am Kontroll-Punkt eine Frequenz von ~200Hz - hier 
sollten wegen des Togglens natürlich 500Hz sein.

Mein Controller ist mit seinen 3.6MHz also zu lahm dafür? :\

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.