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.
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
> 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.
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.
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.
>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...
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?
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 :-)
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. :)
bitte wenn schon, dann if(Update != 0) ... da der wahr in C alles ungleich 0 sein kann!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.