Forum: Mikrocontroller und Digitale Elektronik Unterschied 16Bit Timer 8Bit Timer Schnelligkeit AtMega328


von Sebi1997 (Gast)


Lesenswert?

Hallo

Ich habe folgendes Problem:

Ich möchte einen Schrittmotor mit einem Arduino Nano (AtMega328) 
ansteuern. Dazu habe ich mir den Treiberbaustein A4988 geholt auf 
welcher nur ein Rechtecksignal mit gewünschter Frequenz angelegt werden 
muss um einen Schritt weiter zu drehen.

Ich wollte dies Frequenz mit einem Timer Interrupt CTC realisieren. Das 
Problem ist bei dem 16Bit Timer1 läuft der Motor langsamer als bei den 
8Bit Timern 0 oder 2, sprich die Frequenz ist bei 8 bit Timer höher. 
Warum ist das so? Was mache ich falsch? Beide Timer haben den selben 
prescaler und den selben Wert auf dem sie hochzählen müssen,also müssten 
sie ja gleich schnell sein?

Timer1 (16Bit):
1
void setup()   {
2
3
               
4
noInterrupts();           
5
TCCR1A = 0;
6
TCCR1B = 0;
7
TCNT1 = 0;               
8
OCR1A = 50;           
9
TCCR1B |= (1 << CS11);    
10
TIMSK1 |= (1 << OCIE1A);  
11
interrupts();     
12
                            
13
}

Timer0 (8Bit)
1
void setup()   {
2
                  
3
noInterrupts();          
4
TCCR0A = 0;
5
TCCR0B = 0;
6
TCNT0 = 0;              
7
OCR0A = 50;           
8
TCCR0B |= (1 << CS11);   
9
TIMSK0 |= (1 << OCIE1A);  
10
interrupts();     
11
                            
12
}

Danke im Vorraus!

von m.n. (Gast)


Lesenswert?

Sebi1997 schrieb:
> Das Problem ist bei dem 16Bit Timer1

, daß setup() und loop() beim Arduino die Timer teilweise selber 
verwenden und diese damit nicht mehr frei zur Verfügung stehen.

Schreibe Dein Programm mit main() und ohne setup+loop. Dann 
funktionieren die Timer auch, wie man es selber programmiert.

von spess53 (Gast)


Lesenswert?

Hi

>Ich wollte dies Frequenz mit einem Timer Interrupt CTC realisieren.

Und an welcher Stelle stellst du CTC ein?

MfG Spess

von Sebi1997 (Gast)


Lesenswert?

OK Vielen Dank!

von Sebi1997 (Gast)


Lesenswert?

> Und an welcher Stelle stellst du CTC ein?

Verstehe nicht was du genau damit meinst? Die gesetzten Register sind im 
Zitierten Code.

von Viktor B. (coldlogic)


Lesenswert?

Auswendig kenne ich die Register zwar nicht, aber ich glaube, wenn in 
allen Registern Nullen stehen, läuft der Timer in Normal Mode. Also bis 
zum höchstem Wert und dann auf Null.

MfG

von spess53 (Gast)


Lesenswert?

Hi

>Verstehe nicht was du genau damit meinst? Die gesetzten Register sind im
>Zitierten Code.

CTC-Mode wird über die WGM-Bits im TCCR0A (8Bit) und TCCR1A/TCCR1B 
(16Bit) eingestellt. Die finde ich bei dir nicht.

MfG Spess

von DraconiX (Gast)


Lesenswert?

Viktor B. schrieb:
> Auswendig kenne ich die Register zwar nicht, aber ich glaube, wenn
> in allen Registern Nullen stehen, läuft der Timer in Normal Mode. Also
> bis zum höchstem Wert und dann auf Null.
>
> MfG

Richtig! Wenn WGM00/01/02 in TCCRnB nicht gesetzt ist, dann ist er im 
"normal Mode" und zählt bis 0xff bzw. 0xffff.

Um in den CTC (Mode 2) zu kommen muss WGM01 gesetzt sein:
1
TCCR0B |= ((1 << CS11) | (WGM01));

von DraconiX (Gast)


Lesenswert?

Richtig... Aber beim 328 sind, egal ob 8 oder 16bit Timer beide auf 
TCCRnA und B verteilt. WGM02 in B und 0,1 in A.

Gerade mal im DB geschaut, da ist dann auch meine Zeile oben falsch 
(wäre sie sowieso da die 1<< fehlte ?) hat das Handy "weg gezaubert".

Also:
1
TCCR0A |= (1<<WGM01);

von Sebi1997 (Gast)


Lesenswert?

Danke Leute!

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Nur für die Dir Nachfolgenden wäre es eine nette Geste, wenn Du den 
kompletten Code zeigen würdest.

Nicht nur, daß wir hier dann sogar einen kompletten Code hätten (von dem 
aufgerufenen Interrupt sehe ich oben nämlich nix) - Dir Folgende könnten 
mit Deinem Beispiel Ihre Probleme selber lösen.
Quasi dem Forum was zurück geben :)

MfG

von M. K. (sylaina)


Lesenswert?

Sebi1997 schrieb:
> Ich wollte dies Frequenz mit einem Timer Interrupt CTC realisieren. Das
> Problem ist bei dem 16Bit Timer1 läuft der Motor langsamer als bei den
> 8Bit Timern 0 oder 2, sprich die Frequenz ist bei 8 bit Timer höher.
> Warum ist das so?

Ich nehme mal an, dass du den Puls im Interrupt erzeugst. Ein 16 Bit 
Timer zählt insgesamt 65535 Counts weit, ein 8 Bit Timer zählt "nur" 255 
Counts weit.  Und da du bei den Timern keinen CTC-Mode eingestellt hast 
zählen die Timer auch immer bis zu ihren Top-Werten, folglich muss die 
Frequenz, die mit dem 8 Bit Timer erzeugt wird, schneller sein als die 
Frequenz, die mit dem 16 Bit Timer erzeugt wird, da du ja beide Timer 
mit gleichem Takt laufen lässt.

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.