Forum: Mikrocontroller und Digitale Elektronik Interruptrate ATMega32 (16Mhz)


von Merlin (Gast)


Lesenswert?

Hi
Ich brauche für ein Messgerät eine schnelle Erfassung von TTL-Pegeln.
Leider finde ich nirgends die Information wie lange ein ATMega für das 
Erfassen und verarbeiten (Sprung in die Int-Routine) eines Interrupts 
brauch.
Das heißt wie oft ein Pegelwechsel pro Sekunde am Int-Pin passieren kann 
ohne das der µC Signale nicht erfasst(verpasst).
In der Int-Routine steht nur ein einfacher (1 Tacktzeit) Befehl.
Danke für jede Hilfe und viele Grüße!!
Merlin

von spess53 (Gast)


Lesenswert?

Hi

>Leider finde ich nirgends die Information wie lange ein ATMega für das
>Erfassen und verarbeiten (Sprung in die Int-Routine) eines Interrupts
>brauch.

Suchwort: ' Interrupt Response Time'. Bei mir S.15.

MfG Spess

von Hannes L. (hannes)


Lesenswert?

Dann such' mal im Datenblatt nach "response", da müsstest Du fündig 
werden. Dazu kommt dann der Sprung über den Vektor und der Rücksprung 
per Reti mit zusammen weiteren 7 Takten. Und dann noch die in der ISR 
anfallende Arbeit.

...

von holger (Gast)


Lesenswert?

>Ich brauche für ein Messgerät eine schnelle Erfassung von TTL-Pegeln.
>Leider finde ich nirgends die Information wie lange ein ATMega für das
>Erfassen und verarbeiten (Sprung in die Int-Routine) eines Interrupts
>brauch.

Wie schnell muss das denn sein?
Möglicherweise könnte man dir ganz schnell sagen
das es nicht funktionieren wird.

von spess53 (Gast)


Lesenswert?

Hi

>In der Int-Routine steht nur ein einfacher (1 Tacktzeit) Befehl.

Kann nicht sein. Ein 'reti' hat schon vier Takte.

MfG Spess

von doc (Gast)


Lesenswert?

Da da nur ein Befehl stehen soll, willst du bestimmt was zählen.
Nur, dafür brauchst du erstmal garkeinen Interrupt ;-)

von Merlin (Gast)


Lesenswert?

Danke für die schnellen Antworten und die Hilfe!
In der Routine wird nur eine Variable erhöt (um 1).
Das würde aber bedeuten das wenn ich eine Schleife benutze die
weniger als 11 Taktzyklen brauch ,(2 If-Abfragen gegebenfalls 
Variable+1) würde ich besser da stehen...
Das ganze soll Daten aus einem Komparator erfassen...und das möglichst 
schnell!
Ich weiß aufjedenfall das Bascom >50 Taktzyklen braucht weil es noch 
diverse Register sichert.
Wie könnte ich das am schnellsten realisieren?
Ist die Schleife eine Möglichkeit oder braucht Bascom/C auch so lange 
wegen den If-Abfragen?
Ich hatte bis jetzt nie das Problem das Befehle besonders schnell 
ausgeführt werden müssen.
Vielen Dank für die Hilfe!

von holger (Gast)


Lesenswert?

>Das ganze soll Daten aus einem Komparator erfassen...und das möglichst
>schnell!

Wie schnell?

von spess53 (Gast)


Lesenswert?

Hi

>Ich hatte bis jetzt nie das Problem das Befehle besonders schnell
>ausgeführt werden müssen.

Dann ist halt Assembler angesagt.

MfG Spess

von holger (Gast)


Lesenswert?

>Dann ist halt Assembler angesagt.

Buhaha!

von spess53 (Gast)


Lesenswert?

Hi

>Buhaha!

Danke für die Zustimmung.

MfG Spess

von doc (Gast)


Lesenswert?

Übrigens kann einer der Zähler kann auch direkt mit einem PIN verbunden 
werden.
Dann ist dafür kein Interrupt notwendig.

Siehe Datenblatt: External Clock Source

von doc (Gast)


Lesenswert?

...und ist verdammt schnell ;-)

von Hannes L. (hannes)


Lesenswert?

Bascom und schnell sind zwei Worte, die nicht zusammenpassen.

...

von Falk B. (falk)


Lesenswert?

@  Merlin (Gast)

>Das ganze soll Daten aus einem Komparator erfassen...und das möglichst
>schnell!

Netiquette!!!

