Forum: Mikrocontroller und Digitale Elektronik ATMEGA324 Timer Int


von Uwe H. (bbv)


Lesenswert?

Hallo ….
Ich verstehe es einfach nicht, hoffe jemand kann mir helfen,
ich messe am PD6 mit Oszi, folgender Code
void Timer_Init (void)
{

TCCR2B = (1 << WGM00)
//| (1 << CS10); //489 Hz
//| (1 << CS00); //489 Hz
//| (1 << CS22); //61 Hz
//| (1 << CS01); //1,9 KHz
//| (1 << CS02); // 61 Hz
//| (0 << CS01) | (1 << CS00) | (2 << CS01); //122 Hz
| (0 << CS01) | (1 << CS01) | (2 << CS01); //15 Hz

 TIMSK2 |= (1<<TOIE0);
  // enable global interrupts
  sei();
}

ISR ( TIMER2_OVF_vect)
{

      PORTD |= (1 << PD6);//PD6 auf 1
    _delay_ms(0.1);
      PORTD &= ~(1 << PD6);//PD6 auf 0


}
Der atmega ist an Quarz 4 Mhz angeschlossen.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

PD6 ist auch als Ausgang definiert?

Uwe H. schrieb:
> TIMSK2 |= (1<<TOIE0);

Das geht lt. Datenblatt nicht. Richtig wäre
1
TIMSK2 |= (1 << TOIE);

Uwe H. schrieb:
> _delay_ms(0.1);

Du kannst an die _delay_ms() und _delay_us() Funktion keine 
Gleitkommazahl übergeben, es sind nur Integer erlaubt. Also z.B.
1
_delay_us(100);

: Bearbeitet durch User
von MWS (Gast)


Lesenswert?

Man nimmt zum Beschreiben der Timer*2*-Register TCCR*2*B, nicht Bitnamen 
anderer Timer wie CS*0*0.

Ansonsten wäre es schlau wenn man eine Frage hat, diese auch zu stellen, 
bzw. hinzuschreiben.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Nur noch für die Zukunft. Ein delay in einer ISR ist keine gute Idee, da 
damit der MC blockiert wird. Das spielt im Moment noch keine Rolle, aber 
immerhin sind 100µs keine anderen Reaktionen mehr möglich.
In der Hauptschleife ist das undramatisch.

von Stefan E. (sternst)


Lesenswert?

Matthias S. schrieb:
> Du kannst an die _delay_ms() und _delay_us() Funktion keine
> Gleitkommazahl übergeben, es sind nur Integer erlaubt.

Man kann, darf, und es funktioniert auch.
Sie sind nicht nur zum Spaß so definiert:
1
void   _delay_ms (double __ms);
2
void   _delay_us (double __us);

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Stefan E. schrieb:
> Man kann, darf, und es funktioniert auch.

Gut, dann ziehe ich den Einwand zurück :-) Ich tue es trotzdem nicht, 
weil ich mir dann den ganzen Floating Point Kram ins Projekt ziehe.

: Bearbeitet durch User
von Carl D. (jcw2)


Lesenswert?

Stefan E. schrieb:
> Matthias S. schrieb:
>> Du kannst an die _delay_ms() und _delay_us() Funktion keine
>> Gleitkommazahl übergeben, es sind nur Integer erlaubt.
>
> Man kann, darf, und es funktioniert auch.
> Sie sind nicht nur zum Spaß so definiert:
>
1
> void   _delay_ms (double __ms);
2
> void   _delay_us (double __us);
3
>

Das sind Macros, die nur mit Konstanten funktionieren, weil die 
tatsächlich zu wartenden Takte vom Compiler berechnet werden (müssen). 
Der kann float/double.

von NoFrager (Gast)


Lesenswert?

MWS schrieb:
> Ansonsten wäre es schlau wenn man eine Frage hat, diese auch zu stellen,
> bzw. hinzuschreiben.

Finde ich auch immer wieder faszinierend mit welcher Selbst-
verständlichkeit hier Probleme mit impliziter Fragestellung
gepostet werden bei denen sich jeder Leser selbst die
(nichtgestellte) Frage ausformulieren darf.

von Uwe H. (bbv)


Lesenswert?

der Delay ist nur um zu testen,

ist klar, in einer ISR kein Delay...

PD6 ist auch als Ausgang definiert? ja , ich kann messen

von NoFrager (Gast)


Lesenswert?

Zu blöd um eine klare Frage zu stellen?

Dann reicht es auch nicht fürs Programmieren.

von Uwe H. (bbv)


Lesenswert?

TIMSK2 |= (1 << TOIE);

funktioniert leider nicht

von MWS (Gast)


Lesenswert?

Uwe H. schrieb:
> TIMSK2 |= (1 << TOIE);
> TIMSK2 |= (1<<TOIE0);

MWS schrieb:
> nicht Bitnamen anderer Timer

In der Annahme, dass Du die Antworten hier liest, könnte man annehmen, 
dass Du für diese Technik leider zu begriffstutzig bist. Es gibt auch 
andere schöne und erfüllende Tätigkeiten, die vergebender sind, wie wäre 
es mit gärtnern, freie Natur, etc.?

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ich würde dir ja gern helfen wie viele andere sicherlich auch. Nur ohne 
kompletten Code der wenigstens kompiliert und ohne konkrete Frage was 
der Timer überhaupt machen soll, welcher Modi usw. wird das nun einmal 
nichts.

von S. Landolt (Gast)


Lesenswert?

> gern helfen wie viele andere sicherlich auch
Schon, aber gleich bei der ersten Zeile fallen die Schultern herunter 
und man pfeift durch die Nase:

