Forum: Mikrocontroller und Digitale Elektronik Pulsbreite mesen Atmega8


von S. F. (skip2myphips)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
ich habe folgendes Problem: Ich will die Pulsbreite von einem Siganl 
messen und die gemessene Breite über UART ausgeben. Grundsätzlich liegt 
immer High Pegel am INT1. Alle 75ms kommt zweimal hintereinander für 
800us ein Low Pegel. Ich kriege einfach nich das gewünschte Ergebnis 
ausgeliefert. Kann mir jemand einen Hinweis geben. Ich benutze einen 
Atmega8 bei 4Mhz.

von Oliver (Gast)


Lesenswert?

Unabhängig davon, daß man so eine Aufgabenstellung wunderbar mit Input 
Capture lösen kann, erklär doch mal, was diese Zeilen deiner Meinung 
nach machen soll, und was sie tatsächlich machen:

>volatile unsigned char Overflow = 0;
>int erg = 0;
...
>Erg = (Overflow * 65536) + EndTime;

Oliver

von Karl H. (kbuchegg)


Lesenswert?

>       itoa(Erg, Wert, 8);

Echt?
Du willst das Ergebnis im Oktalsystem sehen.
Das verblüfft mich jetzt weniger, dass du da deine Zeiten nicht wieder 
erkennst.

-> Doku lesen.
Wenn du bei einer Funktion nicht sicher bist, was die Argumente 
bedeuten, dann google danach. Wenn du eine Funktion das erste mal 
einsetzt, dann google nach der Funktion und sieh dir an wie man sie 
benutzt.

von Karl H. (kbuchegg)


Lesenswert?

1
    if (Update)
2
      {
3
      Erg = (Overflow * 65536) + EndTime;
4
      itoa(Erg, Wert, 8);  
5
      uart_puts(Wert); 
6
      uart_puts(" = Time\r\n");
7
      TCNT1=0;
8
      Update = FALSE;
9
      }

du versuchst von einer steigenden Flanke zur nächsten zu messen.
Was denkst du? Wieviel Zeit vergeht wohl, wenn der µC das Ergebnis 
ausrechnet, den itoa anwendet und den String dann auch noch per USART 
verschickt. Und erst dann, wenn das alles erledigt ist, beginnt deine 
Stoppuhr erneut zu laufen.

Das ist ungefähr so, wie wenn die Mercedes Boxencrew nach Schumis 
durchfahrt über die Startlinie erst mal auf einen Kaffee geht um dann 
NACH der Kaffepause irgendwann die Stoppuhr loslaufen lässt um sich bei 
der nächsten Überquerung der Startlinie über Schumis Bestzeit zu freuen.

-> sie haben einen völlig sinnfreien Wert gemessen.
Genauso wie du.

von S. F. (Gast)


Lesenswert?

Oliver schrieb:
> Unabhängig davon, daß man so eine Aufgabenstellung wunderbar mit Input
> Capture lösen kann, erklär doch mal, was diese Zeilen deiner Meinung
> nach machen soll, und was sie tatsächlich machen:
>
>>volatile unsigned char Overflow = 0;
>>int erg = 0;
> ...
>>Erg = (Overflow * 65536) + EndTime;

Ok, das Overflow als char falsch ist, seh ich ein. Hatte jetzt aber auch 
keinen Einfluss, da der Zähler bisher nicht überläuft. Das mein Signal 
nicht am ICP hängt hat seinen Grund, da ich beim ICP immer nur auf 
fallender ODER steigender Flanke triggern kann. Beim INT1/0 kann ich auf 
jeden Flanken wechsel triggern.

Karl heinz Buchegger schrieb:
> du versuchst von einer steigenden Flanke zur nächsten zu messen.
> Was denkst du? Wieviel Zeit vergeht wohl, wenn der µC das Ergebnis
> ausrechnet, den itoa anwendet und den String dann auch noch per USART
> verschickt. Und erst dann, wenn das alles erledigt ist, beginnt deine
> Stoppuhr erneut zu laufen.

Ist schon klar, dass eventuell der Controller zu langsam ist bzw. die 
Signal zu schnell kommen. Aber dafür hab ich mein Update. Update=False: 
Neue Zeit kann geholt werden. Update=True: Es kann konvertiert und auf 
UART geschrieben werden.

von STK500-Besitzer (Gast)


Lesenswert?

>Das mein Signal nicht am ICP hängt hat seinen Grund, da ich beim ICP immer >nur 
auf fallender ODER steigender Flanke triggern kann. Beim INT1/0 kann >ich auf 
jeden Flanken wechsel triggern.
ICP ist trotzdem besser...

von Johannes M. (johannesm)


Lesenswert?

ich bin selbst noch am C lernen und schaue mir gern an wie andere ihre 
Programme schreiben. Eine Frage zu:
1
if (Update)

was passiert da? In den C Büchern in denen ich nachgesehen habe, konnte 
ich da nichts finden. Dafür müsste man sich doch erstmal richtige 
booleans bauen, oder?

von Karl H. (kbuchegg)


Lesenswert?

S. F. schrieb:
>
>> du versuchst von einer steigenden Flanke zur nächsten zu messen.
>> Was denkst du? Wieviel Zeit vergeht wohl, wenn der µC das Ergebnis
>> ausrechnet, den itoa anwendet und den String dann auch noch per USART
>> verschickt. Und erst dann, wenn das alles erledigt ist, beginnt deine
>> Stoppuhr erneut zu laufen.
>
> Ist schon klar, dass eventuell der Controller zu langsam ist bzw. die
> Signal zu schnell kommen. Aber dafür hab ich mein Update.


Das ändert aber nichts daran, dass du nicht weißt, wann genau innerhalb 
einer Signalperiode du die Uhr startest :-)

von Tom M. (Gast)


Lesenswert?

Johannes M. schrieb:
> if (Update)

Die Bedingung mit if erwartet eine logischen Wahrheitswert in den 
Klammern. "Update" ist eine Variable, die wird hier als "boolsch" 
interpretiert.

Anders gesagt, das Konstrukt nur eine Kurzform für
1
if (Update == 1) { ... }

HTH. :)

von Flo (Gast)


Lesenswert?

bitte wenn schon, dann

if(Update != 0)
...

da der wahr in C alles ungleich 0 sein kann!

von Tom M. (Gast)


Lesenswert?

Was ich eben schrieb ist nicht ganz korrekt, schliesslich werden auch 
grössere Zahlen als 1 als "true" interpretiert... 0 == false, alles 
andere evaluiert nach true. Ich vermute, das auch für negative Zahlen 
(also true).

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.