Forum: Mikrocontroller und Digitale Elektronik 2 Timer gleichzeitig


von Christoph K. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche mit einem ATmega16 einen Schrittmotor zu betreiben.
Dazu verwende ich Timer0 und Timer1. Mit Timer 1 erzeuge ich die 
Step-Freqenz und mit dem Timer 0 die Beschleunigungs/Bremskurve. Wenn 
ich dies so teste bekomme ich eine Frequenz die immer wieder stockt, 
aber wenn ich die nicht den Timer0 für die Rampen benutze und diesen 
Teil in Main schreibe funktioniert es. Liegt es daran dass sich die 
beiden Timer Interrupts überschneiden und so die Lücken im Timer1 
entstehen und wenn ja wie kann ich das fixen ?

Danke im Vorraus :)

von Kein Experte (Gast)


Lesenswert?

Ein Delay mit 500 ms hat in einer ISR nichts zu suchen ...

von Noch einer (Gast)


Lesenswert?

Warum einen eigenen Algorithmus erfinden. Gibt doch 2 bewährte 
funktionierende. Amtels Application Note AVR446 und das Grbl Projekt.

von Christoph K. (Gast)


Lesenswert?

Das Delay mit 500ms ist ja am Anfang um dem Start zu verzögern und hat 
keine einwirkung auf die ISR.
Gibt es zu AVR446 eine Library ?

von m.n. (Gast)


Lesenswert?


von Christoph K. (Gast)


Lesenswert?

Der Beitrag "Schrittmotoransteuerung mit A4982 und ATmega328" ist gut 
aber er ist für den ATmega328 geschrieben und der Code kann nur 1 
Schrittmotor gleichzeitig und ich bräuchte 2.
Gibt es nicht eine Library für Schrittmotoren oder gibt es eine 
Möglichkeit die 2 Timer gleichzeitig laufen zu lassen ?

von m.n. (Gast)


Lesenswert?

Christoph K. schrieb:
> Der Beitrag "Schrittmotoransteuerung mit A4982 und ATmega328" ist gut
> aber er ist für den ATmega328 geschrieben und der Code kann nur 1
> Schrittmotor gleichzeitig und ich bräuchte 2.

Zwischen Timer1 vom ATmega328 oder vom ATmega16 besteht kein 
signifikanter Unterschied. Die gezeigte Routine arbeitet mit dem 
OCR1A-Register. Verwendet man zusätzlich das OCR1B-Register läßt sich 
damit ein 2. Schrittmotor ansteuern.

Wenn man es braucht, muß man es nur machen.
Ich brauche es nicht ;-)

von Kein Experte (Gast)


Lesenswert?

Für mich ist das eine ISR und dort steht für den Fall, dass status=3 
ist, ein delay_ms(500) drin.

1
////////////////////////////////////////////////////////////////////////// Timer/Counter0 Overflow
2
ISR (TIMER0_OVF_vect){    
3
  
4
  switch (status){
5
    case 1 : status=1;a_fast();break;
6
    case 2 : b_fast();break;
7
    case 3 : status=1;PORTD ^= (1 << PD4);delay_ms(500);a_timer=0;b_timer=99;break;
8
  }
9
  
10
}

War das nicht auch timer0, der ab und zu "stockt"?

Aber ich bin kein Experte ..

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.