> TCCR2B = (1 << WGM00)

Setzt in TCCR2B das Bit 0, also CS20.

von Carl D. (jcw2)


Lesenswert?

1
TCCR2B = (1 << WGM00)
2
//| (1 << CS10); //489 Hz
3
//| (1 << CS00); //489 Hz
4
//| (1 << CS22); //61 Hz
5
//| (1 << CS01); //1,9 KHz
6
//| (1 << CS02); // 61 Hz
7
//| (0 << CS01) | (1 << CS00) | (2 << CS01); //122 Hz
8
| (0 << CS01) | (1 << CS01) | (2 << CS01); //15 Hz

Nach Auflösung der inherenten Kryptik*:
"Timer2 wird mit Vorteiler 1024 betrieben"
4MHz // 1024 // 256 -> 15,25Hz, also wenigstens der Kommentar ist (fast) 
ok

Man kann übrigens, wenn man den kurzen Puls an PD6 zu kurz findet, den 
Pin auch einfach togglen. Statt "|=" einfach "^=" schreiben, nur diese 
eine Zeile, kein delay() mehr nötig, kein Rückseten mit "&=". Gemessen 
wurden dann 0 ms zwischen auf- und absteigender (oder umgekehrt) Flanke.

* WGM00=0
  CS01=1
  0<<1 | 1<<1 | 2<<1 = 7 oder 0b111


Schöner schreibt man z.B.:
1
enum { // Label -> Bit-Wert
2
  CS_STOP     = 0,  // oder 0b000, dann wird klar, daß es um 3Bits geht
3
  CS_DIV_1.   = 1,  //      0b001
4
  // ...
5
  CS_DIV_1024 = 7   //      0b111
6
};
7
TCCRB = (0b0         << WGM22) // WGM<4
8
      | (CS_DIV_1024 << CS20 ) // Bit-Wert an richtige Position schieben

von Karl M. (Gast)


Lesenswert?

Hallo Carl D. schrieb:
> TCCR2B = (1 << WGM00)
> //| (1 << CS10); //489 Hz
> //| (1 << CS00); //489 Hz
> //| (1 << CS22); //61 Hz
> //| (1 << CS01); //1,9 KHz
> //| (1 << CS02); // 61 Hz
> //| (0 << CS01) | (1 << CS00) | (2 << CS01); //122 Hz
> | (0 << CS01) | (1 << CS01) | (2 << CS01); //15 Hz

Es wurde ja schon mehrmals geschrieben die Kostanten (Defines) (1 << 
WGM0[0-3], CS0[0-2] gehören zu Timer0!

Diese Schreibweise ist sehr ungewöhnlich
1
(0 << CS01) | (1 << CS01) | (2 << CS01)
und steht so nicht im Datenblatt für das Einstellen des Timer2 
Prescalers.

von Carl D. (jcw2)


Lesenswert?

Karl M. schrieb:
> Hallo Carl D. schrieb:
>> TCCR2B = (1 << WGM00)
>> //| (1 << CS10); //489 Hz
>> //| (1 << CS00); //489 Hz
>> //| (1 << CS22); //61 Hz
>> //| (1 << CS01); //1,9 KHz
>> //| (1 << CS02); // 61 Hz
>> //| (0 << CS01) | (1 << CS00) | (2 << CS01); //122 Hz
>> | (0 << CS01) | (1 << CS01) | (2 << CS01); //15 Hz
Das war das Original des TOs und nicht meine darunter zu findende 
Variante.
Ok, ich hätte das mit "Achtung jetzt kommt Mist" kenntlich machen 
sollen.


> Es wurde ja schon mehrmals geschrieben die Kostanten (Defines) (1 <<
> WGM0[0-3], CS0[0-2] gehören zu Timer0!
"gehören zu" ist eher Konvetion, denn Eigenschaft. Es sind Kostanten, 
die zugegebenermaßen sehr Kreativ zur Verschlüsselung eingesetzt wurden.
Wenn man so was wie ein Typesystem hätte, ... (wäre dann aber "zu 
abstrakt")


> Diese Schreibweise ist sehr ungewöhnlich
>
1
(0 << CS01) | (1 << CS01) | (2 << CS01)
> und steht so nicht im Datenblatt für das Einstellen des Timer2
> Prescalers.
Das ist eher ein Indikator für das Unverständnisses des TO in diesem 
Fachgebiet.  Und zwar Sprache und HW.
Cut&Paste bis es zufällig geht, das gibt's sogar unter dem Label "Profi"

: Bearbeitet durch User
von Überleg Mal (Gast)


Lesenswert?

Carl D. schrieb:
> Das ist eher ein Indikator für das Unverständnisses des TO in diesem
> Fachgebiet.  Und zwar Sprache und HW.

Habt ihr schon mal daran gedacht dass solche Threads Fake sein
könnten? Gezielt bestimmten Mist produzieren damit hier die
Fachleute "anspringen" und damit hier auf den Seiten viel
Traffic entsteht (ist ja im Sinne des Seitenbetreibers)?

Es spricht einiges dafür, z.B. weil der TO nur immer wieder
gerade soviel Bruchstücke postet damit der Thread am Laufen
bleibt. Schon oft genug dieses Verhalten hier erlebt dass
es leider viel zu verdächtig ist. Denn der TO könnte sich
ja nach der Aufforderung durchaus einmal detaillierter
äussern.

Im Endeffekt ist es ja eine Verarschung der vielen Hilfs-
bereiten, aufgrund eines (vermuteten) Geschäftsinteresses.

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.