Hallo Community, Ich versuche geradeüber Interupts ein signal abzutasten, dafür habe ich erst einmal ein wenig mit dem Interupt herumprobiert. Ich verwende einen externen Quarz mit 16MHz der thereoretisch eine Interuptfrequenz von 16/256=62,5kHz erzeigen müsste leider messe ich mit meinem Oszilloskop nur 1,024kHz. Woran könnte das liegen (fuses sind richtig gesezt, da ich Signal erhalte und es weg ist wenn ich den Quarz ziehe) Hier der Quellcode: #define F_CPU 16000000UL //3686400UL /* 1MHz */ #include <avr/io.h> #include <util/delay.h> //integriert Zeit #include <avr/interrupt.h> // Prototypen void long_delay(uint16_t); int main() { //Interupt cli(); //prescale timer to 1 TCCR0B |= (0<<CS02) | (0<<CS01) | (1<<CS00); //enable timer overflow interrupt TIMSK |= (1<<TOIE0); sei(); //Ports DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB2); //PORTB while (1) { } } //Funktion für exaktere Zeit void long_delay(uint16_t ms) { for(; ms>0; ms--) _delay_ms(1); } ISR(TIMER0_OVF_vect) ///* Interruptfrequenz = Arbeitsfrequenz/(256*Prescale) Interuptzeit = 1/Interruptfrequenz { PORTB ^= (1<<PB0); }
16000000, aber ich hab es scho mit mehreren probiert der steht noch von vorher da
ziemlich grauslige konstruktion. sogar while(1) ist auskommentiert :(((
Hallo, Initialisiere den Timer0 bitte vollständig.
1 | TIMSK |= (1<<TOIE0); |
2 | TCNT0 = 0; |
3 | TCCR0A = 0; |
4 | TCCR0B = (1<<CS01); |
Und bitte daran denken die Fusebits richtig zu sezen. Welchen atmel AVR verwendest Du?
flip schrieb: > ziemlich grauslige konstruktion. sogar while(1) ist auskommentiert > :((( Was meinst Du damit ?
ziemlich grauslige konstruktion. sogar while(1) ist auskommentiert :((( Tobias K. schrieb: > //PORTB while (1) > { > }
Ich verwende Atmelstudio 6 und hab bei den Fuses EXTXOSC_8MHz_XX_14CK_0MS eingestellt.
Ich habe PB0 an ein Oszilloskop angeschlossen und erhalte ein rechtecksignal, aus dem ich übrigens auch die tatsächlichen frequenzen hab.
Deine Interruptroutine wird nicht in Nullzeit ausgeführt. Du kannst nicht davon ausgehen, das der Pin genau in der Frequenz wackelt, die durch FCPU/prescale vorgegeben ist, wenn du einen interrupt verwendest um den pin wackeln zu lassen. Das springen in die ISR, und das ausführen und verlassen dieser kostet nunmal takte...
Tobias K. schrieb: > Ich verwende Atmelstudio 6 und hab bei den Fuses > EXTXOSC_8MHz_XX_14CK_0MS eingestellt. EXTXOSC? Das sind die kleinen Döschen mit den 4 Beinchen. Bist du sicher, daß du sowas hast? Wahrscheinlich hast du aber einen Ext Crystal. Deswegen funktioniert das nicht. Und sag jetzt nicht, es geht ja. Wenn es ginge, würdest du 31,25KHz messen.
dunno.. schrieb: > Das springen in die ISR, und das ausführen und verlassen dieser kostet > nunmal takte... ... und das dauert das bei einer 1-Befehls-Totschleife immer gleich lang.
es kann doch nicht sein dass die abweichung so groß istvon einem Soll von 62,5x10^3 und einem ist von 1,024x10^3 aufrufen in der Sekunde.
Tobias K. schrieb: > es kann doch nicht sein dass die abweichung so groß istvon einem > Soll > von 62,5x10^3 und einem ist von 1,024x10^3 aufrufen in der Sekunde. Wenn du keinen Quarzoszillator angeschlossen hast, sondern einen Quarz, hast du bei dieser Fuse-Einstellung überhaupt keinen Sollwert. Stell den Controller auf Ext. Crystal. Dann läuft das auch.
nein, ich hätte auch weniger takte dafür angesetzt. wo kommt denn die 256 in den timer? da muss doch irgendwo mal ein wert rein, ich sehe nur das setzen des prescalers?
Das heißt also, dass, wenn die low-fuse auf intern 8 MHz/1 gestellt ist, an PB0 15625 Hz zu messen sind, richtig? Ausprobieren.
> wo kommt denn die 256 in den timer?
Das ist der 8-bit-Durchlauf des Timer0.
Ich verwende einen ATTny2313a und was ist mit low-fuse auf 8MHz/1 gemeint?
Tobias K. schrieb: > Ich verwende einen ATTny2313a Und was hast du da angeschlossen? Einen Quarz(2-Beiner) oder einen Oszillator(4-Beiner)?
Tobias K. schrieb: > Quarz mit 16MHz also kein Oszillator, daher 2 beine an PA0, PA1 und PB0 hängt am Oszi
Es bestehen Zweifel, dass die low-fuse richtig gesetzt ist; wenn diese auf den Auslieferungszustand, interner RC-Oszillator, gestellt wird, müsste das gezeigte Programm 1953 Hz liefern, bei gelöschter CKDIV8-fuse die genannten 15625.
S. Landolt schrieb: >> wo kommt denn die 256 in den timer? > Das ist der 8-bit-Durchlauf des Timer0. Naja dann ist doch schon alles klar. der Timer tickt mit 16mhz/(1*256) = 62,5 khz. Es wird in die ISR gesprungen, das braucht 4 takte, laut datenblatt, die ISR selbst braucht x takte (1 - 2?), der rücksprung kostet auch wieder 4 takte. sagen wir mal es wären 10 takte, dann sollten wir aber bei 6,25 khz landen.. ich würde mal davon ausgehen, dass die C-ISR auch noch register sichert? versuch doch mal die ISR auszuziehen: ISR(TIMER0_COMP_vect, ISR_NAKED)
Mein grosses V. schrieb: > Tobias K. schrieb: >> Ich verwende Atmelstudio 6 und hab bei den Fuses >> EXTXOSC_8MHz_XX_14CK_0MS eingestellt. > > EXTXOSC? Das sind die kleinen Döschen mit den 4 Beinchen. Erst informieren und dann falsche Tipps geben ist zwar nicht besser als bei dir, aber weit weniger wahrscheinlich. Was du meinst heisst EXTCLK. EXTXOSC ist ein externer Quarz am internen Oszillator.
Tobias K. schrieb: > //PORTB while (1) > { > } Das Programm kann immer noch überhaupt nicht richtig laufen!
Flip B. schrieb: > Tobias K. schrieb: >> //PORTB while (1) >> { >> } > > Das Programm kann immer noch überhaupt nicht richtig laufen! ?? Bei mir steht oben auf dem Bildschirm
1 | //PORTB
|
2 | |
3 | while (1) |
4 | {
|
5 | |
6 | }
|
Tobias K. schrieb: > //PORTB > > while (1) > { > > } > } Flip B. schrieb: >> //PORTB while (1) >> { >> } > > Das Programm kann immer noch überhaupt nicht richtig laufen! Flip, dein Browser versteht da was anders als meiner..
low=0x6E: läuft der Controller also mit 16/8 MHz. Müssten an PB0 3906 Hz liegen.
dunno.. schrieb: > sagen wir mal es wären 10 takte, dann sollten wir aber bei 6,25 khz > landen.. Unsinn³. A. K. schrieb: > Was du meinst heisst EXTCLK. EXTXOSC ist ein externer Quarz am internen > Oszillator. Ja. Der hat zwei interne Oszillatoren. Einen mit einem internen RC-Glied und einen, an den wird extern ein Quarz angeschlossen. Deswegen Ext. Crystal.
S. Landolt schrieb: > low=0x6E: läuft der Controller also mit 16/8 MHz Aas soll das heißen. Was müsste ich da denn einstellen?
> Aas soll das heißen. Was müsste ich da denn einstellen?
Das haben Sie eingestellt, lt. Bild.
Ist das wirklich ein 16 MHz-Quarz?
Ja, es ist sicher ein 16MHz Quarz und das war die Voreinstellung (Ich habe zuvor noch nicht mit Quarzen gearbeitetund kenne mich, desshalb damit nicht aus).
Tobias K. schrieb: > 1,024kHz. asd schrieb: > Soll = 62,5kHz Mein grosses V. schrieb: > 31,25KHz S. Landolt schrieb: > 15625 Hz S. Landolt schrieb: > 1953 Hz dunno.. schrieb: > 6,25 khz S. Landolt schrieb: > 3906 Hz Fosc=(pi*Fensterkreuz/Würfelbecher²)*Anzahl Treppenstufen Eiffelturm
A. K. schrieb: > Was du meinst heisst EXTCLK. EXTXOSC ist ein externer Quarz am internen > Oszillator. Ja. In Studio4 steht da richtig schön "Ext. Crystal Osc.". Ziehe meine Meldung zurück.
Danke, daran war is gelegen, habe jetzt eine Frequenz von 62,5kHz
Arbeitslosenstatistik-Fälschungs-Entlarver schrieb: > Fosc=(pi*Fensterkreuz/Würfelbecher²)*Anzahl Treppenstufen Eiffelturm Ist nicht die bestmögliche Jahreszeit für nüchterne Auskünfte.
Arbeitslosenstatistik-Fälschungs-Entlarver schrieb: > Mein grosses V. schrieb: >> 31,25KHz Was an einem mit 62,5KHz getoggelten Pin auch das einzig richtige ist.
Mein grosses V. schrieb: > Ja. In Studio4 steht da richtig schön "Ext. Crystal Osc.". Ziehe meine > Meldung zurück. Dass Atmel mit dem neuen Studio diese Einstellung verschlimmbessert hat, das war mir auch schon aufgefallen. Im 4er ist es sonnenklar. Im 6er wird das wohl autogeneriert, was zwar billiger ist, aber eben auch schlechter.
> Ist nicht die bestmögliche Jahreszeit für nüchterne Auskünfte.
Hölle Alaaf! Höllau!
Tobias K. schrieb: > Danke, daran war is gelegen, habe jetzt eine Frequenz von 62,5kHz daran? woran?
> das Kreuz bei den Fuses bei CKDIV/8 rausnehmen > Dein UART gibt falsche Zeichen aus. Merkwürdig, mein Taschenrechner auch, ich gebe 8*1024 ein und er liefert 8192, partout nicht 31250 oder 62500.
Tobias K. schrieb: > das Kreuz bei den Fuses bei CKDIV/8 rausnehmen Hast Du die dritte Antwort ignoriert? Da wurde die Lösung doch bereits genannt. Beitrag "Re: Quarz senkt Interuptzeit nicht" ...
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.