Forum: Mikrocontroller und Digitale Elektronik Timereinstellung


von Mellon (Gast)


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

von UBoot-Stocki (Gast)


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

von Gast (Gast)


Lesenswert?

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

von fnah (Gast)


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

von Mellon (Gast)


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

von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


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.
1
void pause(void)
2
{
3
    TCCR0 = 1;
4
    TCNT0 = 240;
5
    while(TCNT0);
6
}

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

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

von Mellon (Gast)


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)?????

von Alex22 (Gast)


Lesenswert?

Ach so, ich hatte dich so verstanden, dass du nur genau 1µs brauchtest.
1
void pause(long delay)
2
{
3
    TCCR0 = 1;
4
    while(delay)
5
    {
6
        TCNT0 = 240;
7
        while(TCNT0);
8
        delay--;
9
    }
10
}

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?

von Mellon (Gast)


Lesenswert?

Eine Frage noch: kann man den Timer starten, anhalten und stoppen 
auch???

von Alex22 (Gast)


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.

von Mellon (Gast)


Lesenswert?

Thanks :)

von Thilo M. (Gast)


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.

von Karl H. (kbuchegg)


Lesenswert?

@Mellon

Teste das aber sorgfältig.
Ich denke nämlich nicht das das hier sauber
funktioniert.
1
void pause(long delay)
2
{
3
    TCCR0 = 1;
4
    while(delay)
5
    {
6
        TCNT0 = 240;
7
        while(TCNT0);
8
        delay--;
9
    }
10
}

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.

von Mellon (Gast)


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!!!

von Mellon (Gast)


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)!
1
#include <mega8.h>
2
3
void settimer();  
4
void output();
5
6
unsigned long int delaytime=5000000;
7
8
void settimer()
9
{   unsigned long int i=0;
10
    
11
    for(i=0;i<delaytime;i++)
12
    {  
13
       TCNT0=240;
14
       TCCR0=1;
15
       while(TCNT0);
16
    }   
17
}
18
19
void main(void)
20
{  TIMSK=0x00;
21
   TCCR0=0x01;
22
  
23
   for(;;)
24
   {  
25
      if(!(PINB&0x02))       //Abfrage, ob PIN(PB1) High ist
26
      { settimer();
27
        output();
28
      }
29
   }  
30
}

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.