volatile aus Int - Verarbeitung

Gast #1844981
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...


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

6

7

8

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

hier der Handler und die Deklarationen:
1
volatile uint16_t milli;
2
uint16_t geschw;
3
uint8_t _einer;
4
uint8_t _zehner;
5
uint8_t _hunderter;
6

7
ISR(TIMER1_COMPA_vect)
8
{
9
milli++;
10
}
11

12

13

14
oder liegts vielleicht doch an dem hier?
15

16

17
  switch (_hunderter)            //Die Hunderter werden ausgegeben:
18
      {
19
        case 0:
20
      zahl = null;
21
      case 1:
22
      zahl = eins;
23
      case 2:
24
      zahl = zwei;
25
      case 3:
26
      zahl = drei;
27
      case 4:
28
      zahl = vier;
29
      case 5:
30
      zahl = fuenf;
31
      case 6:
32
      zahl = sechs;
33
      case 7:
34
      zahl = sieben;
35
      case 8:
36
      zahl = acht;
37
      case 9:
38
      zahl = neun;
39
         }


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

>   .... 2/(milli/1000)  ....


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


> 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.
Gast #1845044
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
Gast #1845049
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.
:-)
Gast #1845079
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. ;-)
Gast #1847157
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.
#1847161
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?

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