Hallo,
@ oberallgeier: ziemlich voreingenommen zu behaupten ich würde nur abschreiben. Ich habe das Tutorial hier, auf Microcontroller.net und
andere gemacht. Überall ist es anders. Jeder verwendet einen andern Chip und zufälligerweise keiner den 84er.
Den Befehl " TIMSK0" habe ich aus meinem Datenblatt da in diesem Register das Bit "OCIE0B" existiert. Das es Falsch ist
konnte ich nicht ahnen, wie auch wenn es so in den Tutorials angegeben ist.
Ich meinte ja nur das es im Netz eher Hilfe zum 2313er gib als vom 84er.
@ Wsk8: Danke dir. Aber so wie du das geschrieben hast setze ich im Register (TCCR0A) von Timer 0 den
CTC- Modus und im Register (TCCR0B) von Timer 0 die entsprechenden Vorteilerbits ???
Im Microcontroler.net wird ein 2313 verwendet und hier im Tutorial ein mega32. Habe mich halt an die Tutorials gehalten und die Registerbezeichnungen vom 84 eingesetzt. Wenn das dann nicht hinhaut liegt das bestimmt nicht daran das ich nicht nachdenke. Wollte lediglich etwas Hilfe.
Zudem was soll mir ein Programm bringen in dem auch ein 2313 verwendet wird??? Da bin ich genauso nass wie in den Tutorials.
Dann sollte man ein Tutorial für alle chips machen. Aber mich nicht anhauen weil ich Tutorials falsch interpretiere.
Mal der Code aus dem Roboternetz Tutorial hier:
Code:
/* Es wird der Timer2 (8-Bit) eines ATmega32 verwendet, der mit einem Quarz
mit 7,3728 MHz betrieben wird. Im Abstand von 0,01 ms erzeugt der Timer
einen Interrupt, also eine Frequenz von 100000 Hz (oder 100 kHz).
Der Timer wird auf einen Prescaler von 1 und einem OCR2-Wert von 73 konfiguriert. */
volatile uint8_t countTimer2; // Speichert den aktuellen Zählerwert
SIGNAL(SIG_OUTPUT_COMPARE2)
{
countTimer2++;
}
// Initialisierung:
TCCR2 = (1<<CS20) | (1<<WGM21); // Prescaler von 1 | CTC-Modus (siehe unten für Beschreibung)
OCR2 = 73; // Vergleichswert
TIMSK |= (1<<OCIE2); // Interrupts aktivieren und damit Timer starten
sei();
// Funktionen zum benutzen der Timer:
/** Diese Funktion nicht aufrufen. Wird von sleep_millisec aufgerufen.
Bei t=100 schläft die Funktion 1 ms. */
inline void sleep(uint8_t t)
{
// countTimer2 wird in der ISR oben inkrementiert
countTimer2 = 0;
while (countTimer2 < t);
}
/** Schläft x-Millisekunden. */
inline void sleep_millisec(uint16_t msec)
{
uint16_t i;
for(i=0; i<msec; i++) {
sleep(100);
}
}
--------------------------------------------------------------------------------
Ich wollte zufällig die gleiche Funktion wie im Beispiel. Das dann an dem Code alles falsch ist kann ich ja nicht wissen.
Falsch bei mir war : ISR statt SIGNAL, SIG_OUTPUT_COMPARE2 war auch falsch, statt TIMSK sthet bei mir TIMSK0, auch falsch,
statt OCR2 muss ich TCCR0A oder TCCR0B verwenden....
Also werde ich es mal mit den 2 Registen getrennt versuchen (TCCR0A &&TCCR0B)..... Mal sehen...
Danke
Lesezeichen