Red nicht um den heissen Brei run, sag mal KONKRET was du machen willst! 
Und nenn ein paar ZAHLEN!

MFG
Falk

von STK500-Besitzer (Gast)


Lesenswert?

>Bascom und schnell sind zwei Worte, die nicht zusammenpassen.

Wieso?
Mit Bascom ist der Arbeitsspeicher schnell voll...
Passt doch...

von screwdriver (Gast)


Lesenswert?

>Bascom und schnell sind zwei Worte, die nicht zusammenpassen.

Falls in der ISR lediglich eine Bytevariable inkrementiert werden soll 
generiert BASCOM aus der Codezeile
   Count = Count + 1
folgenden Code:

13:          Count = Count + 1                    Count ist Bytevariable
+0000004F:   E6A0        LDI     R26,0x60         Load immediate
+00000050:   E0B0        LDI     R27,0x00         Load immediate
13:          Count = Count + 1
+00000051:   918C        LD      R24,X            Load indirect
+00000052:   5F8F        SUBI    R24,0xFF         Subtract immediate
13:          Count = Count + 1
+00000053:   938C        ST      X,R24            Store indirect

Macht das GCC mit einer Volatile-Variablen wirklich kürzer?

Okay, um die BASCOM-typische Push/Pop-Orgie zu vermeiden, sollte man 
sich um die Register, die in der ISR benutzt werden, dann doch selbst 
kümmern.

screwdriver

von Hannes L. (hannes)


Lesenswert?

> Okay, um die BASCOM-typische Push/Pop-Orgie zu vermeiden, sollte man
> sich um die Register, die in der ISR benutzt werden, dann doch selbst
> kümmern.

Da liegt der Hase im Pfeffer. Die meisten Bascom-User benutzen ja Bascom 
deshalb, damit sie auch ohne das dazu erforderliche Wissen Erfolge 
erziehlen können. Denn wenn man dieses Wissen hat, dann braucht es kein 
Bascom mehr, dann geht es auch in ASM.

...

von Falk B. (falk)


Lesenswert?

@  Hannes Lux (hannes)

>> Okay, um die BASCOM-typische Push/Pop-Orgie zu vermeiden, sollte man
>> sich um die Register, die in der ISR benutzt werden, dann doch selbst
>> kümmern.

Ein HALBWEGS gescheiter Compiler kann das auch.

>Da liegt der Hase im Pfeffer. Die meisten Bascom-User benutzen ja Bascom
>deshalb, damit sie auch ohne das dazu erforderliche Wissen Erfolge
>erziehlen können.

Was am Anfang mehr als sinnvoll ist.

> Denn wenn man dieses Wissen hat, dann braucht es kein
>Bascom mehr, dann geht es auch in ASM.

Ach Hannes, du schon wieder mit deinem ASM-Fetisch.

"Wer nur ein Hammer hat, sieht überall nur Nägel."

MFG
Falk

von Merlin (Gast)


Lesenswert?

hmm @ Falk Brunner : Ich will ein Spektrometer bauen was über einen 
DA-Wandler einen Fenster-Diskriminator steuert und nach einer bestimmten 
Zeit ein neues Fenster einstellt.
In dieser Zeit (sie ist unkritisch und kann auch 100ms lang sein!) 
sollen unregelmäßige Impulse aus der Detektoreinheit 
(PMT+Plastikszintillator) die durch die Diskriminatorschaltung auf 
TTl-Level begracht worden sind gezählt werden.
Die Impulse können sehr schnell hintereinander auftreten , deswegen soll 
die Erfassung so schnell wie eben mit einem ATMega32 auf 16Mhz (20Mhz) 
möglich geschehen!

Die Idee mit der External Clock Source ist eigentlich ganz gut aber geht 
das den mit unregelmäßigen Impulsen(ich glaub nicht..)?

Ich habe mich eher mit Schaltungstechnik beschäftigt als mit dem 
Programmieren deswegen würde ich gerne in Bascom programmieren als in 
Assembler.
Auch weil ich so etwas wie ein Graphisches Menü auf einem G-LCD 
darstellen will !

Deswegen frag ich ja ob es einen Weg gibt schnelle Impulszählung zu 
realisieren...(Assembler einbinden v=v+1 dürfte nicht das Problem 
sein...aber Vergleiche hätte ich zum Beispiel keine Ahnung und müsste 
mich erst einlesen!)
Bascom oder C macht (solange man den Registerkram bei Bascom vermeidet) 
bei so einfachen Befehlen wie v=v+1 kaum einen Unterschied oder=?

