www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik volatile aus Int - Verarbeitung


Autor: Felix G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!
Wollte in einem AVR Atmega16 gerade einen 16Bit Integer (volatile) aus 
einem TimerCompareInterrupt in der Main verarbeiten, doch ich bekomm bei 
geschw immer 0...


TIMSK = 0x00;     //...Interrupt aus
geschw = 2/(milli/1000)*3.6;  //Berechung der Geschwindigkeit      _hunderter = geschw/100; 
_zehner = (geschw - _hunderter*100)/10;          
_einer = (geschw - _hunderter*100 - _zehner*10);




Der Timer:
 TCCR1B = (1<<WGM12); // CTC 
 TCCR1B |= (1<<CS10); // Prescaler 1
 OCR1A = 15999;       //jede millisek. -- (15999+1)/16000000

hier der Handler und die Deklarationen:
volatile uint16_t milli;
uint16_t geschw;
uint8_t _einer;
uint8_t _zehner;
uint8_t _hunderter;

ISR(TIMER1_COMPA_vect)
{
milli++;
}



oder liegts vielleicht doch an dem hier?


  switch (_hunderter)            //Die Hunderter werden ausgegeben:
      {
        case 0:
      zahl = null;
      case 1:
      zahl = eins;
      case 2:
      zahl = zwei;
      case 3:
      zahl = drei;
      case 4:
      zahl = vier;
      case 5:
      zahl = fuenf;
      case 6:
      zahl = sechs;
      case 7:
      zahl = sieben;
      case 8:
      zahl = acht;
      case 9:
      zahl = neun;
         }


kann mir bitte jemand sagen warum?
Danke im Vorraus,
Felix

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>   .... 2/(milli/1000)  ....


http://www.mikrocontroller.net/articles/FAQ#Datent...


> oder liegts vielleicht doch an dem hier?

Eigentlich liegt es daran, dass du dein Glück auf eigene Faust versuchst 
und kein C-Buch (wenigstens die ersten paar Kapitel) gelesen hast. Da 
wär das nämlich mit Sicherheit drinnen gestanden. Neben 100-erten 
anderen Dingen, über die du in nächster Zeit noch stolpern wirst.

Autor: Felix G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke!
Jetzt hab ich geschw und milli mal als double deklariert; als das nicht 
funktionierte alles als double und beim "switcher" wieder Integer draus 
gemacht ...nichts.(d.h. geschw = 0)
Der Compiler entscheidet also über Gleitkomma.
Dann müsste ja (wenn min. ein Operand double) auch das Ergebnis double 
sein.
Die errechneten Stellen sollen auf einem 7Segment ausgegeben werden, 
welches aber nur 999 anzeigt.
Ein kleines Codeschnipsel könnte mir vielleicht auf die Sprünge helfen.
Grüße,
Felix

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Felix G. schrieb:
> Jetzt hab ich geschw und milli mal als double deklariert; als das nicht
> funktionierte alles als double und beim "switcher" wieder Integer draus
> gemacht ...nichts.(d.h. geschw = 0)

Symptombekämpfung, das Problem bleibt.

> Der Compiler entscheidet also über Gleitkomma.

Nein, das entscheidet der Programmierer über die verwendeten Datentypen.

> Dann müsste ja (wenn min. ein Operand double) auch das Ergebnis double
> sein.

Das Ergebnis schon.
Allerdings muss das ERgebnis dann auch dementsprechend abgespeichert 
werden (als double).

> Die errechneten Stellen sollen auf einem 7Segment ausgegeben werden,
> welches aber nur 999 anzeigt.

Sag doch einfach 3 Stellen.

> Ein kleines Codeschnipsel könnte mir vielleicht auf die Sprünge helfen.

Findest du in jedem C-Buch.
:-)

Autor: ... ... ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gleitkomma auf einem AVR lässt du mal lieber sein, 'n kleinen Brocken 
habe ich für dich --> Festkommaarithmetik <--.
Aber pauschal sollte es mit einem C-Buch beginnen und vor allem solltest 
du C auf einem PC lernen. Geht viel einfacher, denn da gibt es printf 
und Co...

Felix G. schrieb:
> doch ich bekomm bei
> geschw immer 0...
Wahrscheinlich stimmt die Geschwindigkeit sogar, oder bewegt der µC 
sich. ;-)

Autor: Felix G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls einer danach sucht...
Problem gefunden:
geschw muss auch volatile sein

Dann tuts genau was es soll:
Die Geschwindgkeit berechnen (ohne Nachkomma) und dann die 3 Stellen als 
8bit integer.
36,9 km/h z.B. wird halt abgerundet.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Felix G. schrieb:
> Falls einer danach sucht...
> Problem gefunden:
> geschw muss auch volatile sein

In dem was du da oben gepostet hast erst mal nicht.

Daher:
keine Programmfragmente posten, sondern komplette Programme.
Es sind immer die Details, die einem das Leben schwer machen. Und wenn 
du die Details nicht kennst (sonst hättest du den Fehler ja genz leicht 
selbst gefunden), woher willst du dann wissen, welche Programmteile beim 
Posten irrelevant sind?

Autor: ... ... ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Felix G. schrieb:
> Die Geschwindgkeit berechnen (ohne Nachkomma) und dann die 3 Stellen als
> 8bit integer.
> 36,9 km/h z.B. wird halt abgerundet.
Vermutlich geschnitten nicht gerundet.
36,9 also 369 als 8 Bit Integer?

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.