mikrocontroller.net

Forum: Compiler & IDEs problem mit atmega8 als Frequenzzähler


Autor: Nabil Mourad (tomas1982)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
ich versuche schon seit langem mittels Externe Interrupts(INT0 oder 
INT1) einen Frequenzzähler mit meinem ATmega hinzubekommen. Ich habe 
dazu einen definierten Rechteckimpuls von 50KHz bis 120KHz. Diesen 
möchte ich messen.Leider bekomme ich über die UART weniger vorkommenden 
Flankenanzahl die ausgegebene Frequenz, die ich erwarte.
Ich habe langsam keine Ahnung mehr was ich machen soll. Vielleicht könnt 
ihr mir helfen und mir einen Tipp geben,
wo das Problem liegen könnte.
ich hatte diese Problem mit einem Timer und einem Counter glöst.Es gibt 
dafür einen reservierten Pin am Mikrocontroller mit der Bezeichnung 
T1,weil ich möchte Frequenzzähler für 3 Signalen gleichzeitig mit einem 
ATmega8 hinzubekommen.
geht das oder geht nicht.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne Deine Anforderungen zu kennen, kann man wenig sagen. Drei Signale 
50 - 120 kHz gleichzeitig mit einem ATmega8 ist sehr problematisch bis 
unmöglich.

Ideal wäre ein reziprokes Verfahren mit ICP als Meßeingang und einem 
vorgeschalteten Multiplexer.
Welche Auflösung brauchst Du und welche Meßgeschwindigkeit?
Was willst Du messen und wo sollen die Daten hin?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nabil Mourad schrieb:
> Ich habe langsam keine Ahnung mehr was ich machen soll.

Wir ja nichtmal, was Du bisher gemacht hast.


Nabil Mourad schrieb:
> Vielleicht könnt
> ihr mir helfen und mir einen Tipp geben

"Hilfe, aber ich zeig nix" klingt nach abstauben wollen.

16MHz / 120kHz sind 133 Zyklen, das ist knapp für 3 Interrupts.
Besser 2 über T0, T1 zählen und nur einen als Interrupt.
T2 als Zeitbasis.


Peter

Autor: Nabil Mourad (tomas1982)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ich habe folgenen C Code mit einen Atmega 8.
Mit dem angehängten Programm (ICP1 / PB0) möchte ich nun diese Pulsweite 
messen und im Endeffekt einen Abstand messen, es handelt sich nämlich um 
einen FGM 3h (Magnetfeldsensor).aber Leider bekomme ich über die UART 
nur die 0 Hz Werten .
Hat jemand eine Idee wie man das hinbekommen könnte.
Vielen Dank schon mal im voraus :)

Autor: Kakadu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh je. Erst Frequenz, dann Pulsweite.
Hast Du alle drei Signale an ICP1?

Autor: Nabil Mourad (tomas1982)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nochmal um mein Problem richtig zu erklären, ich habe ein Sensor FGM-3h, 
diese Sensor misst den Magnetfeld, und diese Magnetfeld wird 
Rechtecksignal (nur 1 Signal) zu meinem Mikrocontroller ATmega8 
gesendet.
ich möchte die Pulsbreite diese Signal messen, da benutzte ich den 
Eingang ICP1, diese messwerte werden in USART als ASCII gesendet.
mit Eingang T1(Timer/Counter )habe ich schon eine Lösung, aber jetzt 
brauche den zweite Lösung.

Autor: Nabil Mourad (tomas1982)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich wollte mit dem Timer_1 Pulsweiten oder Signalperioden messen. Es 
wird mit Hilfe der Input Capture Funktion (spezielles Register des 
Controllers), die Zeit zwischen zwei Flanken gemessen. Diese Funktion 
nutzt den Capture-Interrupt ( INT_TIM1CAPT). Der Puls wird zwischen
einer steigenden und der nächsten fallenden Signalflanke gemessen. Die 
Periode wird zwischen zwei steigenden Signalflanken gemessen. Durch die 
Input Capture Funktion gehen
Die Daten der ausgegebenen Frequenz werden in einem ARRAY gespeichert 
und über die serielle schnittstelle RS232 ALS ASCII-CODE Code 
übertragen.

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das funktioniert so nicht:
irgendwie muss gesichert werden dass flanke1 und flanke2 zusammengehören 
und auch dass sie sich während der Berechnung flanke2-flanke1 nicht 
ändern
es fehlt also ein flag und der Interrupt muss gesperrt werden

Autor: Nabil Mourad (tomas1982)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PORTB = 0b00111110;
    DDRB  = 0b00111110;  // Port B0 als Eingang (ICP)
    TCCR1A = 0;
    TIMSK  |= (1<<TICIE1);             // ICP enable
    TCCR1B |= (1<<CS10)|(1<<CS12)|(1<<ICES1);

while ((TIFR&(1<<ICF1)) == 0);
        Flanke1 = ICR1;
        TIFR = (1<<ICF1);
        TCCR1B = 0x05;
        Pulsdauer = ICR1-Flanke1;

so was meinst du ?
wenn was falch sag mir bitte bescheid!
Danke

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.