problem mit atmega8 als Frequenzzähler

OP #2022353
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.
Gast #2023154
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?
#2023337
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
OP #2023684
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 :)
Angehängte Dateien:
OP #2023763
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.
OP #2024029
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.
Gast #2024083
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
OP #2024124
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren