www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timereinstellung


Autor: Mellon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hy! Arbeite mit einem Atmega8 und hab nen Quarztakt von 16Mhz.
Undzwar hätt ich ne Frage in Bezug auf die Timers. Ich brauch einen 
Timer der auf 1µs genau geht. Jetzt stellt sich die Frage welchen Timer 
ich nehmen soll und weiters ist es überhaupt möglich 1µs zu 
schaffen?????

Autor: UBoot-Stocki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Wenn Du den Timer von 0 auf 15 zählen lässt, dauert das genau 
1/16000000*16=0,000001s =1us

Gruß

Andreas

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Egal welcher Timer. Wenn Du bei 16MHz Vorteiler = 16 verwendest, zählt 
er pro uS eins weiter. Ist also möglich.

Autor: fnah (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
type  ctc | prescaler      1 | value 1000000.000 Hz | delta   0.000% | 
ctc 15
type  ctc | prescaler      8 | value 1000000.000 Hz | delta   0.000% | 
ctc 1

Autor: Mellon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich würde gerne den 16 Bit Timer (16Mhz Quarztakt) verwenden und hab 
schon einiges ausprobiert und im Datenblatt nachgeschaut, jedoch ohne 
erfolg!! Es wäre hilfreich wenn mir jemand den Code (in C) der für die 
Timereinstellung benötigt wird posten könnte

pls

Autor: Alex Bürgel (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mit AVR's kenne ich mich als einer der wenigen hier nicht aus 
(PIC-Nutzer).
Prinzipiell sollte es aber so z.B. funktionieren (ohne Interrupts):

-Du wählst die Clock Source für Timer0 im TCCR0 Register als "1"
-Jetzt schreibst du ins TCNT0 Register den Wert "240"
-und machst eine leere while(TCNT0); Schleife

damit zählt Timer0 von 240 bis 255 hoch und springt dann auf 0 zurück. 
Das sind 16 Zählschritte bei 16MHz was dann 1µs ist.
void pause(void)
{
    TCCR0 = 1;
    TCNT0 = 240;
    while(TCNT0);
}

wenn du jetzt die Funktion pause() aufrufst wartet der Prozessor 1µs

Man möge mich korrigieren wenn ich schwachfug geschrieben habe.

Autor: Mellon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke @ Alex!

Mein Aufgabe ist es, dass ich einen Pin am Port von 1µs bis 200ms auf 
low bzw high halten muss. Kann ich da einfach ich die funktion void 
pause() biliebig lang aufrufen und startet der timer0 von meinem Atmega8 
einfach mit while(TCNTO)?????

Autor: Alex22 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach so, ich hatte dich so verstanden, dass du nur genau 1µs brauchtest.
void pause(long delay)
{
    TCCR0 = 1;
    while(delay)
    {
        TCNT0 = 240;
        while(TCNT0);
        delay--;
    }
}

Jetzt kannst du z.B. pause(100) aufrufen und hast dann eine Verzögerung 
von 100µs.

Reicht es für deine Anwendung, wenn du:
PORTA.0 high setzt,
pause(100); anwendest
PORTA.0 low setzt?

Oder musst du während der Port high ist noch andere Sachen erledigen?

Autor: Mellon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Frage noch: kann man den Timer starten, anhalten und stoppen 
auch???

Autor: Alex22 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Eine Frage noch: kann man den Timer starten, anhalten und stoppen
auch???

Wo ist der Unterschied zwischen Anhalten und Stoppen?

Der Timer hört auf zu zählen, wenn du TCCR0 = 0; setzt.

Autor: Mellon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thanks :)

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guck' dir mal das Datenblatt an, da steht alles über die Timer drin.
Eine variable Wartezeit kannst du komfortabel und genau über den 
Output-compare-INT machen. Bei der Schleife oben ist 1. der µC für die 
Pause 'blockiert', 2. stimmt die Zeit nicht mehr wenn andere INTs aktiv 
sind und 3.  hast du wegen der Laufzeit der Befehle bei 100 Durchläufen 
auch eine Abweichung.

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

Bewertung
0 lesenswert
nicht lesenswert
@Mellon

Teste das aber sorgfältig.
Ich denke nämlich nicht das das hier sauber
funktioniert.
void pause(long delay)
{
    TCCR0 = 1;
    while(delay)
    {
        TCNT0 = 240;
        while(TCNT0);
        delay--;
    }
}

Wenn der Timer mit einem Vorteiler von 1 läuft ist
es mehr oder weniger Zufall, wenn du ihn in

        while(TCNT0);

genau dann erwischt, wenn er 0 geworden ist.


Wenn es nur darum geht einen einzelnen Impuls mit definierter
Länge zu erzeugen, würde ich den Timer1 (da 16 Bit)
dafür hernehmen und schauen das ich das mit einem
zusätzlichen Pin Toggle am Timer hinkriege.

Autor: Mellon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab diesen Sofwareteil implementiert und der Timer zählt brav!!
Beim Testen ist mir aufgefallen, dass ich er nur einmal bis 255 zählt 
und nicht wieder anfängt!!!!

Kann mir irgendwer bitte helfen, wichtig!!!

Autor: Mellon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist fast das ganze Programm(ohne output()) und ich hoffe irgendwer 
findet den Fehler(Timer zählt nur einmal, das bedeutet nur bei i=0, bei 
i=1 zählt er nicht mehr)!
#include <mega8.h>

void settimer();  
void output();

unsigned long int delaytime=5000000;

void settimer()
{   unsigned long int i=0;
    
    for(i=0;i<delaytime;i++)
    {  
       TCNT0=240;
       TCCR0=1;
       while(TCNT0);
    }   
}

void main(void)
{  TIMSK=0x00;
   TCCR0=0x01;
  
   for(;;)
   {  
      if(!(PINB&0x02))       //Abfrage, ob PIN(PB1) High ist
      { settimer();
        output();
      }
   }  
}


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.