Hallo Liebe µC Freunde, ich versuche über den ICP-pin die Zeitdifference zwischen zwei flanken zumessen. ich krieg ständig Werte zwischen -32000 und 32000 raus trotz mit der Allgemeinen formel Zeit = (überlauf * 65536)+ Ersteflanke - Zweiteflanke. Wieso zählt der Timer1 nicht von 0 bis 65536 ? hab ich irgenwas falsch eingestellt ?
Hallo Christian, >hab ich irgenwas falsch eingestellt ? Keine Ahnung, dazu müsstest du deinen Code zeigen. Bitte nicht nur einen Ausschnitt, sondern ein compilierbares Programm. Eine Vermutung: Du rechnest mit int-variablen. Int geht geht auf einem AVR von -2^15 bis (2^15)-1 was etwa -32768 bis 32768 ist. Grüße Andreas
Christian schrieb: > ich krieg ständig Werte zwischen -32000 und 32000 raus ... > Wieso zählt der Timer1 nicht von 0 bis 65536 ? Du solltest den Timer mal einfach unsigned ansehen...
Zunächst einmal danke für die schnelle antworten. Ich hab nun meinen Code eingefügt. Der Code ist noch in der Entwicklungsphase. Also meine Konkrete Problem ist das bei der Ausgabe von Zeit_ti (Zeitdifferenz von Sensor Impulse) auf dem LCD Display nur eine Zahl in Bereich -32768 bis 32768 angezeigt werden kann. Um fest zustellen dass der Problem nicht von der Formel beeinflusst wird habe ich auch versucht Direkt einen größeren Zahl (z.B. 6409372) mit variable Zeit_ti anzuzeigen, in diesem Fall wird der Ausgabewert auch in dem Bereich -32768 bis 32768 angezeigt. Meine Vermutung ist das Zeit_ti von der TCNT1 beeinflusst wird. P.S.: - Tools: STK500, LCD 16x1, Atmega16L - Einstellung: 4MHz, Vorteiler 64
Die Lösung wurde Dir schon gesagt. Definiere doch mal für Dich selbst den Unterschied und den Wertebereich von signed und unsigned 2Byte und 4Byte integer Variablen.
Lieber Gernverter, in der Deklaration habe ich die Variablen mit unsigned definiert.
Hmmmm.... Was wird da wohl passieren?
1 | volatile unsigned char Overflow = 0; |
2 | unsigned short Zeit_ti ; |
3 | :
|
4 | :
|
5 | Zeit_ti = (Overflow*65536) + Endtime - Starttime; |
> Meine Vermutung ist das Zeit_ti von der TCNT1 beeinflusst wird.
Ja, du selbst willst das ja irgendwie:
1 | ISR( TIMER1_OVF_vect ) |
2 | {
|
3 | Overflow++; |
4 | }
|
5 | :
|
6 | :
|
7 | Zeit_ti = (Overflow*65536) + Endtime - Starttime; |
Gut, dass du den Code gezeigt hast, andere stellen sich da schlimmer an... du verwendest in "Messwerte_ausgeben" itoa, dabei werden deine unsigned variablen automatisch zu signed int gecastet. der compiler sollte dabei warnen. probiers mit utoa, dann klappts auch mit werten größer als 2^15-1. BTW: Man ist gut beraten, wenn man die datentypen aus stdint.h nimmt, dann ist man immer sicher, weches vorzeichen/bitbreite man wirklich bekommt, denn ich bin mir sicher, dass du nicht wusstest, dass unsigned short auf dem AVR genauso 16 bit hat wie unsigned int...
danke Andreas funzt wunderbar:-) jetzt zeigt er ein Bereich von 0 - 65535, gibt es eine möglichkeit eine achtstellige zahl anzeigen zulassen ?
Christian schrieb: > gibt es eine möglichkeit eine > achtstellige zahl anzeigen zulassen ? Ja. Eine 8-Stellige Zahl passt in einen 32-Bit Integer-Datentypen (uint32_t) und der wird von utoa gerade noch akzeptiert.
so da bin ich wieder!! jetzt hab ich nicht alle 65535 ein überlauf sondern bei jeden 2100 schritt. wie geht den das ??
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.