Forum: Mikrocontroller und Digitale Elektronik Timer Atmega644p


von Alex (Gast)


Lesenswert?

Hallo zusammen,

ich habe mir ein kleines Programm gebastelt mit welchem ich die
Timer bei Atmega 644p prüfen kann.Ich komme nicht auf 1µs(1000000Hz).Ich 
kriege höhstens 5µs.

hier der Code, hoffe mir kann jemand helfen:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/delay.h>
4
int zaeler;
5
int takt=6;
6
#define F_CPU 20000000UL;
7
int main(void)
8
{
9
  DDRD|=0xFF;
10
  // Timer 0 konfigurieren
11
  TCCR0A = (1<<WGM01); // CTC Modus
12
  TCCR0B |= (1<<CS00); // Prescaler 1
13
  // ((20000000/1)/1000000) = 2
14
  OCR0A = 2-1;
15
 
16
  // Compare Interrupt erlauben
17
  TIMSK0 |= (1<<OCIE0A);
18
 
19
  // Global Interrupts aktivieren
20
  sei();
21
 
22
  while(1)
23
  {
24
    
25
  }
26
}
27
 
28
29
ISR (TIMER0_COMPA_vect)
30
{
31
  PORTD ^=0xFF;
32
  
33
  
34
}

von Karl H. (kbuchegg)


Lesenswert?

Alex schrieb:

>   OCR0A = 2-1;
>
>   // Compare Interrupt erlauben
>   TIMSK0 |= (1<<OCIE0A);

Dein Timer kann zwar alle 2 Takte einen Interrupt generieren.
Aber die ISR

> ISR (TIMER0_COMPA_vect)
> {
>   PORTD ^=0xFF;
> }

kommt dann nicht mehr nach.
Bei einem Interrupt muss ein Einsprung in die ISR gemacht werden (kostet 
Zeit), Register gesichert werden (kostet Zeit), dann die eigentliche 
Instruktion in der ISR (kostet Zeit), die gesicherten Register 
wiederhergestellt werden (kostet Zeit) und ein Rücksprung aus der ISR 
gemacht werden (kostet Zeit).

Das ist wie wenn dir dein Chef alle 10 Sekunden eine Akte zur 
Bearbeitung auf den Tisch legt. Wenn du minimum 2 Minten zur Bearbeitung 
der Akte benötigst, dann kommst du nicht mehr hinterher. Es wird dann 
alle 2 Minuten eine Akte fertig und nicht alle 10 Sekunden.


* 'kostet Zeit' ist gleichzusetzen mit: dafür muss der µC ein paar Takte 
aufwenden.

von S. Landolt (Gast)


Lesenswert?

> Ich kriege höhstens 5µs.
> #define F_CPU 20000000UL;

Aber 100 Takte ist schon heftig.


>  // ((20000000/1)/1000000) = 2

?

von Fairfuser (Gast)


Lesenswert?

S. Landolt schrieb:
> ?

Irgendwas falsch gemacht.

- Compiler Optimierung nicht eingeschaltet?
- Controller läuft nicht mit 20 MHz sondern mit viel weniger?
- ClockDiv8 Fuse gesetzt?

von Thomas E. (thomase)


Lesenswert?

1
#define F_CPU 20000000UL;
2
#include <avr/io.h>
3
4
int main(void)
5
{
6
  DDRB |= (1 << 3);
7
  // Timer 0 konfigurieren
8
  TCCR0A = (1<<WGM01) | (1 << COM0A0); // CTC Modus
9
  TCCR0B |= (1<<CS00); // Prescaler 1
10
  OCR0A = 9;
11
12
  while(1)
13
  {
14
    
15
  }
16
}


Damit erhälst du 1MHz an PB3 (f = F_CPU / (OCR0A + 1) / 2).

Wenn nicht, ist dein Controller falsch konfiguriert.

mfg.

von Alex (Gast)


Lesenswert?

Danke.
Ich habe so verstanden das unrealistisch ist 1µs zu bekommen! Ich habe 
fr.1000000 halbiert und trotzdem 5µs.

von Thomas E. (thomase)


Lesenswert?

Alex schrieb:
> Danke.
> Ich habe so verstanden das unrealistisch ist 1µs zu bekommen! Ich habe
> fr.1000000 halbiert und trotzdem 5µs.

Die höchste Frequenz, die man mit dem Timer erzeugen kann, ist F_CPU / 
2, also OCR0A = 0. Das wird nur in Hardware gemacht und hat mit 
Programmausführungszeiten nichts zu tun. Mit Software geht das nicht. 
Aber dafür hat man ja einen Timer.

mfg.

von Alex (Gast)


Lesenswert?

Danke ich habs.
 ClockDiv8 Fuse war gesetzt
Ich hab noch eine frage:Wie kann man Timer stopen und wieder laufen 
lassen?
(Globale Intrrupt sei()einschalten und ausschalten...)

von spess53 (Gast)


Lesenswert?

HI

>Ich hab noch eine frage:Wie kann man Timer stopen und wieder laufen
>lassen?
>(Globale Intrrupt sei()einschalten und ausschalten...)

Datenblatt unleserlich?

Table 14-6. Clock Select Bit Description

CSn2 CSn1 CSn0      Description
  0    0   0        No clock source (Timer/Counter stopped).
....

MfG Spess

von Fairfuser (Gast)


Lesenswert?

Alex schrieb:
> Danke ich habs.
>  ClockDiv8 Fuse war gesetzt

Danke. Bin ich nicht ein toller (Verfuser) Hellseher?

von Thomas E. (thomase)


Lesenswert?

Fairfuser schrieb:
> Bin ich nicht ein toller (Verfuser) Hellseher?

Ein Vorbild für uns alle!

mfg.

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.