Hife bei Counter-Mode des Arduinos

Guten Morgen,
Ich brauche dringend Hilfe bei einer Abitur Aufgabe, die wie folgt lautet:

Erstellen Sie das Unterprogramm in C wait50ms(), welches ca. 50 ms wartet, wenn es aufgerufen wird. Der Maschienenzyklus soll 1 mikrosekunde betragen und es soll ein integrierter Hardware Timer ohne Interrupt genutzt werden. Die Initialisierung soll auch in dem Unterprogramm erfolgen.

Wir sollen das Programm auf unseren Mikrocontroller anpassen, den wir auch in der Schule verwenden, welches der Atmega 2560 ist, aber dennoch den vorgegebenen Maschienenzyklus verwenden.

Ich würde die Aufgabe mit dem Countermode lösen, jedoch weiß ich nicht, wie ich das ganze Programmieren und Initialisieren soll, so dass diese 50ms wartet.

In unserer Formelsammlung steht zu dem Thema Initialisierung des Counters, nur folgendes:

 cli();  
  TCNT5 = 0;
  TCCR5A = 0;
  TCCR5B = 7;
  TIMSK5 = 1;
sei();

Mein Lösung wäre jetzt diese hier gewesen:

void wait50ms(){
  cli();
  TCNT5 = 0;
  TCCR5A = 0;
  TCCR5B = 7;
  TIMSK5 = 1;
  sei();
  while(TCNT5!=15536){       
    }
  TIMSK5=0;

}

Ich überprüfe auf den Wert 15536, da 50ms= 0,05s, 0,05*1.000.000=50.000 65536-50.000=15536.
Jedoch bin ich mir ziemlich sicher, dass es so nicht funktionieren kann, aber ich weiß auch nicht, wie ich es sonst lösen soll. Dementsprechend würde ich mich sehr freuen, wenn mir jemand die richtige Lösung "programmieren" könnte, aber vor allem die Lösung Schritt für Schritt erklären könnte.
ich bedanke mich im voraus für eure Hilfe.

Und was sagt dein Lehrer dazu, wenn wir dir hier die Lösung präsentieren ?
Der liest hier sicher mit.
Und nein, ich werde es nicht machen und dir damit eine schlechte Benotung spendieren.

Wenn TCNT5 hochzählt dann würde ich auf >50000U warten.

Oder ein OCR auf 50000U setzen und auf einen Match warten.

Finde ich wirklich sehr nobel von dir, dass du mir nicht helfen willst, damit ich keine schlechte Benotung bekomme. Bestimmt hast du dann einfach überlesen, dass es mir vor allem um eine Erklärung geht, wieso man es so lösen muss. Es ist keine Aufgabe die wir von dem Lehrer bekommen haben, damit diese benotet wird, sondern es ist eine freiwillige Übung meinerseits, da wir demnächst eine Klausur schreiben und dies eventuell gefragt werden könnte. Ich möchte nur gerne verstehen, wie man so eine Aufgabe lösen kann und dementsprechend wollte ich hier Hilfe suchen. Mir geht es einfach darum zu verstehen, was man bei so einem Aufgabentyp machen muss. Nur ein Quellcode bringt mich da nicht weiter.

Ok vielen Dank :+1:t2:

Schön, das liest sich in deinem Eingangspost allerdings anders.

Man muß vor allem das Datenblatt des Controllers lesen. Andere Timer funktionieren anders. Aber das Hochzählen bis ein bestimmter Zählerstand erreicht/überschritten wird dürfte so ziemlich bei jedem Controller gehen.

Das verstehe ich nicht, aber für den Mega2560 hätte ich eine Lösung:

// #include <Streaming.h>
// Stream &cout = Serial; // cout Emulation für AVR Arduinos
#define ledPin 13
void wait50ms() {
  cli();
  TCCR5A = 0;
  TCCR5B = (1 << CS51) | (1 << CS50);  // Prescaler 64
  TCCR5C = 0;
  TCNT5 = 0;
  OCR5A = 0;
  OCR5B = 0;
  OCR5C = 0;
  TIMSK5 = 0;
  //cout << "\tTCCR5B: " << TCCR5B << endl;
  //cout << "\tmillis vorher: " << millis() << endl;
  sei();
  while (TCNT5 < 12500) {}
  //cout << "\tmillis nachher: " << millis() << endl;
}

void setup() {
  Serial.begin(9600);
  Serial.println("\nStart");
  pinMode(ledPin, OUTPUT);
}

void loop() {
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
  wait50ms();
  //while (1);
}

grafik

Wie weit bist Du?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.