Timer Atmega644p

Gast #4141669
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
}
#4141673
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.
#4141760
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.
#4141794
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.
Gast #4142441
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

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.