www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CTC-Mode will nicht ganz so wie ich es will


Autor: FrankH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
ich sitze hier an einem Problem.

µC Atmega8 mit 16MHz Oszilator myAVRUSB

Ich möchte einen Schrittmotor steuern, bzw. eine Fahrrampe 
programmieren.
Ich berechne die Cn - Zeiten des 16Bit-Timer1 direkt vor der Ausgabe.
Dazu verwende ich den CTC-Mode und habe dafür den COM1A0 = 1 gesetzt.
Das läuft auch alles ganz hervorragend. Es bedeutet aber, dass 2 Takte 
benötigt werden für 1 Schritt des Schrittmotors. Das verwirrt mich und 
bringt auch meine ganze Rechnung durcheinander. Lieber hätte ich es zB. 
wenn der Interrupt auslöst und der OCR1A nachgeladen wird, die Flanke 
nach der Berechnung wieder fällt und ich somit bei jedem Auslösen eines 
Interrupts auch einen Schritt mit dem SM mache.
Ich bekomme aber irgendwie nicht heraus wie ich das anstelle.
Ich hoffe ihr habt dazu irgendeine Idee.
Gruss
Frank

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>dass 2 Takte benötigt werden für 1 Schritt des Schrittmotors.

CTC erzeugt in einem Durchlauf nur einen halben Takt.

Im einfachsten Fall die Zeiten halbieren. Oder du benutzt eine PWM-Mode 
mit variablen Top.
Bei Atmel gibt es AppNotes zu diesem Thema.

MfG Spess

Autor: FrankH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Spess,
danke für die schnelle Antwort. Laut Datenblatt kann ich dann nur 10Bit 
nutzen, das ist mir aber zu wenig. Bin schon am überlegen ob ich immer 
nur bei geraden oder ungraden Schrittnummern einen neuen Cn berechne.
Ich habe mir von Atmel das AVR446: Linear speed control of stepper motor 
einverleibt. Jedoch kann ich dazu irgendwie nichts finden.
Gruss
Frank

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Laut Datenblatt kann ich dann nur 10Bit nutzen,....

Bei den PWM-Modes 14,15 (Fast PWM) kannst du OCR1A bzw. ICR1 als Top (16 
Bit) verwenden. Damit wird die Frequenz eingestellt. Mit dem anderen 
OC-Register das Taktverhältnis festlegen.

> Jedoch kann ich dazu irgendwie nichts finden.

Möglich. Den genauen Inhalt habe ich jetzt nicht im Kopf.

Wie sieht denn deine Hardware aus?

MfG Spess

Autor: FrankH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
wie beschrieben, habe das myAVRUSB Board mit einem Atmega8 und einem 
externen 16MHz Oszillator.
Ich habe nochmals nachgeschaut, wenn ich COM1A1, WGM13,WGM12,WGM11 und 
WGM10 auf Eins setzte, dann kann ich den TOP Wert mit ICR1 setzten und 
das Tastverhältnis mit OCR1A bestimmen.
Habe ich das so richtig verstanden?
Gruss
Frank

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>...wenn ich COM1A1, WGM13,WGM12,WGM11 und WGM10 auf Eins setzte,dann kann
>ich den TOP Wert mit ICR1 setzten

Nein, WGM10 auf 0.

MfG Spess

Autor: FrankH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
upps,
stimmt hier steht es auch, habe nur kurz drübergeschaut. Ich werde es 
heute noch ausprobieren und bedanke mich schon einmal für deine Hilfe.
Gruss
Frank

Autor: FrankH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, habe das mal ausprobiert, jetzt regt sich nichts mehr... ;-(
Also auf zur Fehlersuche, ich hoffe ihr könnt mal kurz meinen Code 
kontrollieren.

#include <avr/io.h>
#include <avr/interrupt.h>
void ioinit(void)
{
   TCCR1A |= (1 << COM1A1);
   TCCR1B |= (1 << CS11) | (1 << WGM13) | (1 << WGM12) | (1 << WGM11);
   ICR1 = 1000;
   OCR1A = 100;

   TIMSK |= (1 << OCIE1A);
   DDRB |= (1 << PB0);
   PORTB &= ~(1 << PB0);
}
int main(void)
{
   ioinit();
   sei();
   while(1){}
   return 0;
}

Sicherlich irgendwas ganz einfaches...... hoffe ich doch  ;-)
Gruss
Frank

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>   TIMSK |= (1 << OCIE1A);

Ohne passennde Interruptroutine setzt man dieses Bit besser nicht.

Autor: FrankH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Hinweis, aber der Code ist nur ein Ausschnitt.
Ich habe aber meinen Fehler gefunden.

   TCCR1A |= (1 << COM1A1)|(1 << WGM11);
und noch
   TIMSK |= (1 << OCIE1A) | (1 << ICF1);
   TIFR |= (1 << ICF1);

jetzt läuft es wunderbar, genau so wie ich es haben wollte.
Danke nochmals für deine Hilfe
Gruss
Frank

Autor: FrankH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ähhmm,
ein Frage hätte ich da noch. Ich habe ja vorher immer den Interrupt für 
OCR1A dafür benutzt in der ISR-Routine den neuen Wert für OCR1A zu 
berechnen.
Wenn ich das jetzt in dem PWM fast - Mode mache welche ISR-Routine 
benutze ich denn jetzt für den ICR1?

vorher    ISR(SIG_OUTPUT_COMPARE1A) { //code }
jetzt ?

kann ich den immer noch verwenden oder gibt es dafür (ICR1) eine eigene 
Routine?
Gruss
Frank

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>oder gibt es dafür (ICR1) eine eigene Routine?

Ja.

MfG Spess

Autor: FrankH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha,
dachte ich es mir doch. Wie heisst diese Routine denn? Würdest du mir 
das bitte mitteilen, ich finde dazu leider nichts.
Gruss
Frank

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Würdest du mir das bitte mitteilen, ich finde dazu leider nichts.

Ich kann eigentlich kein C. Könnte 'SIG_INPUT_CAPTURE1' sein.

MfG Spess

Autor: FrankH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Routine ist
ISR(SIG_INPUT_CAPTURE1) { //code }

und anstatt OCIE1A zu setzen muss TICIE1 gesetzt werden.
   TIMSK |= (1 << TICIE1) | (1 << ICF1);
   TIFR |= (1 << ICF1);

   ICR1 = 1000;
   OCR1A = 100;

   DDRB |= (1 << PB0);
   PORTB &= ~(1 << PB0);
usw.

So, jetzt sollte ich damit wieder weitermachen können, wieder mal ein 
dickes Dankeschön..
Gruss
Frank

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.