Moin,
ich brauche hilfe bei der auswertung meines Timers
Ich muss unterscheiden ob ein SIgnal zwischen 12K-13Khz, 13K-14Khz oder
zwischen 29K-30Khz liegt.
Es ist ein externer Quarz von 4 Mhz angeschlossen.
Ich würde wie folgt rechnen:
1/4Mhz = 0,25us pro Takt
30Khz = 33,33us
33,33us/0,25us = 133,32
aber wenn ich jetzt den Timer vergleiche mit größer,kleiner 130 -140
dann liegt es nicht in dem Bereich
Außerdem scheint mein Programm immer eine andere Frequenz zu messen,
obwohl die gleichbleibend ist
frankparker wrote:
> naja jetzt läuft das Programm ja soweit
Wenn deine Interrupt Routine bei konstanter Frequenz mit immer
unterschiedlichen Werten daherkommt, kann man wohl kaum von funktioniern
sprechen.
Wie sieht dein Programm jetzt eigentlich aus.
Das wird wohl nicht so gut kommen, wenn deine ISR den Inhalt der
temp/temp2 Register ohne sichern einfach so verändert. Diese Register
werden auch an anderen Stellen benutzt!
Was machst du da überhaupt?
Vereinfach das doch mal gründlich. Das ist doch viel zu kompliziert für
ein simples
differenz = neuer_wert - alter_wert
alter_wert = neuer_wert
Bei dir ist XH/XL die Differenz
ZH/ZL der neue Wert
YH/YL der alte Wert
(PS: Wenn du den Registern schon Namen gibst, was ja grundsätzlich
nicht schlecht ist, warum gibst du ihnen dann nicht Namen unter denen
man sich was vorstellen kann, wie zb AlterWert, Differenz, ... XH/XL
ist genauso nichtssagend wie es R18/R19 gewesen wäre)
Die temp/temp2 Register braucht in dieser ISR kein Mensch
Es ist völlig OK, wenn in deiner Hauptschleife die Differenz ständig
ausgegeben wird. Lass das XH/XL Register dort in Ruhe!
Du kriegst keinen Bonus dafür, wenn dein Prozessor in der Hauptschleife
sitzt und nur looped.
Und lass die Interrupts nur solange gesperrt, wie es unbedingt notwenig
ist. In dem Moment, in dem du die Differenz aus den XH/XL register
geholt hast, können die Interrupts wieder freigegeben werden! Du willst
ja, dass die Capture Einheit möglichst schnell wieder reagieren kann!
Sobald du den Differenz Wert hast, hast du alle Zeit der Welt für die
Ausgabe. Es gibt keinen Grund dafür die Interrupts zu sperren.
Vorausgesetzt natürlich, deine ISR kommt sich nicht registermässig mit
der Ausgaberoutine in die Haare. Aber die Lösung für dieses Problem kann
nicht lauten, dass man die Interrupts in der Zeit sperrt. Die Lösung
muss lauten, die Register entsprechend intelligent zu benutzen bzw. die
ISR darf keine Register verändern. Insbesondere das SREG Register wird
gerne vergessen!
nur mal so,
was steht denn in
.include "AVR.H" ?
ich denk mal den Befehlssatz zum assemblieren (SiSy)
Ich hab jetzt temp,temp2 in der ISR geändert.
Wie aber kommen die ständig wechselnden werte zustande (bei gleicher
Frequenz)?