Forum: Mikrocontroller und Digitale Elektronik Atmega8 Prescaler 1 bei Timer1 verhält sich wie Prescaler 8


von A. F. (elagil)


Lesenswert?

Hallo,

ich möchte testweise ein 16Mhz Signal an einem triggernden Ausgangspin 
eines Atmega8 haben (bestückt mit 16Mhz Quartz, Fuses FF(low) D9(high)).

Bis zum Prescaler 8 abwärts stellen sich die Frequenzen einwandfrei ein, 
bei Prescaler 1 bleibt mein maximaler Ausgangstakt bei 2Mhz, es gibt 
auch keine Reaktion auf eine Veränderung des Compare Registers (gemessen 
mit Oszilloskop, 40Mhz [ich weiß, dass es kein 16Mhz rechteck mehr schön 
anzeigt, aber zumindest nicht wie 2Mhz]). Habe ich einen Fehler gemacht?
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
#define baseFreq16MHz TCCR1B = (1<<WGM12) | (1<<CS10)  // Prescaler 1; ctc mode+compare OCR1A
5
#define baseFreq2MHz TCCR1B = (1<<WGM12) | (1<<CS11)  // Prescaler 8
6
#define baseFreq250kHz TCCR1B = (1<<WGM12) | (1<<CS11) | (1<<CS10)  // Prescaler 64
7
#define baseFreq62500Hz TCCR1B = (1<<WGM12) | (1<<CS12)  // Prescaler 256
8
#define baseFreq15625Hz TCCR1B = (1<<WGM12) | (1<<CS12) | (1<<CS10)  // Prescaler 1024
9
10
#include <avr/io.h>
11
12
void init() {
13
  DDRB = 0xFF;
14
  PORTB = (1<<PB1);
15
16
  cli();
17
  OCR1A = 0;
18
  baseFreq16MHz;
19
  TIMSK |= (1<<OCIE1A);
20
  sei();
21
}
22
int main(void)
23
{
24
  init();
25
  while(1)
26
  {
27
    //leer
28
  }
29
}
30
31
ISR(TIMER1_COMPA_vect) {
32
  PORTB^=(1<<PB1);
33
}

von Karl H. (kbuchegg)


Lesenswert?

Adrian Figueroa schrieb:

> ISR(TIMER1_COMPA_vect) {
>   PORTB^=(1<<PB1);
> }

Irgendwann ist eine Grenze erreicht, an der der Aufruf einer ISR, das 
Sichern der Register, das Umschalten des Portpins und der Retun zur 
aufrufenden Stelle die zeitbeherrschenden Dinge sind. Schneller geht 
nicht, weil diese Dinge eben Zeit brauchen. Das alles geschieht ja nicht 
in 0-Zeit. Dafür braucht es ein paar Takte und die sind es eben, die 
dich dann limitieren.

von Schorsch (Gast)


Lesenswert?

Hallo,

1. solche #define's machen mich nervös, bin mir nicht sicher, ob das so 
funktioniert, hab ich so noch nicht gesehen
2. Schau Dir doch mit deinem Scope mal SCK an, ohne irgendwas in der 
ISR-Schleife zu haben.
3. OCR1A = 0 macht keinen Sinn, hier mußt Du den Vergleichswert 
eintragen
4. Erfahrungsgemäß macht es weniger Schwierigkeiten den Timer mit TIMSK 
zu schalten, als mit sei()

Gruß Schorsch

von Karl H. (kbuchegg)


Lesenswert?

Schorsch.

Bist du sicher, dass du weißt, wovon du sprichst?

von Spess53 (Gast)


Lesenswert?

Hi

>ich möchte testweise ein 16Mhz Signal an einem triggernden Ausgangspin
>eines Atmega8 haben (bestückt mit 16Mhz Quartz, Fuses FF(low) D9(high)).

Dir fehlen die absoluten Basics.

MfG Spess

von Joe (Gast)


Lesenswert?

16MHz Ausgang , 40MHz beim Atmega8

Nur ? ? ?

von Walter S. (avatar)


Lesenswert?

Karlheinz hats ja schon geschrieben,
per Software gehts halt nicht so schnell.
Du könntest aber mit dem Timer eine Frequenz an einem Ausgang erzeugen, 
da kommst du etwas höher,
und noch höher wenn du einen AVR mit PLL nimmst

von A. F. (elagil)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Irgendwann ist eine Grenze erreicht, an der der Aufruf einer ISR, das
> Sichern der Register, das Umschalten des Portpins und der Retun zur
> aufrufenden Stelle die zeitbeherrschenden Dinge sind. Schneller geht
> nicht, weil diese Dinge eben Zeit brauchen.

Alles klar, die "verbrauchten" Takte habe ich einfach ignoriert :). Das 
ganze braucht wohl acht Takte, wenn ich auf 2Mhz komme.

> 16MHz Ausgang , 40MHz beim Atmega8

40Mhz schafft mein Oszilloskop, ich meinte nur, dass ich weiß, dass ich 
damit keine 16Mhz mehr als Rechteck anzeigen kann.

Walter S. schrieb:
> Du könntest aber mit dem Timer eine Frequenz an einem Ausgang erzeugen,
> da kommst du etwas höher,
> und noch höher wenn du einen AVR mit PLL nimmst

ok! an sich brauche ich die frequenzen nicht, ich wollte nur schauen was 
möglich ist

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.