mikrocontroller.net

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


Autor: Newbee Detlev (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
extern volatile unsigned int clock;
extern volatile unsigned int refr_clock;


void Init_Timer1(void)
{
  TCCR1B = (1<<CS0);            
  SFIOR =0x01;                            
  TIFR  = 0xFF;                  
  TIMSK |= (1<<TOIE1);
}  

interrupt [SIG_OVERFLOW0] void SW_CLOCK_interrupt(void)                                                                 
{

SEI(); 

  TCNT0=0x67;         // Timer für 1 msec vorsetzen                                                          

  if(clock < 0xfff0)    // Erhöhe Software-Clock-Zähler, 
  {
     clock++;    // solange Höchstwert nicht erreicht ist
  } 

  if(refr_clock < 0xfff0)    // Erhöhe Software-Clock-Zähler, 
  {
     refr_clock++;    // solange Höchstwert nicht erreicht ist
  } 
 
              
}


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

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Newbee Detlev (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Newbee Detlev (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.