Quarz senkt Interuptzeit nicht

OP #4457607
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);
}
Gast #4457645
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...
Gast #4457675
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.
Gast #4457677
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)
#4457684
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.
Gast #4457802
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren