Forum: Mikrocontroller und Digitale Elektronik Takt (50kHz) an einen PortPin (ATMega128)


von Newbee Detlev (Gast)


Lesenswert?

Hallo Zusammen,

Ich bin neu auf dem µC Sektor und bin ganz stolz das mein Timer1 einen 
Interrupt ca alle 1ms einspringt anbei auszug aus meinem Quell code
1
extern volatile unsigned int clock;
2
extern volatile unsigned int refr_clock;
3
4
5
void Init_Timer1(void)
6
{
7
  TCCR1B = (1<<CS0);            
8
  SFIOR =0x01;                            
9
  TIFR  = 0xFF;                  
10
  TIMSK |= (1<<TOIE1);
11
}  
12
13
interrupt [SIG_OVERFLOW0] void SW_CLOCK_interrupt(void)                                                                 
14
{
15
16
SEI(); 
17
18
  TCNT0=0x67;         // Timer für 1 msec vorsetzen                                                          
19
20
  if(clock < 0xfff0)    // Erhöhe Software-Clock-Zähler, 
21
  {
22
     clock++;    // solange Höchstwert nicht erreicht ist
23
  } 
24
25
  if(refr_clock < 0xfff0)    // Erhöhe Software-Clock-Zähler, 
26
  {
27
     refr_clock++;    // solange Höchstwert nicht erreicht ist
28
  } 
29
 
30
              
31
}

der Klappt so weit --> Jetzt möchte ich mithilfe des Compare Register 
für den Timer einen Takt 50kHz (Tastverhältnis 1:1) erzeugen. verstehe 
aber das Datenblatt und die vielen Beiträge hier im Forum nicht. Daher 
meine Bitte

1.) nochmals Kurze erklärung eines Compare ínterupts
2.) Wie sieht mein Code aus wenn ich den Interrupt alle 10µs auslösen
    möchte wenn mein Timer nach 1 ms überläuft. (Ich denke die ausgabe 
auf
    ein Portbin sollte dann kein Problem sein)

Danke Detlev

von STK500-Besitzer (Gast)


Lesenswert?

Im Compare-Mode wird der Timer-Wert mit einem Grenzwert verglichen.
Wird dieser Grenzwert erreicht, wird der Timer entweder resettet oder 
die Zählrichtung umgekehrt.

Für deine 2. Frage dürfte es diverse Beispiele geben, wenn du im 
Suchfenster "CTC" oder "PWM" eingibst.

von Newbee Detlev (Gast)


Lesenswert?

Das Heißt also für mich das ich den Timer1 den ich im Millisekunden 
Rhytmus betreibe und auf dem Ich mittels Overflow Interrupt etwas 
ausführe
gar nicht doppelt werden kann da bei Jedem erreichen des Compare Wertes 
der Timer zurück gesetzt ist

Daher stelle ich die Frage anders
Ich möchte einen Timer mit eier Zahl Länge von 1ms haben (klappt :-))

Nun mochte ich das alle 10µs auch ein Interrupt ausgelöst wird und das 
dachte ich geht mit einem compare Register ohne den Grundtimer zu 
beeinflüssen.

Verstehe ich da was völlig falsch??

Und wie würdet Ihr das Problem Lösen?

Gruss

Detlev

von Karl H. (kbuchegg)


Lesenswert?

Newbee Detlev schrieb:
> Das Heißt also für mich das ich den Timer1 den ich im Millisekunden
> Rhytmus betreibe und auf dem Ich mittels Overflow Interrupt etwas
> ausführe
> gar nicht doppelt werden kann da bei Jedem erreichen des Compare Wertes
> der Timer zurück gesetzt ist

Nicht so schnell.
Erst mal: Was genau verstehst du unter 'Compare-Mode'?

Das Compare Register dient in erster Linie dazu, den jeweiligen 
Zählerstand mit diesem Compare-Register zu vergleichen und wenn beide 
gleich sind, eine Aktion auszulösen. Das Mindeste was passiert ist, dass 
in einem Statusregister ein Bit gesetzt wird, welches diese 
Übereinstimmung anzeigt. Wie es dann allerdings weiter geht, wie dieses 
Bit weitere Aktionen auslöst, hängt in weiten Teilen davon ab, welchen 
Modus du am Timer konkret eingestellt hast.

> Daher stelle ich die Frage anders
> Ich möchte einen Timer mit eier Zahl Länge von 1ms haben (klappt :-))
>
> Nun mochte ich das alle 10µs auch ein Interrupt ausgelöst wird und das
> dachte ich geht mit einem compare Register ohne den Grundtimer zu
> beeinflüssen.

Das wird etwas schwierig. Machbar ist es.
Du musst dir nur ausrechnen, wie weit der Timer zählen muss, damit genau 
10µs (oder zumindest dicht drann) vergangen sind. Das ist dann der 
(erste) Wert, der ins Compare Register muss. Ist die Übereinstimmung da, 
kannst du dir einen Interrupt auslösen lassen, in dem du dir den 
nächsten Compare-Wert bestimmst, nach dem wieder 10µs vergangen sind.

> Und wie würdet Ihr das Problem Lösen?

Die Grundprämisse, dass der Timer eine Zykluszeit von 1ms haben soll 
über Bord werfen. Der Timer soll ein regelmässiges Signal auslösen 
(einen Interrupt) und für die Zeitdauer, wann das geschehen soll, wähle 
ich die kleinste Zeitdauer die ich benötige. Von dieser Zeitdauer kann 
ich dann alle Vielfachen leicht ableiten, indem ich selber mitzähle.

Anders ausgedrückt:
Wenn ich eine Uhr habe, die nur einen Stundenzeiger hat, dann ist es 
schwierig damit 5 Minuten 30 Sekunden abzumessen.
Habe ich aber eine Uhr mit einem Sekundenzeiger, dann ist es leicht 
Sekunden abzumessen (ich brauch nur die Anzahl der Sekunden vom Beginn 
meiner Messung an mitzählen). Nach jeweils 60 Sekunden ist eine Minute 
vergangen. Nach jeweils 60 Minuten ist eine Stunde vergangen.


PS: Nimm das SEI() aus deinem Interrupt Handler raus. Du weißt noch 
nicht, was du damit alles anrichten kannst.

von Newbee Detlev (Gast)


Lesenswert?

OK werde ich machen!!

Danke für deine Ausführliche Hilfe, jetzt wird mir einiges mehr klar.
Werde es einmal ausprobieren.

Schönes Wochenende

Detlev

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.