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.
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
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.
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.
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); |
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
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.
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.
der Delay ist nur um zu testen, ist klar, in einer ISR kein Delay... PD6 ist auch als Ausgang definiert? ja , ich kann messen
Zu blöd um eine klare Frage zu stellen? Dann reicht es auch nicht fürs Programmieren.
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.?
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.
> 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.
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 |
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.