Forum: Mikrocontroller und Digitale Elektronik Mit Quarz + Timer 1ms erzeugen


von Hans (Gast)


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? :\

von Michel (Gast)


Lesenswert?

Mach doch kurze (3686 Take) und lange (3687 Takte) Millisekunden im 
Verhältnis 2:3. Dann stimmt langfristig alles. ;-)

von Hans (Gast)


Lesenswert?

Michel schrieb:
> Mach doch kurze (3686 Take) und lange (3687 Takte) Millisekunden im
> Verhältnis 2:3. Dann stimmt langfristig alles. ;-)

Der Gedanke kam mir auch schon, jedoch ist die andere Problematik 
erstmal gravierender ;-)

von avr (Gast)


Lesenswert?

Für genaue Sekunden und UART sind Quarze mit
4,9152 bzw. 9,8304 MHz bestens geeignet.

avr

von Peter D. (peda)


Lesenswert?

Erstmal muß man wissen, wie genau sollen die 1ms denn überhaupt sein?
D.h. wie genau absolut und wie genau akkumulierend.

Davon hängt dann alles andere ab.


Peter

von Hans (Gast)


Lesenswert?

Na es sollte natürlich schon genau sein - wollte nen Zeitstempel 
mitschicken zu gemessenen Daten.

Aber die Krücke kommt so ja eh erstmal nicht zurecht...

von Michel (Gast)


Lesenswert?

Hans schrieb:
> Na es sollte natürlich schon genau sein - wollte nen Zeitstempel
> mitschicken zu gemessenen Daten.

Und da hast du Bedenken bei einem Jitter von 0.3 µs?

von Hans (Gast)


Lesenswert?

Nein, ich habe Bedenken, dass mein uC in dem Setup offenbar zu 
laaaangsam ist, um die Aufgabe zu Erfüllen...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.