mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frequenz/timer auswertung atmega8 und ICP


Autor: frankparker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach doch dort weiter, wo Du angefangen hast.

Beitrag "frequenzmessung atmega8 mit icp"

Autor: frankparker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja jetzt läuft das Programm ja soweit - ich kapier nur die auswertung 
nicht bisher.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: frankparker (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
oh, das wollte ich eigentlich angehängt haben ;)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
;---------------------------------------------------------------------------
onTC1:    ;push  temp
      ;push  temp2
      
      in  temp,ICR1L
      in  temp2,ICR1H
      
      mov  ZL,temp    ;ZL mit temp(ICR1L) laden
      mov  ZH,temp2  ;ZH mit temp2(ICR1H) laden
      sub temp,YL    ;temp(ICR1L) minus YL(zuerst 0 dann letzter Messwert)
      sbc  temp2,YH  ;temp2(ICR1H) minus YH(zuerst 0 dann letzter Messwert)
      
      mov YL,ZL    ;YL mit ZL(temp(ICR1L)) laden
        mov YH,ZH    ;YH mit ZH(temp2(ICR1H)) laden
        

        
        mov  XL,temp
        mov  XH,temp2
      
      ;pop temp
      ;pop temp2 
        reti
;---------------------------------------------------------------------------

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nur mal so,
was steht denn in

.include "AVR.H" ?

Autor: frankparker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.