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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Sebi1997 (Gast)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


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


Bewertung
0 lesenswert
nicht lesenswert
OK Vielen Dank!

von Sebi1997 (Gast)


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


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


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


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


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


Bewertung
0 lesenswert
nicht lesenswert
Danke Leute!

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


Bewertung
1 lesenswert
nicht 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)


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

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]
  • [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.