mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMEGA324 Timer Int


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: Uwe H. (bbv)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PD6 ist auch als Ausgang definiert?

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

Das geht lt. Datenblatt nicht. Richtig wäre
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.
_delay_us(100);

: Bearbeitet durch User
Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan E. (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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:
void   _delay_ms (double __ms);
void   _delay_us (double __us);

Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Carl D. (jcw2)
Datum:

Bewertung
0 lesenswert
nicht 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:
>
> void   _delay_ms (double __ms);
> void   _delay_us (double __us);
> 

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.

Autor: NoFrager (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uwe H. (bbv)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: NoFrager (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu blöd um eine klare Frage zu stellen?

Dann reicht es auch nicht fürs Programmieren.

Autor: Uwe H. (bbv)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TIMSK2 |= (1 << TOIE);

funktioniert leider nicht

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.?

Autor: Veit D. (devil-elec)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: S. Landolt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Carl D. (jcw2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

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.:
enum { // Label -> Bit-Wert
  CS_STOP     = 0,  // oder 0b000, dann wird klar, daß es um 3Bits geht
  CS_DIV_1.   = 1,  //      0b001
  // ...
  CS_DIV_1024 = 7   //      0b111
};
TCCRB = (0b0         << WGM22) // WGM<4
      | (CS_DIV_1024 << CS20 ) // Bit-Wert an richtige Position schieben

Autor: Karl M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
(0 << CS01) | (1 << CS01) | (2 << CS01)
und steht so nicht im Datenblatt für das Einstellen des Timer2 
Prescalers.

Autor: Carl D. (jcw2)
Datum:

Bewertung
0 lesenswert
nicht 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
>
(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
Autor: Überleg Mal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.