Forum: Mikrocontroller und Digitale Elektronik Wie zählt der TCNT1 nicht von 0 - 65535


von Christian (Gast)


Lesenswert?

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 ?

von Andreas R. (rebirama)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...

von Christian (Gast)


Angehängte Dateien:

Lesenswert?

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

von Genervt (Gast)


Lesenswert?

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.

von Christian (Gast)


Lesenswert?

Lieber Gernverter,

in der Deklaration habe ich die Variablen mit unsigned definiert.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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;

von Andreas R. (rebirama)


Lesenswert?

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...

von Christian (Gast)


Lesenswert?

danke Andreas funzt wunderbar:-)

jetzt zeigt er ein Bereich von 0 - 65535, gibt es eine möglichkeit eine 
achtstellige zahl anzeigen zulassen ?

von Oliver J. (skriptkiddy)


Lesenswert?

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.

von Christian (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.