Viele Grüße und Danke für die Hilfe!

von Michael (Gast)


Lesenswert?

Mit nur einer Zeile in der ISR kann man bis ~200 - 250 kHz messen (bei 
16 Mhz)... hab ich selbst ausprobiert. Programmierung in C

von Falk B. (falk)


Lesenswert?

@  Merlin (Gast)

>Die Impulse können sehr schnell hintereinander auftreten , deswegen soll
>die Erfassung so schnell wie eben mit einem ATMega32 auf 16Mhz (20Mhz)
>möglich geschehen!

Dafür nutzt man einen Timer im AVR, welcher extern getaktet wird.

>Die Idee mit der External Clock Source ist eigentlich ganz gut aber geht
>das den mit unregelmäßigen Impulsen(ich glaub nicht..)?

Doch. Die Pulse müssen mind. 2 CPU-Takte breit sein, also bei 20 MHz 
mind. 100ns.

>Programmieren deswegen würde ich gerne in Bascom programmieren als in
>Assembler.

Kann man machen, wenn man weiss was man tut (wie immer im Leben).

>Auch weil ich so etwas wie ein Graphisches Menü auf einem G-LCD
>darstellen will !

Das ist das kleinste Problem und eher Schnick Schnack.

>Deswegen frag ich ja ob es einen Weg gibt schnelle Impulszählung zu
>realisieren...

Siehe oben!

MFG
Falk

P S Und nochmal. ZAHLEN!!!! Wie breit sind deine Pulse minimal? Es sei 
denn, du willst Threads wie diesen wiederholen

Beitrag "Phasenverschiebung mit dem Oszi messen"

von Merlin (Gast)


Lesenswert?

Ok sry das ich die Daten erst jetzt gebe:

Rise time : 0,7-3 ns Fall time: 1 -10 ns FWHM(Puls-Weite): 1,3-5ns

Also viel zu kurz für die Timer-Methode! Aber die Pulse lassen sich ja 
Zeitlich auf min 100ns verlängern das ist kein Problem!
Danke für die Hilfe! Das hört sich echt klasse an(kannte ich nicht, aber 
wie gesagt µC bin ich noch nicht sehr routiniert)!
Bedeutet das ich kann eine externe Taktquelle(Quarz) benutzen 
(µC-Takt)und ein beliebigen Pin als Taktquelle für einen Timer benutzen?

Danke für die Hilfe!

von Merlin (Gast)


Lesenswert?

Sry das sind die Angaben der analogen Pulse die werden durch die 
Verarbeitung natürlich noch verkürzt auf etwa  5ns.

von Christopher G. (cbg)


Lesenswert?

Du willst mit einem µC, dessen Taktsignal eine Periodendauer von 50 ns 
hat, also Pulse messen, die 5 ns lang sind?

von Falk B. (falk)


Lesenswert?

@  Merlin (Gast)

>Sry das sind die Angaben der analogen Pulse die werden durch die
>Verarbeitung natürlich noch verkürzt auf etwa  5ns.

Und was bringt dich auf die wahnwitzige Idee, 5ns (NANOSEKUNDEN) breite 
Pulse mit einem 20 MHz AVR in SOFTWARE messen zu wollen?

Leute gibts . .  .

Willst du nicht gleich ein Space Shuttle aus nem 2er Golf bauen?

Die Pulsbreite muss man per Monoflop auf eben die genannten mind. 
100ns verlängern. Aber dann darf die Wiederholrate nicht unter 200ns, 
sprich 5 MHz liegen.

MFG
Falk

von Merlin (Gast)


Lesenswert?

Hab ich doch geschrieben :
Zitat:
"Also viel zu kurz für die Timer-Methode! Aber die Pulse lassen sich ja
Zeitlich auf min 100ns verlängern das ist kein Problem!"

Naja aber wie ist das den jetzt mit dem Timer...welchen Pin kann ich als 
Taktquelle nehmen?

von Merlin (Gast)


Lesenswert?

OK hat sich erledigt! Danke für die Hilfe ! Das was mir fehlte war die 
Counter Funktion von Timer!

...und ich werde natürlich kein! Monoflop benutzen sondern den ATMega 
auf -271 Grad kühlen und mit 400Mhz takten....;)

von doc (Gast)


Lesenswert?

troll.

von Jiro (Gast)


Lesenswert?

Man könnte auch erst auf einen Zähler ic gehen und diesen dann 
regelmäßig auslesen mit dem avr.

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.