Wie zählt der TCNT1 nicht von 0 - 65535

Gast #1869115
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 ?
#1869129
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
Gast #1869253
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
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #1869291
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;
#1869302
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren