Quarz senkt Interuptzeit nicht

OP #4457607
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 #4457626
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?
Gast #4457645
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...
#4457648
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.
#4457656
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.
Gast #4457657
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?
Gast #4457675
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
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
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
> 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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.