www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pulsbreite mesen Atmega8


Autor: S. F. (skip2myphips)
Datum:
Angehängte Dateien:

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

Autor: Oliver (Gast)
Datum:

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

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

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

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

Bewertung
0 lesenswert
nicht lesenswert
    if (Update)
      {
      Erg = (Overflow * 65536) + EndTime;
      itoa(Erg, Wert, 8);  
      uart_puts(Wert); 
      uart_puts(" = Time\r\n");
      TCNT1=0;
      Update = FALSE;
      }

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.

Autor: S. F. (Gast)
Datum:

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

Autor: STK500-Besitzer (Gast)
Datum:

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

Autor: Johannes M. (johannesm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich bin selbst noch am C lernen und schaue mir gern an wie andere ihre 
Programme schreiben. Eine Frage zu:
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?

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

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

Autor: Tom M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
if (Update == 1) { ... }

HTH. :)

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bitte wenn schon, dann

if(Update != 0)
...

da der wahr in C alles ungleich 0 sein kann!

Autor: Tom M. (Gast)
Datum:

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

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.