Forum: Mikrocontroller und Digitale Elektronik Atmega32 Timer


von peter (Gast)


Lesenswert?

Hallo!
Leider stehe ich grade auf dem Schlach und hoffe ihr könnt mir helden.

Ich wollte eine Frequenz zwischen 1Khz und 10Khz auslesen.
Nach jedem Flankenwechsel(Low>High) soll ein Signal zeitversetzt 
(natürlich äquivalent zur Frequenz) am Ausgang ausgegeben werden.
Ab ca 2Khz soll sich die Zeitverzögerung zur Ausgabe verkürzen (zb statt 
"warte" 20ms nur noch 10ms).

Meine frage: ist dies überhaupt möglich mit dem Atmega32, und mit 
welcher Funktion realisiere ich das am besten?Timer?

Eine Frage hätte ich noch: wie lange dauert ein normaler Befehl im 
Controller (zb Portausgabe).

Programmiert wird in AVR mit C.

MFG

von Chris (Gast)


Lesenswert?

Na klar ist das möglich aber irgendwie fehlen die Grundlagen.

Mit den externen Ints und den Timern wäre ein Ansatz....

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

peter schrieb:
> Meine frage: ist dies überhaupt möglich mit dem Atmega32, und mit
> welcher Funktion realisiere ich das am besten?Timer?


 Warum soll das nicht möglich sein ?
 Ob du das Ganze auch us genau (und in richtiger Reihenfolge, LOL )
 wieder ausgeben kannst, ist eine andere Frage.

peter schrieb:
> Eine Frage hätte ich noch: wie lange dauert ein normaler Befehl im
> Controller (zb Portausgabe).

 Genau einen Takt.

: Bearbeitet durch User
von Amateur (Gast)


Lesenswert?

Viele Standartbefehle dauern 1 Takt.

Ob sich diese Geschwindigkeit allerdings in "C" erreichen lässt ist 
fraglich.

von Karl H. (kbuchegg)


Lesenswert?

Amateur schrieb:
> Viele Standartbefehle dauern 1 Takt.
>
> Ob sich diese Geschwindigkeit allerdings in "C" erreichen lässt ist
> fraglich.


Ein
1
    PORTB |= ( 1 << PC0 );

dauert auch nicht länger als ein
1
    SBI  PORTB, 0


vor allem deswegen, weil der gcc aus der C Form genau diese Anweisung 
erzeugt.

Immer dieses Märchen, dass C Code signifkant langsamer als Assembler 
wäre. In Ausnahmefällen mag das schon stimmen, aber in mehr als 90% 
aller Programme spielt der vom Compiler erzeugte etwas langsamere Code 
(der nicht mehr als ein paar Prozentpunkte im unteren einstelligen 
Prozentbereich langsamer ist) überhaupt keine Rolle. Wer Videosignale 
erzeugen muss, muss im Timer Interrupt auf jeden Taktzyklus achten - 
stimmt schon. Aber wieviele von uns machen so etwas?


PS: "Standart" versus "Standard"

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Amateur schrieb:
> Viele Standartbefehle dauern 1 Takt.

 Mit "t" hat es bestimmt länger gedauert, auch wenn die SS gut
 gedrillt war...

von Ingo (Gast)


Lesenswert?

Wobei ich mich immernoch frage warum
1
TCCR0A |= (1<<WGM01);          // CTC
2
      ba:  84 b5         in  r24, 0x24  ; 36
3
      bc:  82 60         ori  r24, 0x02  ; 2
4
      be:  84 bd         out  0x24, r24  ; 36
5
6
PORTA |= (1<<PA4);
7
      d4:  14 9a         sbi  0x02, 4  ; 2

unterschiedlich kompiliert werden.


Ingo

von Ingo (Gast)


Lesenswert?

Ok, sorry. Steht ja im DB das nur Register von 0x00 bis 0x1F direkt 
adressierbar sind :(

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Karl Heinz schrieb:
> Immer dieses Märchen, dass C Code signifkant langsamer als Assembler
> wäre. In Ausnahmefällen mag das schon stimmen, aber in mehr als 90%
> aller Programme spielt der vom Compiler erzeugte etwas langsamere Code
> (der nicht mehr als ein paar Prozentpunkte im unteren einstelligen
> Prozentbereich langsamer ist) überhaupt keine Rolle. Wer Videosignale

 Ich bin bestimmt kein C-Liebhaber, muss dem aber zustimmen.
 Paar Sachen bezüglich schnellem Zugrif, Manipulation etc. habe ich
 gerade aus disassemblierten Code gelernt.
 Und wer so auf Geschwindigkeit fixiert ist, benutzt Assembler oder
 schreibt sich die paar zeitkritischen Funktionen selbst.

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.