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


von Nabil M. (tomas1982)


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.

von Frank (Gast)


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?

von Peter D. (peda)


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

von Nabil M. (tomas1982)


Angehängte Dateien:

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 :)

von Kakadu (Gast)


Lesenswert?

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

von Nabil M. (tomas1982)


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.

von Nabil M. (tomas1982)


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.

von Walter (Gast)


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

von Nabil M. (tomas1982)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.