Forum: Mikrocontroller und Digitale Elektronik volatile aus Int - Verarbeitung


von Felix G. (Gast)


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

von Karl H. (kbuchegg)


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.

von Felix G. (Gast)


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

von Floh (Gast)


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

von ... ... ... (Gast)


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

von Felix G. (Gast)


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.

von Karl H. (kbuchegg)


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?

von ... ... ... (Gast)


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?

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.