Hi,
ich brauche bei meiner Mikrocontrolleranwendung eine höhere
Geschwindigkeit. als sie der jetzige Controller liefern kann.
Funktioniert ein Programm das für den Atmega 32L geschrieben ist auch
für den Atmega 644-20 PU? Die Pinbelegung scheint ja die selbe zu sein.
Gibt es bestimmte Befehle die von dem 644er nicht erkannt werden? Mich
irritiert das der 644 billiger(6€ statt 8€) ist als der 32L obwohl er in
jedem Aspekt besser zu sein scheint. Was ist da also der Haken?
Danke schonmal
Zeig doch mal ein bischen was.
Wenn dein Mega32 mit 16Mhz das Programm nicht in der Zeit stemmt, stehen
die Chancen gut, dass es ein 644 mit 20Mhz auch nicht schaffen wird.
Ehe man da jetzt den Teufel mit dem Belzebub austreibt sollte man doch
erst mal nachsehen, ob man nicht am bestehenden System etwas drehen
kann, so dass man wieder mit genügend Zeitreserve arbeiten kann.
Karl heinz Buchegger schrieb:> Ehe man da jetzt den Teufel mit dem Belzebub austreibt sollte man doch> erst mal nachsehen, ob man nicht am bestehenden System etwas drehen> kann, so dass man wieder mit genügend Zeitreserve arbeiten kann.
Sehe ich im Prinzip auch so, aber 25% mehr Rechenleistung sind auch
nicht ohne und könnten das Problem mühelos entschärfen.
Spotti schrieb:> Sehe ich im Prinzip auch so, aber 25% mehr Rechenleistung sind auch> nicht ohne und könnten das Problem mühelos entschärfen.
Meine Erfahrung ist genau entgegengesetzt.
Wenn der Programmablauf ungünstig geplant ist, reißen selbst 100% mehr
CPU-Takt absolut garnichts raus.
Du mußt den Flaschenhals suchen und entschärfen.
Beliebte Fallgruben sind:
- große Delays (>100µs)
- Routinen unnötig oft ausführen.
Peter
Und die Register heißen anders. Zumindest ist ein 32-Programm nicht ohne
weiteres für 644 Compilierbar. Ob die Registeradressen sich von einander
unterscheiden, kann ich allerdings nicht sagen!
Des weiteren hast du jetzt deine kompletten Timings für 16Mhz ausgelegt,
dassmüsstest du alles ändern!
Moin,
danke schonmal für die schnellen Antworten. Also viel zu optimieren gibt
es da nicht. Ich muss gelegentlich ein paar Knöpfe abfragen. Diese sind
Hardwareseitig entprellt, womit sich die Abfrage auf ein simples
auslesen des Registers beschränkt. Insofern einer der 6-Knöpfe gedrückt
wurde wird der jeweilige Knopf in eine Variable geschrieben, die dann
den Programmablauf ändert. Weiterhin zählt ein counter mit, damit ein
gedrückter Knopf nur ca. alle 500ms um eine Einheit hochzählt.
Das ganze dauert 3µs(Oszimessung) also ca. 24 Prozessorschritte (Der
32L läuft mit 8Mhz)
Weiterhin läuft der Timer0 im CTC-Modus der bei compare-match einen
16-Bit counter hochzählt. Wenn ich nun den Prescaler nicht zumindest auf
64 Stelle, pfuscht mir der Interrupt vom Timer dazwischen wenn OCR0 auf
niedrigen Werten steht (Was von extern vorgegeben wird, nicht
änderbar).
Das Polling der Knöpfe in 8 Prozessorschritten unterzubringen kann ich
mir nicht vorstellen.
Somit ergibt sich für die maximale Frequenz vom Timer0 62500Hz. Ich
brauche aber 150kHz. Ein Atmega 32 käme auf 125kHz, ein 20Mhz-Prozessor
auf 156 kHz.
In diesem fall würde der schnellere Prozessor also astrein mein Problem
lösen. Wenn ich ein paar Register umbennennen muss ist das ja kein Akt,
aber wenn jede einzelne Funktion ändern muss wärs doch unschön.
Fabian schrieb:> Das Polling der Knöpfe in 8 Prozessorschritten unterzubringen kann ich> mir nicht vorstellen.
versteht ich nicht, es sind doch nur Taster, das reicht wenn man sie 10
mal in der Sekunde Abfragt. Warum sollte man es in 8 schritten machen?
Peter schrieb:> Fabian schrieb:>> Das Polling der Knöpfe in 8 Prozessorschritten unterzubringen kann ich>> mir nicht vorstellen.> versteht ich nicht, es sind doch nur Taster, das reicht wenn man sie 10> mal in der Sekunde Abfragt. Warum sollte man es in 8 schritten machen?
Ich vermute mal, dass es sich nicht um Knpöfe im egtl. Sinn handelt,
richtig? Denn es muss dem TO ja selbst bewusst sein, dass kein Mensch
Knöpfe/Taster mit 150kHz betätigen kann.
Doch, sie sind ja Hardware-Entprellt. Und das dauert ein paar
Millisekunden bei JEDEM "Knopf".
Die anderen Aufgaben hören sich simpel an.
Sieht so aus, wie Entprellroutine im Interrupt.
Ohne Code vom Threadstarter wird da nix.
Blackbird.
Fabian schrieb:> Somit ergibt sich für die maximale Frequenz vom Timer0 62500Hz. Ich> brauche aber 150kHz. Ein Atmega 32 käme auf 125kHz, ein 20Mhz-Prozessor> auf 156 kHz.
Bei 5V und Zimmertempeartur sollte auch die meisten ATMEGA32L mit 20MHz
laufen können. Dann kann man ja schon einmal schauen, ob das die
Probleme löst oder nicht. Atmel hat (damals) gar nicht unterschiedliche
Mikrocontroller gefertigt, nur je nachdem eher auf niedrige Spannung
oder hohe Frequenz geprüft. Ein ATMEGA32 und ein ATMEGA32L kommen also
unter Umständen von demselben Wafer. Und 25% Overclocking sind bei
Zimmertemperatur normalerweise auch kein Problem.
Andererseits wäre für eine ATMEGA644 bei 3,3V lt. Datenblatt genau
genommen auch schon bei 12MHz Schluss.
Gruß, DetlevT
Fabian schrieb:> Ich muss gelegentlich ein paar Knöpfe abfragen. Diese sind> Hardwareseitig entprellt, womit sich die Abfrage auf ein simples> auslesen des Registers beschränkt.
Da es gelegentlich ist, spart die HW-Entprellung nur <0,1% CPU-Last ein,
also eigentlich 0,nix.
Fabian schrieb:> Das Polling der Knöpfe in 8 Prozessorschritten unterzubringen kann ich> mir nicht vorstellen.
Wozu?
Die Tastenabfrage macht man natürlich in der Mainloop.
Dann hast Du alle Zeit der Welt dafür und der Interrupt wird nicht
gestört.
Fabian schrieb:> Somit ergibt sich für die maximale Frequenz vom Timer0 62500Hz. Ich> brauche aber 150kHz.
Von Deiner Beschreibung kriegt man ja Knoten im Kopf.
Beschreib besser mal die Funktion.
Was soll denn mit den 150kHz geschehen?
150kHz bei 15MHz sind 100 Zyklen, da kann man schon einiges im Interrupt
machen.
Peter
Wiso du hast doch eine Antwort bekommen:
Christian L. schrieb:> Und die Register heißen anders. Zumindest ist ein 32-Programm nicht ohne> weiteres für 644 Compilierbar. Ob die Registeradressen sich von einander> unterscheiden, kann ich allerdings nicht sagen!> Des weiteren hast du jetzt deine kompletten Timings für 16Mhz ausgelegt,> dassmüsstest du alles ändern!