Forum: Mikrocontroller und Digitale Elektronik Quarz senkt Interuptzeit nicht


von Tobias K. (tobias-k)


Lesenswert?

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);
}

von Stefan S. (sschultewolter)


Lesenswert?

#define F_CPU 16000000UL //3686400UL     /* 1MHz */


Was denn nun?

von Tobias K. (tobias-k)


Lesenswert?

16000000, aber ich hab es scho mit mehreren probiert der steht noch von 
vorher da

von flip (Gast)


Lesenswert?

ckdiv8?

von flip (Gast)


Lesenswert?

ziemlich grauslige konstruktion. sogar while(1) ist auskommentiert :(((

von Karl M. (Gast)


Lesenswert?

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?

von Karl M. (Gast)


Lesenswert?

flip schrieb:
> ziemlich grauslige konstruktion. sogar while(1) ist auskommentiert
> :(((

Was meinst Du damit ?

von asd (Gast)


Lesenswert?

flip schrieb:
> ckdiv8?

Soll = 62,5kHz
Ist = 1,024kHz.

Teilerfaktor != 8

von flip (Gast)


Lesenswert?

ziemlich grauslige konstruktion. sogar while(1) ist auskommentiert :(((

Tobias K. schrieb:
> //PORTB   while (1)
>   {
>      }

von Tobias K. (tobias-k)


Lesenswert?

Ich verwende Atmelstudio 6 und hab bei den Fuses 
EXTXOSC_8MHz_XX_14CK_0MS eingestellt.

von flip (Gast)


Lesenswert?

der avr braust also irgendwie durch den code.

von flip (Gast)


Lesenswert?

sicher, dass auch der gezeigte code ausgeführt wird?

von Tobias K. (tobias-k)


Lesenswert?

Ich habe PB0 an ein Oszilloskop angeschlossen und erhalte ein 
rechtecksignal, aus dem ich übrigens auch die tatsächlichen frequenzen 
hab.

von dunno.. (Gast)


Lesenswert?

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...

von Mein grosses V. (vorbild)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von Tobias K. (tobias-k)


Lesenswert?

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.

von Mein grosses V. (vorbild)


Lesenswert?

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.

von dunno.. (Gast)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

Wär immer noch hilfreich, den Controller-Typ zu kennen.

von S. Landolt (Gast)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

> wo kommt denn die 256 in den timer?
Das ist der 8-bit-Durchlauf des Timer0.

von Tobias K. (tobias-k)


Lesenswert?

Ich verwende einen ATTny2313a und was ist mit low-fuse auf 8MHz/1 
gemeint?

von Mein grosses V. (vorbild)


Lesenswert?

Tobias K. schrieb:
> Ich verwende einen ATTny2313a

Und was hast du da angeschlossen? Einen Quarz(2-Beiner) oder einen 
Oszillator(4-Beiner)?

von Tobias K. (tobias-k)


Lesenswert?

Tobias K. schrieb:
> Quarz mit 16MHz

also kein Oszillator, daher 2 beine an PA0, PA1 und PB0 hängt am Oszi

von S. Landolt (Gast)


Lesenswert?

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.

von dunno.. (Gast)


Lesenswert?

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)

von Tobias K. (tobias-k)


Angehängte Dateien:

Lesenswert?

Hier mal ein Bild von den gesetzten Fuses

von (prx) A. K. (prx)


Lesenswert?

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.

von Flip B. (frickelfreak)


Lesenswert?

Tobias K. schrieb:
> //PORTB   while (1)
>   {
>      }

Das Programm kann immer noch überhaupt nicht richtig laufen!

von (prx) A. K. (prx)


Lesenswert?

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
  }

von dunno.. (Gast)


Lesenswert?

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..

von S. Landolt (Gast)


Lesenswert?

low=0x6E: läuft der Controller also mit 16/8 MHz. Müssten an PB0 3906 Hz 
liegen.

von Mein grosses V. (vorbild)


Lesenswert?

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.

von Tobias K. (tobias-k)


Lesenswert?

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?

von Flip B. (frickelfreak)


Angehängte Dateien:

Lesenswert?

Tatsache. I'm sorry

von S. Landolt (Gast)


Lesenswert?

> 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?

von Flip B. (frickelfreak)


Lesenswert?

flip schrieb:
> ckdiv8

von Tobias K. (tobias-k)


Lesenswert?

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).

von Flip B. (frickelfreak)


Lesenswert?

mache aus
[x] ckdiv/8
[ ] ckdiv/8

von Arbeitslosenstatistik-Fälschungs-Entlarver (Gast)


Lesenswert?

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

von Mein grosses V. (vorbild)


Lesenswert?

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.

von Tobias K. (tobias-k)


Lesenswert?

Danke, daran war is gelegen, habe jetzt eine Frequenz von 62,5kHz

von (prx) A. K. (prx)


Lesenswert?

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.

von Mein grosses V. (vorbild)


Lesenswert?

Arbeitslosenstatistik-Fälschungs-Entlarver schrieb:
> Mein grosses V. schrieb:
>> 31,25KHz

Was an einem mit 62,5KHz getoggelten Pin auch das einzig richtige ist.

von (prx) A. K. (prx)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

> Ist nicht die bestmögliche Jahreszeit für nüchterne Auskünfte.

Hölle Alaaf! Höllau!

von Flip B. (frickelfreak)


Lesenswert?

Tobias K. schrieb:
> Danke, daran war is gelegen, habe jetzt eine Frequenz von 62,5kHz

daran? woran?

von Arbeitslosenstatistik-Fälschungs-Entlarver (Gast)


Lesenswert?

S. Landolt schrieb:
> Hölle Alaaf! Höllau!

Dein UART gibt falsche Zeichen aus.
;-)

von Tobias K. (tobias-k)


Lesenswert?

das Kreuz bei den Fuses bei CKDIV/8 rausnehmen

von S. Landolt (Gast)


Lesenswert?

> 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.

von Hannes (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.