www.mikrocontroller.net

Forum: GCC Atmega644 - OCRxn Register verwenden


Important 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.
Autor: Constantin S. (constantin_s)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,
ich weiß, die Frage wurde sicherlich schon mehrfach durchgekaut, in der 
Suche habe ich aber nichts gefunden.

Nämlich: Wie verwende ich die OCRxn Register im Atmega644?
Ich möchte 2 Timer - TCNT0 und TCNT2 laufen lassen und befülle die OCRxn 
Register dementsprechend mit Werten zwischen 0 und 255.
Dann Frage ich den Interruptvektor TIMER0_COMPA_vect ab. Also ob 
Register OCRxn und TCNTn Register gleich sind.

Ein Interrupt wird auf jeden Fall erzeugt - von beiden Vektoren. 
Allerdings scheint die Zeitspanne dazwischen unabhängig vom OCRxn 
Register zu sein, sprich ich kann reinschreiben was ich will, der 
Zeitabstand zwischen den Interrupts ist immer der selbe.

Verwenden will ich die beiden Interrupts um 2 Schrittmotoren mit einem 
Takt zu versorgen.

Im Datenblatt steht dass man für das Einschalten des CTC-Modus (in 
diesem wird dann OCRxn)verwendet nur die WGM Bits setzen muss. Oder habe 
ich da was wichtiges Überlesen? Weil grundsätzlich funktionieren die 
Interrupts ja, nur zeitlicher Unterschied ist nicht :-/

Hier noch ein paar Ausschnitte aus dem Programm:

Schreiben des Registers (z.B):
OCR2A |= 20; //Wert bei dem Interrupt erzeugt werden soll

TCCR2A |= (1<<2); //Setzen des WGM1 Bits (laut Datenblatt) für CTC-Modus
TIMSK2 |= (1<<OCIE2A); //Erlauben von Interrupts durch OCRxn Register

ISR (TIMER2_COMPA_vect)  //Interruptvektor
{ }

Prozessortakt läuft übrigens auf 20MHz, Prescaler ist 1024.
Sollten noch Infos benötigt werden bitte melden!

Danke schon im Vorhinein und eine gute Nacht,
Constantin

Autor: Constantin S. (constantin_s)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
So wie es aussieht liegt der Fehler tiefer im Programm als ich gehofft 
habe. Isoliert funktionieren die Interrupts perfekt :-/
#include <avr/interrupt.h>
#include <util/delay.h>
#include "rs232.h"

int i = 0;

void init_stepper()
{
  //Right
  TIMSK0 |= (1<<OCIE0A);
  TCCR0A |= (1<<WGM01);
  //Left
  TIMSK2 |= (1<<OCIE2A);
  TCCR2A |= (1<<WGM21);
}

int main()
{
  sei();
  setup_uart();
  init_stepper();
  uart_putchar('t');
  
  OCR0A = 254;
  OCR2A = 127;
  
  TCCR2B = (1<<CS00) | (1<<CS01) | (1<<CS02);

  TCCR0B = (1<<CS00) | (1<<CS02);

  while(1)
  {}
}


ISR (TIMER0_COMPA_vect)          //Right Motor TIMER0_OVF_vect
{
  uart_putchar('r');
  if(i >= 1)
  {
    TCCR0B &= ~((1<<CS00) | (1<<CS02));
  }
  i++;
}

ISR (TIMER2_COMPA_vect)          //Left Motor TIMER2_OVF_vect
{
  uart_putchar('l');
  if(i >= 1)
  {
    TCCR2B &= ~((1<<CS00) | (1<<CS01) | (1<<CS02));
  }
  i++;
}

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net