mikrocontroller.net

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


Autor: Christian (Gast)
Datum:

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

Autor: Andreas R. (rebirama)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Christian (Gast)
Datum:
Angehängte Dateien:

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

Autor: Genervt (Gast)
Datum:

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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lieber Gernverter,

in der Deklaration habe ich die Variablen mit unsigned definiert.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmmmm....
Was wird da wohl passieren?
 volatile unsigned char Overflow   = 0;
 unsigned short Zeit_ti ;
:
:
   Zeit_ti = (Overflow*65536) + Endtime - Starttime;  


> Meine Vermutung ist das Zeit_ti von der TCNT1 beeinflusst wird.
Ja, du selbst willst das ja irgendwie:
ISR( TIMER1_OVF_vect )
{
  Overflow++;
}
:
:
       Zeit_ti = (Overflow*65536) + Endtime - Starttime;

Autor: Andreas R. (rebirama)
Datum:

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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke Andreas funzt wunderbar:-)

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

Autor: Oliver Ju. (skriptkiddy)
Datum:

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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so da bin ich wieder!!

jetzt hab ich nicht alle 65535 ein überlauf sondern bei jeden 2100 
schritt.
wie geht den das ??

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.