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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.